如何用Spatial SQL查找多边形内近边缘点?以滨海度假屋标记为例
解决方案:MariaDB内实现多边形内边缘点筛选
核心思路是通过生成原多边形的向内收缩缓冲带,筛选出「在原多边形内但不在收缩后多边形内」的点,这类点就处于原多边形边缘指定距离范围内(即你的“靠近海岸”区域)。
具体步骤与SQL示例
假设你的数据结构如下:
- 度假屋表:
holiday_homes,包含id、location(POINT类型,WGS84坐标系,EPSG:4326) - 英国边界表:
uk_boundary,包含geom(MULTIPOLYGON类型,WGS84坐标系)
1. 坐标转换与缓冲计算
因为WGS84是地理坐标系(单位为度),直接缓冲会导致距离计算失真,所以需要先转换为英国本地投影坐标系OSGB36(EPSG:27700)(单位为米),再生成向内收缩的边界:
-- 生成向内收缩5英里的英国边界(转换回WGS84) SELECT ST_TRANSFORM( ST_BUFFER( ST_TRANSFORM(u.geom, 27700), -- 转成OSGB36投影 -8046.7 -- 向内收缩5英里(1英里≈1609.34米,5*1609.34≈8046.7) ), 4326 -- 转回WGS84 ) AS shrunk_uk_boundary FROM uk_boundary u WHERE id = 1; -- 假设只有一条英国边界记录
2. 筛选靠近海岸的度假屋
结合原边界和收缩后的边界,筛选符合条件的点:
SELECT h.* FROM holiday_homes h JOIN uk_boundary u ON ST_WITHIN(h.location, u.geom) -- 确保点在英国境内 WHERE NOT ST_WITHIN( h.location, ST_TRANSFORM( ST_BUFFER(ST_TRANSFORM(u.geom, 27700), -8046.7), 4326 ) );
关键注意事项
- 版本要求:需使用MariaDB 10.2及以上版本,该版本开始支持
ST_TRANSFORM、ST_BUFFER等核心空间函数,且需确保已启用SPATIAL扩展。 - 性能优化:为
holiday_homes.location和uk_boundary.geom字段创建空间索引,大幅提升查询速度:CREATE SPATIAL INDEX idx_holiday_home_location ON holiday_homes(location); CREATE SPATIAL INDEX idx_uk_boundary_geom ON uk_boundary(geom); - 距离调整:根据需求修改
ST_BUFFER的负数值,比如要筛选3英里内的点,就用-4828.02(3*1609.34)。
内容的提问来源于stack exchange,提问作者Mark Goodge
相关产品推荐
相关产品推荐

