在PostGIS中,如何查找多边形内的所有点?

Sha*_*Dar 17 postgis polygon

我使用带有GIS扩展的PostgreSQL来存储地图数据,以及OpenLayers,GeoServer等.给定一个多边形,例如邻域,我需要找到存储在某些表格中的所有LAT/LONG点(例如交通信号灯,餐馆)在多边形内.或者给定一组多边形,我想每个多边形内找到一组点的(如GROUP BY查询,而然后再遍历每个多边形).

这些功能是我需要编程的,还是可用的功能(作为扩展SQL)?请详细说明.

另外,对于我所做的简单2D数据,我实际上需要GIS扩展(GPL许可是限制)还是PostgreSQL就足够了?

谢谢!

Vin*_*vic 12

在PostGIS中,您可以使用边界框运算符来查找候选项,这在使用GiST索引时非常有效.然后,如果需要严格匹配,请使用contains运算符.

就像是

SELECT 
     points,neighborhood_name from points_table,neighborhood 
WHERE 
     neighborhood_poly && points /* Uses GiST index with the polygon's bounding box */
AND 
    ST_Contains(neighborhood_poly,points); /* Uses exact matching */
Run Code Online (Sandbox Code Playgroud)

关于是否需要,取决于您的要求.为了实现上述目的,您当然需要安装PostGIS和GEOS.但是,如果边界框匹配足够,您可以在不需要PostGIS的SQL中编写代码.

如果需要完全匹配,则包含算法是公开可用的,但要有效地实现它们需要在库中实现它,然后从SQL调用(就像GEOS一样).

  • 现在,“ neighborhood_poly && points”检查是多余的。[`ST_Contains`](http://postgis.net/docs/ST_Contains.html)现在自动使用索引。我不确定确切会更改哪个版本,但我认为它是从[1.3.0](https://postgis.net/docs/release_notes.html#idm43912)开始的(“已添加对关系函数的内联索引支持(除了ST_Disjoint)“)。 (2认同)