我正在使用 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);
}
问题是国家边界线仍然出现在一个区域内,我想删除它们以便只显示区域边界。
Dundas 多边形必须在同一点开始和结束。这是所有国家形状的情况。现在我需要一种算法可以:
- 确定国家边界在区域边界的相交位置,以便我可以加入区域边界段。
- 确定哪些国家边界不是区域边界,以便我可以丢弃它们。
- 对生成的区域点进行排序,以便它们按顺序描述形状边界。
下面是我到目前为止使用 map 到达的位置。您可以看到国家边界仍然需要删除。例如,蒙古和中国的边界应该去掉,而蒙古和俄罗斯的边界应该保留。
我需要保留区域边界的原因是区域颜色在传达信息方面很重要,但相邻区域可能是相同的颜色。区域可以改变以包括或排除国家,这就是为什么区域塑造必须是动态的。
编辑: 我现在知道我正在寻找的是多边形的联合。大卫·里恩 explains how to do it使用 SQL Server 2008 中的空间函数,这可能是一个选项,但我的努力已经停止,因为生成的多边形联合非常复杂,以至于 SQL 将其截断为 43,680 个字符。我现在正在尝试为此找到一个解决方法,或者找到一种在代码中进行合并的方法。
最佳答案
当对国家进行分组时,我希望没有重叠——你可以采用一个相当简单的算法来寻找共享顶点——一个简单的观点是遍历一个多边形上的点,看看它是否在任何一个您的其他多边形,并共享相同的下一个或上一个点以查看是否存在匹配项。然后只需删除共享顶点即可创建联合
关于c# - 对地理形状进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653812/