PostGIS ST_Buffer Radius Help


9

Я намагаюся знайти всі точки в радіусі п’яти миль від даної точки. У мене такий запит:

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

Я не можу зрозуміти, що я поставив замість ?(радіус), щоб отримати п'ять миль. Все є в EPSG 4326, і згідно з документацією PostGIS (якнайкраще я можу сказати), мій радіус повинен бути в метрах. Якщо я вкладу 12,070,0 м (приблизно 5 миль), я отримаю сірники на півдорозі по всій країні. Хтось знає, чого я пропускаю?


4326 - дд (десяткові градуси). 12070 - це досить велика площа (радіус), коли він проектується як латлон.
Бред Несом

1
неправильно - 12 070 метрів = 7,49995029 миль, тому 5 миль - це 8046,72 метри, так (? = 8046,72) - це ваша географія даних або геометрія?
Mapperz

Відповіді:


14

Оскільки ваші дані не проектуються - це точки на сфероїді - лінійні відстані на зразок не мають сенсу. П’ять миль на екваторі набагато менший кут, ніж 5 миль по полярному колу. Але на щастя, PostGIS (> = 1,5) має відповідь, яку ви шукаєте:

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

Він має geographyтип, призначений саме для такого роду речей. Він схожий на геометрію, але він завжди використовує EPSG: 4326, і функцій, які працюють з ним, набагато менше.

У наведеному вище прикладі я назвав ST_GeogFromText () (Є також ST_GeographyFromText () , і я не впевнений, чи є різниця) на цікаву точку (це може працювати з регулярним WKT, оскільки параметр SRID є надлишковим) і передати колонку латлон типу географії. Якщо ви робите багато з них, може бути ефективніше створити географічний стовпець у таблиці та повністю пропустити групу. Нарешті, ST_DWithin () може приймати параметри географії, і це робить правильно з лінійними відстанями.


Я ціную допомогу. Я все ще досить новачок у PostGIS.
Нік

4

можливо, замість цього ви хочете функцію ST_DWithin. див. примітку в документі st_buffer.
ST_Buffer

Люди часто роблять помилку, використовуючи цю функцію, намагаючись зробити радіус пошуку. Створення буфера для пошуку в радіусі відбувається повільно і безглуздо. Використовуйте замість ST_DWithin .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.