如何合并两个C# DbGeography Polygon为MultiPolygon及处理行政区数据
合并DbGeography Polygon为MultiPolygon的解决方案
嘿,我来帮你搞定这个同编码多Polygon的合并问题!针对你提到的两种场景——单个合并两个Polygon,以及批量处理分组后的多Polygon,我整理了两种实用方案,你可以按需选择:
一、合并两个独立Polygon为MultiPolygon
如果只是要把两个单独的Polygon打包成一个MultiPolygon,最直接的方式是通过拼接Well-Known Text(WKT)格式来创建:
// 假设你已经有两个DbGeography类型的Polygon实例 DbGeography polygon1 = ...; DbGeography polygon2 = ...; // 提取每个Polygon的坐标部分(去掉WKT里的"POLYGON ("和末尾的")") var poly1Coords = polygon1.AsText().Replace("POLYGON (", "").TrimEnd(')'); var poly2Coords = polygon2.AsText().Replace("POLYGON (", "").TrimEnd(')'); // 拼接成MultiPolygon的标准WKT格式 var multiPolyWkt = $"MULTIPOLYGON (({poly1Coords}), ({poly2Coords}))"; // 创建最终的MultiPolygon,注意要和原Polygon使用相同的坐标系ID DbGeography multiPolygon = DbGeography.MultiPolygonFromText(multiPolyWkt, polygon1.CoordinateSystemId);
这种方法的优势是严格保留多个Polygon的独立性,不管它们是否相邻或重叠,最终结果一定是MultiPolygon类型,完全符合你把同编码多Polygon打包的需求。
二、批量处理同编码的多Polygon合并
如果要处理一组按编码(code)分组的Polygon,我们可以先分组再批量拼接:
// 假设你的数据源是一个包含Code和Polygon的列表 var polygonData = new List<(string Code, DbGeography Polygon)> { ("SE-01", polygonA), ("SE-01", polygonB), ("SE-02", polygonC), // ...更多同编码的Polygon数据 }; // 按Code分组聚合 var groupedByCode = polygonData.GroupBy(item => item.Code); // 存储合并后的结果 var mergedMultiPolygons = new List<(string Code, DbGeography MultiPolygon)>(); foreach (var group in groupedByCode) { // 提取组内所有Polygon的坐标部分 var allPolyCoords = group.Select(item => item.Polygon.AsText().Replace("POLYGON (", "").TrimEnd(')') ).ToList(); // 拼接成MultiPolygon的WKT格式 var coordsString = string.Join("), (", allPolyCoords); var multiPolyWkt = $"MULTIPOLYGON (({coordsString}))"; // 创建MultiPolygon,使用组内第一个Polygon的坐标系ID(确保所有Polygon坐标系一致) var multiPolygon = DbGeography.MultiPolygonFromText(multiPolyWkt, group.First().Polygon.CoordinateSystemId); mergedMultiPolygons.Add((group.Key, multiPolygon)); }
可选方案:使用Union方法自动合并相邻区域
如果你希望自动合并相邻或重叠的Polygon(比如两个Polygon连在一起时,直接合并成一个单一Polygon而非MultiPolygon),可以用DbGeography的Union方法:
// 两个Polygon合并 var mergedGeo = polygon1.Union(polygon2); // 批量合并同编码的Polygon foreach (var group in groupedByCode) { var mergedGeo = group.Select(item => item.Polygon) .Aggregate((current, next) => current.Union(next)); mergedMultiPolygons.Add((group.Key, mergedGeo)); }
注意:这种方法的结果类型不确定——如果所有Polygon都相邻/重叠,会返回单个Polygon;如果存在不相连的区域,才会返回MultiPolygon。如果你的需求是必须保留多个Polygon作为MultiPolygon的子元素,优先用WKT拼接的方法。
关键注意事项
- 确保所有待合并的Polygon使用相同的坐标系ID,否则创建MultiPolygon时会报错。
- 检查QGIS导出的GeoJSON转成DbGeography后,WKT格式是否正确(比如每个Polygon的坐标是闭合的,第一个点和最后一个点一致),避免拼接后出现格式错误。
内容的提问来源于stack exchange,提问作者Ogglas
相关产品推荐
相关产品推荐

