4

nettopologysuite ( JTS Topology Suiteのポート)を使用しています。SRTtree 実装を使用して、タイムゾーンのリストと対応する座標を格納しています (この提案に基づいています)。geonames から都市のリストを取得し、都市のタイムゾーンと座標を取り出して、それらを STRtree に保存しています。私が抱えている問題は、この実装が「最も近い」関数を提供しないことです。クエリを実行するには、開始点と円周を指定する必要があります。現在、いくつかの結果が見つかるまでループ内で円周を .1 ずつ増やしてから、最初の結果を取得します。これを行うより良い方法はありますか?

これが私がやっていることです:

    public static SRTtree Cities { get; set; }

    public static string GetTimezone(double lat, double lng)
    {
        var envelope = new Envelope(new Coordinate(lat, lng));

        IList results;

        do
        {
            envelope.ExpandBy(.1);
            results = Cities.Query(envelope);
        } while (results.Count == 0);

        return results[0] as string;
    }
4

2 に答える 2

2

JTS 1.13 は、この操作を実行するためのSTRTree.nearestNeighbourメソッドを提供します。それがNTSに移植されているかどうかはわかりませんが、移植されていない場合はリクエストしてください。

于 2013-04-22T19:28:02.077 に答える
0

実行する必要があるクエリが「最も近い場所を取得する」だけである場合、R ツリーの使用は最適な選択ではない可能性があります。私は2つの選択肢を考えることができました:

  1. Harvesine 式を使用してすべての場所までの距離を計算し、最小距離を見つけます。座標があまりない場合、これが最適なソリューションになる可能性があります。詳しくは「近接検索」をご覧ください。
  2. KD-Treeなど、最も近い座標を検索できるデータ構造を使用します。NetTopologySuite での KD ツリーの実装は、ユース ケースには適していないことに注意してください。
于 2013-02-27T10:59:59.160 に答える