c# - 对地理形状进行分组

标签 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);
}

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

Dundas 多边形必须在同一点开始和结束。这是所有国家形状的情况。现在我需要一种算法可以:

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

下面是我到目前为止使用 map 到达的位置。您可以看到国家边界仍然需要删除。例如,蒙古和中国的边界应该去掉,而蒙古和俄罗斯的边界应该保留。

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

编辑: 我现在知道我正在寻找的是多边形的联合。大卫·里恩 explains how to do it使用 SQL Server 2008 中的空间函数,这可能是一个选项,但我的努力已经停止,因为生成的多边形联合非常复杂,以至于 SQL 将其截断为 43,680 个字符。我现在正在尝试为此找到一个解决方法,或者找到一种在代码中进行合并的方法。

Regional Map

最佳答案

当对国家进行分组时,我希望没有重叠——你可以采用一个相当简单的算法来寻找共享顶点——一个简单的观点是遍历一个多边形上的点,看看它是否在任何一个您的其他多边形,并共享相同的下一个或上一个点以查看是否存在匹配项。然后只需删除共享顶点即可创建联合

关于c# - 对地理形状进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653812/

相关文章:

android - 使用位置查找运动转角

c# - 在鼠标点击 PictureBox 时弹出一个 TextBox 以向图片添加自定义注释

c# - DataRowView 对象在从 DataGrid 获取值时获取空值

algorithm - 带有 GraphQL 响应属性过期的 JSON 对象缓存

algorithm - 在图中制作成本矩阵

ios - Boost::Geometry (1.53) 与 iOS

c# - 使用自定义列名映射外键

c# - 如何使用 Javascript 将数据插入数据库

c++ - 两种包含重复算法的时间复杂度差异

java - 如何检查圆是否位于凸多边形内部