0

はい、特定の座標が座標の別の半径内にあるかどうかを確認する方法を知りたいです。ただし、緯度、経度、半径はデータベースに保存されており、確認するのは指定された座標のみであるため、これは少し異なる場合があります。

データベーステーブル

name    |   lat         |    long        |   radius(m) |
loc1    |   15.3333     |    120.312     |    100      |
loc2    |   120.321     |    -15.5436    |    123      |

16 lat, 120 long この座標がloc1の半径100mに収まるかどうかを確認する方法の座標があります。そのテーブルには、異なる座標および/または異なる半径を持つデータがたくさんあると仮定しています。特にPostgreSQLを使用してこれを知りたいのですが、MYSQLの良いスタートになるかもしれません

どうもありがとう。

4

1 に答える 1

1

PostGISを使用すると、地理的な長さ/緯度のデータで平面メトリックバッファー(または「半径」)距離を使用して、地理タイプでST_DWithin関数を使用できます。このタイプのクエリはPostGISで一般的であるため、少しひねりを加える必要はありません。

たとえば、テーブルを作成します(PostGIS 2.0 typmod構文を使用します。PostGIS1.5の場合、地理列を作成するには他の関数を使用する必要があります)。

CREATE TABLE db_table
(
  gid serial primary key,
  name character varying(100),
  geog geography(Point,4326),
  radius_m numeric
);

CREATE INDEX db_table_idx ON db_table USING gist (geog);

INSERT INTO db_table(name, geog, radius_m)
VALUES
 ('loc1', ST_MakePoint( 20.312, 15.333), 100),
 ('loc2', ST_MakePoint(-15.543, 20.312), 123);

db_table「16lat、120 long」のポイントから100以内のすべての行を見つけるための質問の場合:

SELECT *
FROM db_table
WHERE ST_DWithin(geog, ST_MakePoint(120, 16), radius_m + 100);

別の例として、someother_table地理列がある場合は、次の2つに対して地理空間クエリを実行できます。

SELECT a.name, b.other_attr, ST_Distance(a.geog, b.geog) AS distance_m
FROM db_table a
JOIN someother_table b ON ST_DWithin(a.geog, b.geog, a.raidus_m + 100)
ORDER BY ST_Distance(a.geog, b.geog);

最後に、MySQLには座標を緯度/経度からメートル単位の距離に変換する機能がないため、MySQLではこれを実行できないと確信しています。

于 2012-06-17T22:04:41.353 に答える