【问题标题】:Using Sql Spatial Data (C#) to find the "visual" center of irregular polygons使用 Sql Spatial Data (C#) 找到不规则多边形的“视觉”中心
【发布时间】:2017-01-09 15:00:53
【问题描述】:

我正在 Bing Maps WPF 控件上绘制区域(使用 SqlGeometry/SqlGeography 并将它们转换为 WPF LocationCollection 等效项)并且需要标记它们。我在区域上绘制了标签并将它们附加到STCentroid() 找到的点上。当然,正如您想象的那样,“U”或“C”形区域的质心最终位于该区域之外,这会导致标签不正确。

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

【问题讨论】:

  • 假设只有一个形状,一种解决方案可能是找到打开的一侧,然后将标签移动到另一侧,直到标签在形状内。您还可以进行一些过滤以删除某些区域。或者你可能会尝试找到最大的凹面区域(我不知道是否有算法)。
  • 那么U形的“视觉中心”在哪里?
  • 最大的圆的中心适合里面。我发布的示例是 U 形的,因此非常非正式地,在我看来,可以容纳的最大圆圈位于西南,包括 Garner 并触及 PDNUNN 区域。

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


【解决方案1】:

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 动画上面列出的过程(根据眼睛判断 - 实际结果会有所不同):

【讨论】:

  • 我会接受这一点,因为它与我最终所做的非常接近(并且适用于任何有类似问题的人),我很感激为此付出的努力。我将 8 条光线从质心(如果不是内部形状)投射到 NW、N、NE、E、SE、S、SW、W,将这些线与实际几何形状和视图框形成的形状相交,测量它们并将标签放置在最长结果线的中点。
猜你喜欢
  • 2010-11-15
  • 2012-03-30
  • 2016-03-07
  • 2012-06-18
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多