Я пытаюсь найти все точки в радиусе пяти миль от данной точки. У меня есть такой запрос:
SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)
Я не могу понять, что я поставил вместо ?
радиуса, чтобы получить пять миль. Все в EPSG 4326, и согласно документации PostGIS (насколько я могу судить), мой радиус должен быть в метрах. Если я наберу 12 070,0 м (примерно 5 миль), я получу спички по всей стране. Кто-нибудь знает, чего мне не хватает?
Ответы:
Поскольку ваши данные не проецируются - это точки на сфероиде - линейные расстояния не имеют смысла. Пять миль на экваторе - намного меньший угол, чем 5 миль на полярном круге. Но, к счастью, PostGIS (> = 1.5) имеет ответ, который вы ищете:
У него есть
geography
тип, который предназначен именно для такого рода вещей. Он похож на геометрию, но в нем всегда используется EPSG: 4326, и с ним работает гораздо меньше функций.В приведенном выше примере я вызвал ST_GeogFromText () (есть также ST_GeographyFromText () , и я не уверен, есть ли разница) в точке интереса (это может работать с обычным WKT, потому что параметр SRID избыточный), и приведите столбец latlon к типу географии. Если вы делаете много из них, может быть более эффективно создать столбец географии в вашей таблице и полностью пропустить приведение. Наконец, ST_DWithin () может принимать параметры географии, и это правильно делает с линейными расстояниями.
источник
возможно, вам нужна функция ST_DWithin. см. примечание в документе st_buffer.
ST_Buffer
источник