postgis中的缓冲区圈选查询研究

本文探讨了在PostGIS中如何进行空间查询,特别是利用缓冲区圈选特定范围内点的数量。通过实例展示了使用`ST_DWithin`、`ST_Within`和`ST_Buffer`函数的不同查询方式,并讨论了利用空间索引提高查询效率的方法,包括创建gist空间索引和函数索引以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司部分新零售等商业咨询类项目中有大量空间查询的需求,便利用 postgresql + postgis 方案构建空间数据库,利用postgis强大的空间查询性能。

现需求为一个点一定范围内的所包含的poi数目,圈选出来后,在此基础上进行分类、统计、分析、展示,广泛应用于公司的商业咨询项目中。

例如:找出经纬度(116.41 39.91)点1000m内的某poi数量。

  1. 使用&&:
    A && B: 当二维A范围覆盖二维B范围时,返回真。但这里注意:这个范围是索引范围,我们知道空间索引索引的是多边形bounding box,这里使用&&返回的缓冲区圆范围的多边形了。如下图所示,本应返回圆形区域的点,却返回了它extent的矩形范围的点。
select name from beijingpoi
where ST_Transform (geom, 32650) && ST_Buffer(ST_Transform(ST_GeomFromText('POINT(116.41 39.91)', 4326), 32650), 1000)

本应返回圆形区域的点,却返回了它extent的矩形范围的点

但是,马上想到,其实在多一个选择条件,在这个矩形里的点在做一次过滤就行了,就有了如下sql:

select name from beijingpoi
where ST_Transform (geom, 32650) && ST_Buffer(ST_Transform(ST_GeomFromText('POINT(116.41 39.91)', 4326), 32650), 1000)
and st_within(ST_Transform (geom, 32650), ST_Buffer(ST_Transform(ST_GeomFromText('POINT(116.41 39.91)', 4326), 32650), 1000))

但这样似乎有些多此一举,现在使用ST_DWithin函数。

SELECT name,geom FROM beijingpoi
WHERE ST_DWithin(
ST_Transform(st_geomfromtext('POINT(116.41 39.91)',4326),32650)
,ST_Transform(geom,32650), 1000);

一下子清爽了不是,同样的,我们也可以利用ST_within和ST_Buffer完成这个操作:

select name	from beijingpoi
where st_within(ST_Transform (geom, 32650), ST_Buffer(ST_Transform(ST_GeomFromText('POINT(116.41 39.91)', 4326), 32650), 1000)) 

以上三种方式都可以实现需求,明显后两种更简洁一下。

  1. 解决了能否的问题后,就该解决效率问题了,现在拿第三种查询方式做对比,首先对被查询的点geometry字段新建了gist空间索引:CREATE INDEX "beijingpoi_geom_idx" ON "public"."beijingpoi" USING gist ( "geom" "public"."gist_geometry_ops_2d" );

然后执行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值