8

タイトルが示唆しているように、座標のペアに基づいてタイム ゾーン (または、UTC オフセットのみ) を見つける必要があります。私はさまざまなソリューションを探していました。そこにはいくつかの Web サービスがありますが、アプリケーションにオフラインでアクセスできるようにする必要があります。タイムゾーンは経度に完全に基づいているわけではないため、それほど簡単ではないようです...

世界のすべての国とそのタイムゾーンを含む ESRI シェープファイルをクエリすることについて考えましたが、ちょっと複雑に思えます。それが解決策である場合、この機能を提供する .NET ライブラリを知っていますか?

4

5 に答える 5

6

クライアントアプリケーションでこれを解決しました。その技法は、世界の色分けされた円筒形の地図を作成することでした。各タイム ゾーンには固有の色があります。Lat-Lons は画像座標に変換され、座標の色が読み取られ、その色のタイムゾーンに相互参照されます。

この短い説明は、私が行ったものとまったく同じではありませんが、アイデアは伝わります。私は実際にいくつかの辞書を作成し、それらから検索を行いました。最初のレンディションでは、(マップを処理してバイナリ データに変換した後) 作成するのに 2M のリソース ファイルが必要でした。理論上の最大誤差 (赤道付近の緯度の場合) は、+/- 約 15 マイルである必要があります。残念ながら、最初のマップの精度は +/- 100 マイル程度でした。

だから私はプロジェクトをやり直しています。私は数日間、より正確で高解像度のマップを作成してクランチしました。あと数日で完了です。リソース ファイルは、「グーフィー エリア」のみをリソースとして選択し、直接計算できる世界の 90% を数学的に計算しない限り、約 20M になります (世界のほとんどは、経度から数学的に導き出すことができます)。リソース ファイルが 20M であることを気にする人はあまりいないでしょうが、気になる人もいるでしょう。いずれにせよ、興味があれば、実行に必要なコードをここに投稿し、リソース ファイルを公開コード サイトの 1 つに投稿しようと思います。興味がないようなら、私は気にしません。

少し繰り返しますが、アプリに必要なコードは数行だけですが、リソース ファイルは大きいです (縮小しないと、私の新しいファイルは 22M 実行されます)。また、高速です (最初のレンディションは 100M/秒で実行されました)。ファイルの読み込みが必要で、少し時間がかかります。2M バージョンには目立った遅延はありませんでしたが、22M には可能性があります (まだありません)。

于 2012-11-15T23:10:23.883 に答える
2

tzデータベースを確認してください。名前がタイムゾーン(都市、国、ESTなど)に関連付けられていることは知っています。しかし、どこかに座標の拡張があると思います。

于 2009-11-09T22:30:47.727 に答える
1

テーブルをエクスポートしようとしましたが、geometryタイプをテキストにエクスポートすることはできないようです..しかし、とにかくそれを行うのはそれほど難しくありませんでした..数年前にManifoldが作成したシェープファイルをグーグルする必要があります。世界の国々とそのタイムゾーン..次に、何らかのプログラムを使用してそのデータを SQL Server 2008 にエクスポートする必要があります..私は Manifold を使用しました (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() を使用するかもしれません..

于 2009-11-18T20:36:25.617 に答える
0

解決策は、新しい空間データ型を使用して ESRI シェープファイルを SQL Server 2008 にエクスポートすることでした。

誰かがより良い解決策を持っている場合は、気軽に投稿してください!

于 2009-11-11T15:22:10.393 に答える