2011-05-31 33 views
0

現在、データベース内の各店舗間の距離を「自宅」の場所まで計算するデータベースクエリがあります。この式を使って飛行距離を計算しています。緯度/経度の数学的質問(2つの座標間の距離)

http://www.movable-type.co.uk/scripts/latlong.html

その後、私はそれらを発注し、それらを表示しています。私は緯度経度がある範囲内にある店舗を検索するだけです。

たとえば、データベース内の各店舗間の距離(30000以上)を計算する代わりに、特定の範囲内の緯度/経度を持つグループをグループ化し、それらの間の距離を計算します。

今、私は実際の境界を計算する方法を見つけようとしています。距離は5km以下でなければなりません。したがって、私は5を100で割って、その量で緯度と経度を上限にします。

SELECT storeid, storedescription, address, city, storebannerdescription, lat, lon, 
     ROUND (gc_dist (lat, lon, 43.758152, -79.746639), 1) AS distance 
     FROM storelatlon 
     WHERE ((lat-43.758152) < 0.05 AND (lat -43.758152) > -0.05) AND ((lon-(-79.746639)) < 0.05 AND (lon-(-79.746639)) > -0.05) 
     ORDER BY Distance 
+6

あなたの質問はありますか? –

+3

私はあなたが何を求めているのかは分かりませんが、角度の測度を減算しても距離については何も教えてくれないことに注意します。 –

+0

何が問題なのですか?私はそれが「これは有効か良い実装ですか?」と想定しています。また、どのデータベースを使用していますか?一部のデータベースでは、緯度/経度の計算(Oracle Locatorなど)がサポートされていますが、これは必ずしも無料ではありません(Oracle Spatialはそうではなく、行がLocatorで終わりSpatialで始まる場所を知るのが難しい場合があります)。他のデータベースも、MySQLを含む基本的なサポートを提供します。 – pickypg

答えて

1

この方法は仕事ができる、しかし、あなたがlatituteに上がるように、あなたが与えられた距離でより多くの経度交差するので、広くあなたの店舗があり、分散方法に応じて、あなたはあなたの境界ビットを洗練する必要があるかもしれません。すべての緯度で0.05度までフィルタリングするだけで、あまりにも多くのポイントまたは少なすぎるポイントが得られるかもしれません。

0

gc_distの使用に基づいてPostgreSQLを使用していることを前提としています。 PostGISがインストールされている限り、組み込み機能を使用して必要なロジックを実行できます。

あなたはこのためにあなたのテーブルを準備する必要があります。

まず、PostGISのポイントとしてあなたの場所を格納します。地理的な計算にWGS-84を使うことをお勧めします。あなたがそれを実行した後、あなたはST_Bufferあなたが長い中(-79.746639、43.758152)のための隣人を見つけたいの中心点をラップST_ContainsST_Bufferを使用して、ご希望の場所から任意の距離内のすべての点について

問い合わせることができます/緯度順。

これはPostgreSQLを使ったことが一度もありませんが、私はこれをOracleで行っています。 PostgreSQLの設定はOracleの場合と同じです:

A.幾何ベースの列を作成することをデータベースに伝えます。 Found syntax here

上記の4326は、WGS-84を示す定数「SRID」です。

B.インデックスを列に追加します。 Found syntax here(このページはと非常に役に立ちますが役に立ちます)。

CREATE INDEX desired_index_name 
ON table_name 
USING gist(desired_column_name); 

C.データを追加します。

INSERT INTO table_name (desired_column_name) 
VALUES('SRID=4326;POINT(-79.746639 43.758152)'); 

(上記の文字列は、他の例に基づいてST_GeomFromTextに含まれる必要がある場合、私は好奇心)

または(I found here

INSERT INTO table_name (desired_column_name) 
VALUES (ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326)); 

注:私はそれは(X、Yだと仮定)、これは経度と緯度の順序を意味します。

D.データを照会します。

SELECT * FROM table_name 
WHERE 
    ST_Contains(
     ST_Buffer(
      ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326), 
      distance_probably_in_meters), 
     desired_column_name); 
関連する問題