c# - 使用Sql Spatial Data(C#)找不规则多边形的 "visual"中心

标签 c# .net sql-server polygon bing-maps

我正在 Bing map WPF 控件上绘制区域(使用 SqlGeometry/SqlGeography 并将它们转换为 WPF LocationCollection 等价物)和需要给它们贴上标签。我在区域上绘制了标签,并将它们附加到 STCentroid() 找到的点上。当然,正如您想象的那样,这是“U”或“C”形区域的问题,其中质心最终位于区域之外,这使得标签不正确。

有没有办法使用 SqlGeometry/SqlGeography 找到“视觉”中心,或者找到适合该形状的最大圆并使用该中心?我试过了 various methods使用 STPointOnSurface() 但似乎 STPointOnSurface() 总是像 DCREHA 那样在边缘选择一个点(底部深绿色区域的标签总是在边缘结束:

enter image description here

最佳答案

已经问了一个几乎相同的问题here .在您的情况下,最相关的答案可能是 this一。该答案的困难部分是确定在哪里绘制将多边形分成两个相等区域的线。因此,我建议对 SQL Server 进行以下稍微修改的版本:

  1. 使用 STCentroid 找到质心
  2. 如果这是在多边形内部(STWithin),则无需进一步处理;否则:
  3. 确定多边形边界框的质心(例如,使用 STEnvelope 获取多边形的包络并将其作为参数传递给 STCentroid)
  4. 如果这个质心在多边形内 (STWithin),它可能就足够了(需要测试);否则:
  5. 延长连接多边形质心和包络质心的线,使其在每个方向上延伸到刚好超出多边形包络线(使用 C# 代码可能更容易,或参见 here 了解 PostGIS 解决方案)
  6. 确定延长线与多边形的交点(STIntersection)
  7. 从步骤 1 中找到与多边形质心点最近的交点(参见 here )。这一点是 linked answer 中详述的“第一个切割点”的近似值。 .
  8. 找到与上面在第 7 步中找到的交点最近的交点。此点是 linked answer 中详述的“第二个切点”的近似值。 .
  9. 连接两个交点的线的中点将在多边形内部,并且应该是多边形“视觉中心”的合理近似值。

例如,给定上面 DCREHA 示例的多边形,下面的 GIF 动画上面列出的过程(通过眼睛判断 - 实际结果会有所不同):

enter image description here

关于c# - 使用Sql Spatial Data(C#)找不规则多边形的 "visual"中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276401/

相关文章:

.net - Visual Studio 2013 中的 objective-c PU 和平台有什么区别?

SQL - 比较 Table1.items (Ntext) 与 Table2.item (Varchar)

sql-server - 带有空格的不同计数行为

sql - 内连接 vs 交叉连接 vs 交叉应用

c# - 在wpf中的两个按钮之间绘制线

c# - asp.NET LINQ 从数据库中删除

c# - 为 MongoDb 处理可为空和不可为空类型的自定义序列化程序

.net - 如何决定什么是 .Net 目标

c# - InvalidArgument= '0' 的值对于 'SelectedIndex' 无效。参数名称 : SelectedIndex

c# - 抽象,还是不抽象