座標によるタイムゾーン [重複]
質問
この質問にはすでに答えがあります:
タイトルから推測できるように、一組の座標に基づいてタイム ゾーン (または単に UTC オフセット) を見つける必要があります。さまざまなソリューションを探しており、いくつかの Web サービスがありますが、アプリケーションにオフラインでアクセスできる必要があります。タイムゾーンは完全に経度に基づいていないため、それほど簡単ではないようです...
世界のすべての国とそのタイムゾーンを含む ESRI シェープファイルをクエリしようと考えましたが、少し複雑なようです。それが解決策である場合、この機能を提供する .NET ライブラリをご存知ですか?
解決
を参照してください:緯度とを使用して位置からタイムゾーンを取得する方法経度座標の
他のヒント
私は、クライアントアプリケーションでこれを解決しました。技術は世界の色分けされた円筒状のマップを作成することで、各時間帯は、固有の色を有します。 LAT-ロンスは、座標をピクチャに変換され、座標の色は、その色のタイムゾーンへの相互参照。読み出された
これ短いのexplainationは、私はまったく同じものではありませんが、それは全体のアイデアを取得します。私は実際にカップルの辞書を埋め、そこから検索を行いました。 (私は私のマップを処理し、バイナリデータにそれを回した後)最初の演出は、投入するために、リソースファイルの2Mを取りました。 (赤道に近い緯度のための)理論的な最大誤差は+/-およそ15マイルされている必要があります。残念ながら、私の出発マップの精度はより+/- 100マイルのようでした。
だから私は、プロジェクトをやり直しています。私は今クランチの両方より正確で、より高いREZマップを作成し、そこに数日してきました。カップル日以上、それが行われる必要があります。私は唯一の「間抜けな領域を」リソースと数学(世界のほとんどは数学的に経度から導出することができる)を直接計算することができ、世界の90%を計算することを選択しない限り、リソースファイルは20Mの周りになります。わからない多くのリソースファイルは20Mが、いくつかのかもしれないだったことを気にします。いずれにしても、いくつかの興味があるように思われる場合、私はここでそれを実行するために必要なコードとリソースファイル1のパブリックコードサイトの一つを投稿しようとするでしょう。全く興味がないように思われる場合、私は気にしません。
ただ、再反復ビットに、あなたのアプリケーションに必要なコードはわずか数行ですが、リソースファイルが(/それを縮小O wが、私の新しいものが22Mを実行している)大きいです。また、高速である(最初の演出は、100M /秒走りました)。これは、ファイルのロードを必要としませんし、それは少し時間がかかります。 2Mのバージョンが目立った遅延がなかったが、22M(まだありませんが)可能性があります。
TZ のデータベースを確認してください。私はそれが(市、国、ESTなどのように)タイムゾーンに名前を関連付け知っています。しかし、私はどこかに座標の拡張機能があると考えています。
私はテーブルをエクスポートしようとしましたが、それは...しかし、それは難しいが、とにかくやっていることはなかったテキストにgeometry
の種類をエクスポートすることができていないようです..あなたは、マニホールドは、数年前に生産さシェープファイルをGoogleに必要これが世界のすべてのcontriesをマッピングし、そのタイムゾーンが...そして、あなたには、いくつかのプログラムを使用してSQL Server 2008にそのデータをエクスポートする必要があります..私はマニホールドを使用し、私が使用してデータを照会すると...(上記のEnterprise Editionまたはを使用することを忘れないでください)次のストアドプロシージャ:
USE [MyDb]
GO
/****** Object: StoredProcedure [dbo].[GetTimeZone] Script Date: 11/18/2009 21:23:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetTimeZone]
@Latitude float,
@Longitude float
AS
/* SET NOCOUNT ON */
DECLARE @g geometry
/* Validation */
IF @Latitude > 90 OR @Latitude < -90 OR @Longitude > 180 OR @Longitude < -180
RAISERROR('Latitude or longitude out of range', 16, 1)
IF @Latitude IS NULL OR @Longitude IS NULL
RAISERROR('Latitude or longitude cannot be null', 16, 1)
SET @g = geometry::Point(@Longitude, @Latitude, 4326);
IF EXISTS(SELECT * From TimeZones WHERE Shape.STContains(@g) = 1)
/* Point exists on map, get the info */
SELECT Name, LocalSumme, Offset, AreaI FROM TimeZones WHERE Shape.STContains(@g) = 1
ELSE
/* Point is an international water */
IF(@Longitude >= 0)
SELECT NULL AS Name, NULL AS LocalSumme, FLOOR((@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI
ELSE
SELECT NULL AS Name, NULL AS LocalSumme, -FLOOR((-@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI
全国の海域がマップされていないため、シェープファイルに問題があります。私は多分g.STBuffer @使用してのけれども()この問題に対処する..
ソリューションは、新しい空間データ型を使用してSQL Server 2008にESRIシェープファイルをエクスポートすることでした。
誰もがよりよい解決策を持っている場合は、投稿してみましょう!