如何在postgis中找到多边形内的所有点?

时间:2017-09-19 10:54:28

标签: postgresql gis postgis

我将位置存储在location_table(point_location geometry)中,现在我在谷歌地图上绘制一个多边形并将该多边形(几何)传递给后端,我想找到该多边形内的所有位置。

SELECT POINT_LOCATION 
FROM LOCATIONS_TABLW 
WHERE ST_Contains(GeomFromEWKT(?), POINT_LOCATION);

当我将多边形从谷歌地图传递到后端时,这给了我随机的结果。它没有给我所有正好在多边形内的点。它给了我甚至在多边形之外的点。

在postgis中准确找到多边形内所有点的正确方法是什么(包括边界情况)

更新: 我们尝试使用st_intersects()它也没有用。enter image description here

更新

请查看以下查询

SRID = 4326; POLYGON(( - 103.30549637500008 20.852735681153252,-103.08103481249998 20.612974162085475,-101.6261045 20.537532106266806,-99.83567868749998 20.395877027062447,-99.80306537500002 22.0572706994358,-99.64994812500004 28.918636198451633,-121.1212769375 8.69559423007209,-103.30549637500008 20.852735681153252)) SRID = 4326;要点(-103.496956 20.722446) SRID = 4326;要点(-103.4955 20.723544)

选择ST_Intersects(GeomFromEWKT(' SRID = 4326; POINT(-103.496956 20.722446)'),GeomFromEWKT(' SRID = 4326; POLYGON(( - 103.30549637500008 20.852735681153252,-10) 3.08103481249998 20.612974162085475,-101.6261045 20.537532106266806,-99.83567868749998 20.395877027062447,-99.80306537500002 22.0572706994358,-99.64994812500004 28.918 636198451633,-121.1212769375 8.69559423007209,-103.30549637500008 20.852735681153252))')); 这应该返回False,但它返回true。

1 个答案:

答案 0 :(得分:0)

您可以使用

SELECT POINT_LOCATION 
FROM LOCATIONS_TABLE 
WHERE ST_Contains(ST_GEOMFROMTEXT('POLYGON((P1.X P1.Y, P2.X P2.Y, ...))'), LOCATIONS_TABLE.POINT_LOCATION);

注意:必须关闭多边形(这意味着最后一个坐标==第一个坐标)。第二个参数POINT_LOCATION必须是点表中的几何列。

更新: 我试图在我的pg数据库中重播你的步骤。我创建了2个表,LOCATIONS_TABLE(id,geom)和POLYGON(id,geom)。在那之后,我用2分填充了LOCATIONS_TABLE

SRID=4326;POINT(-103.4955 20.723544)
SRID=4326;POINT(-103.496956 20.722446)

之后我将多边形插入POLYGON表

SRID=4326;POLYGON((-103.305496375 20.8527356811533,-103.0810348125 20.6129741620855,-101.6261045 20.5375321062668,-99.8356786875 20.3958770270624,-99.803065375 22.0572706994358,-99.649948125 28.9186361984516,-121.1212769375 8.69559423007209,-103.305496375  (...)

我想象了qgis的情况,见下图: Sample

如您所见,2个点位于多边形内。所以我在多边形外面手动创建了一个点。之后,您可以使用以下sql查询,以查看这些点是否在多边形内:

SELECT ST_Contains(polygon.geom, point.geom) 
FROM public."LOCATIONS_TABLE" point, public."POLYGON" polygon

它返回t为2点内,false为第3点。