You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:25:18