PostGIS ST_Buffer Radiusヘルプ


9

特定のポイントから半径5マイル以内にあるすべてのポイントを検索しようとしています。次のようなクエリがあります。

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

?5マイルを取得するために(半径)の代わりに何を配置したかわかりません。すべてがEPSG 4326にあり、PostGISのドキュメントによれば(私の知る限り)、半径はメートル単位である必要があります。12,070.0m(約5マイル)に置くと、全国の半分の地点で試合が行われます。誰かが私が欠けているものを知っていますか?


4326はdd(10進度)です。latlonとして投影すると、12070はかなり大きな領域(半径)です。
Brad Nesom、

1
正しくない-12 070メートル= 7.49995029マイル、5マイルは8046.72メートル(?= 8046.72)-データの地理またはジオメトリですか?
Mapperz

回答:


14

データが投影されないため-それは回転楕円体上のポイントです-直線距離は意味がありません。赤道の5マイルは、北極圏の5マイルよりもはるかに小さい角度です。しかし、幸運にもPostGIS(> = 1.5)はあなたが探している答えを持っています:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

それはgeographyこのようなもののために設計されたタイプを持っています。ジオメトリに似ていますが、EPSG:4326のみを使用しており、EPSG:4326を操作する関数ははるかに少なくなっています。

上記のサンプルでは、関心のあるポイントでST_GeogFromText()ST_GeographyFromText()もあり、違いがあるかどうかはわかりません)を呼び出しました( SRIDパラメータが通常のWKTで機能する可能性があるため)冗長)、latlon列をgeographyタイプにキャストします。これらの多くを実行している場合は、テーブルにgeography列を作成し、キャスト全体をスキップする方が効率的です。最後に、ST_DWithin()は地理パラメータを受け取ることができ、直線距離で正しいことを行います。


私は助けに感謝します。私はまだPostGISにかなり慣れていません。
Nik

4

代わりにST_DWithin関数が必要な場合があります。st_buffer docのメモを参照してください。
ST_Buffer

人々はしばしばこの機能を使って半径検索をしようとする間違いを犯します。半径検索へのバッファーの作成は遅く、無意味です。代わりにST_DWithinを使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.