分组地理形状

gre*_*ade 10 c# algorithm geometry geography dundas

我正在使用Dundas Maps并尝试绘制世界地图,其中国家/地区被分组到特定于业务实现的区域.

我有世界上每个国家的形状数据(点和段).通过将区域内的所有国家/地区的所有点和细分添加到新的区域形状,我可以将国家/地区组合到一起.

foreach(var region in GetAllRegions()){
    var regionShape = new Shape { Name = region.Name };
    foreach(var country in GetCountriesInRegion(region.Id)){
        var countryShape = GetCountryShape(country.Id);
        regionShape.AddSegments(countryShape.ShapeData.Points, countryShape.ShapeData.Segments);
    }
    map.Shapes.Add(regionShape);
}
Run Code Online (Sandbox Code Playgroud)

问题是国家边界线仍然出现在一个区域内,我想删除它们,以便只显示区域边界.

Dundas多边形必须在同一点开始和结束.所有国家形状都是如此.现在我需要一个能够:

  • 确定国家边界在区域边界的交叉点,以便我可以加入区域边界段.
  • 确定哪些国家/地区边界不是区域边界,以便我可以丢弃它们.
  • 对生成的区域点进行排序,以便它们按顺序描述形状边界.

以下是我到目前为止使用地图的地方.您可以看到仍需要删除国家/地区边界.例如,蒙古和中国之间的边界应该被丢弃,而蒙古和俄罗斯之间的边界应该保留.

我需要保留区域边界的原因是区域颜色在传达信息方面很重要,但相邻区域可能是相同的颜色.这些地区可以改变以包括或排除国家,这就是区域塑造必须是动态的原因.

编辑: 我现在知道我正在寻找的是一个多边形联盟.David Lean 解释了如何使用SQL Server 2008中的空间函数来执行此操作,这可能是一个选项,但我的努力已经停止,因为生成的多边形联合非常复杂,以至于SQL将其截断为43,480个字符.我现在正在尝试为此找到解决方法或找到在代码中进行联合的方法.

区域地图

Row*_*haw 5

在分组国家时,我希望没有重叠 - 你可以采用一种相当天真的算法来寻找共享顶点 - 一个简单的视图就是迭代一个多边形上的点,看看它是否在你的任何其他多边形上,并分享相同的下一个或上一个点,以查看是否匹配.然后只需删除共享顶点即可创建联合