0

Foursquare のようなサービスで、チェックインの場所を保存したいとします。これを緯度経度または住所/地域名 (123 Portmill St, NY 12345 または SoHo, NY など) として保存する必要があります。最初のケースでは、ユーザーに住所を入力させると、サービスが緯度経度情報を検索して保存します。これにより、私のサービスはポリゴン境界内のチェックインを検索できます。

2 番目のケースでは、場所をバケットとして保存し、(緯度、経度) = (100000.1,100000.1)、(100000.2,100000.2) などの冗長な情報を避けることができます。これらは互いに非常に近く、同じ場所と見なすことさえできます。

4

2 に答える 2

0

あなたがやろうとしていることのニュアンスを完全に理解しているとは思いませんが、コンピューターは通常、人間が読めるテキスト情報よりも、緯度や経度などの数値の方がうまく機能します。たとえば、テキストアドレスの場合、余分なスペースを処理したり、短い郵便番号ではなく ZIP+4 コードなどを処理したりするなど、一貫性を確保するにはどうすればよいでしょうか。

緯度と経度がテキストよりも優れているかもしれないというのは、私の本能だと思います。私が住んでいる英国では、町や都市に同じ名前の 2 つの道路がある例がたくさんあるので、緯度/経度の代わりにテキストを保存すると、落とし穴が増える可能性が高いと思います。

于 2013-05-14T22:53:40.117 に答える
0

これはどう。データベースに 3 つの列、つまり (緯度、経度、TextLocation) を格納しますが、テーブルのキーと見なされるのは (緯度、経度) のペアです。TextLocation は、指定された (緯度、経度) に対応するテキストをジオコーダーが要求されたときのリバース ジオコーダーからの最後の既知の結果です。

新しい位置 (New_Latitude、New_Longitude) が到着したら、データベースを検索して、データベース内の最も近い行をすべて見つけます。(New_Latitude, New_Longitude) から (Latitude, Longitude) までの距離を計算するには、次のコードを使用します

float LatDiff = New_Latitude - Latitude;
float LongDiff = New_Longitude - Longitude;
float CosNewLat = Math.cos(New_Latitude);
float ConversionFac = 6371000 * Math.PI / 180; // 6371000 is earth radius in metres
float Dist_metres = ConversionFac * Math.sqrt(LatDiff*LatDiff + LongDiff*LongDiff*CosNewLat*CosNewLat);

次に、(New_Latitude、New_Longitude) に最も近いポイントごとに、リバース ジオコーディングを使用してデータベースの TextLocation を更新します。新しい位置が現在のリバース ジオコーディングと一致しない既存の場所があれば、それをデータベースに追加します。

ここでの私の考えの一部は、テキストの列を含む 3 つの列を保存したとしても、データベースは最新のストレージ容量に比べてまだ小さいということです。

于 2013-05-17T11:26:48.803 に答える