如何按纬度和经度(Postgis)从表中选择多边形

Posted

技术标签:

【中文标题】如何按纬度和经度(Postgis)从表中选择多边形【英文标题】:How to select polygon from table by Latitude and Longitude (Postgis) 【发布时间】:2019-05-15 10:25:58 【问题描述】:

有多边形表。我需要从表中找到一条记录,该记录在区域内有一些点(纬度/经度)。

坐标示例: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】:

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 中。它们必须与 geog SRID 匹配或转换为它...

有关哪些函数支持哪些参数的列表,请参阅 here。

【讨论】:

以上是关于如何按纬度和经度(Postgis)从表中选择多边形的主要内容,如果未能解决你的问题,请参考以下文章

将纬度替换为经度

纬度和经度的数据类型是啥?

如何使用密码作为输入查找纬度和经度列表

通过R中的sf将经度和纬度序列转换为多边形

从最小和最大纬度/经度创建多边形(矩形)

从选定的特征 QGIS 中选择表(postgis)中的行