如何用SQL结合PostGIS的ST_Join合并名称前两词相同的多边形
实现方案
该需求完全可以通过单条PostgreSQL + PostGIS语句实现,你提到的ST_Join应为笔误,多边形合并需使用PostGIS提供的ST_Union函数。
核心逻辑
- 对
name字段按空格拆分,提取前两个单词拼接为分组标识 - 按分组标识做聚合,将同组所有多边形用
ST_Union合并为单个几何对象
可直接运行的SQL示例
SELECT -- 提取前两个单词作为合并后的分组名称 CONCAT(split_part(name, ' ', 1), ' ', split_part(name, ' ', 2)) AS group_name, -- 合并同组几何,ST_MakeValid用于修正可能存在的无效几何 ST_MakeValid(ST_Union(geom)) AS merged_geometry, -- 可选字段:统计该组合并前的原始要素数量 COUNT(*) AS original_feature_num FROM 替换为你的空间表名 WHERE -- 过滤名称不足两个单词的无效数据,不需要可删除该行 array_length(string_to_array(name, ' '), 1) >= 2 GROUP BY group_name;
优化说明
- 如果你的数据存在名称前后带空格、单词间多个连续空格的情况,可以将分组名称的提取逻辑替换为更鲁棒的正则拆分写法:
CONCAT((regexp_split_to_array(trim(name), '\s+'))[1], ' ', (regexp_split_to_array(trim(name), '\s+'))[2]) AS group_name - 若需要将合并结果持久化存储到新表,只需在语句开头增加
CREATE TABLE 合并后的新表名 AS即可 - 针对你给出的示例数据,该语句会自动生成
ANGELHOLM TMA、ANKARA TMA、ANTALYA APP、ANTANANARIVO TMA四个分组分别合并,无需硬编码任何前缀匹配规则
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

