Как выбрать многоугольник из таблицы по широте и долготе (Postgis) - PullRequest
0 голосов
/ 15 мая 2019

Есть таблица многоугольников.Мне нужно найти одну запись из таблицы с некоторой точкой (широта / долгота) внутри области.

Это пример координат: 149.14668176, -35.32202098

Не могли бы вы помочь мне написать строку выбора, чтобы найти область, содержащую мою точку?

 SELECT PostGIS_full_version();
                                                                                             postgis_full_version                                                                                               
 POSTGIS="2.5.2 r17328" [EXTENSION] PGSQL="96" GEOS="3.5.1-CAPI-1.9.1 r4246" PROJ="Rel. 4.9.3, 15 August 2016" GDAL="GDAL 2.1.2, released 2016/10/24" LIBXML="2.9.4" LIBJSON="0.12.1" LIBPROTOBUF="1.2.1" RASTER

Что-то подобное:

SELECT id,name FROM area_polygon WHERE ST_Within('149.14668176, -35.32202098', geog);
bounds=# \d bounds.area_polygon;
id           | integer                 |           | not null |
geog         | geography(Polygon,4283) |           |          |
name         | text                    |           |          |

Я ожидал:

  id  | name
------+--------
    1 | Alabama

1 Ответ

2 голосов
/ 15 мая 2019

st_within поддерживает только типы геометрии, поэтому вы получаете ошибку в предыдущем ответе, потому что у вас есть тип столбца географии.

Вы можете привести к геометрии:

SELECT id,name 
FROM area_polygon 
WHERE ST_Within(ST_SetSRID(ST_POINT(149.14668176,-35.32202098),4283), geog::geometry);

Или вы можете использовать st_dwithin , с расстоянием, установленным на ноль:

SELECT id,name 
    FROM area_polygon 
    WHERE ST_DWithin(ST_SetSRID(ST_POINT(149.14668176,-35.32202098),4283)::geography, geog,0);

Обратите внимание, что порядок координат должен быть lon / lat (а не lat / lon), и я предполагаю, что эти координаты находятся в вашем SRID 4283. Они должны либо совпадать с SRID geog, либо быть преобразованы в него ...

См. здесь для списка функций, которые поддерживают какие аргументы.

...