使用Sql Spatial Data(C#)查找不规则多边形的“视觉”中心

15
我正在使用SqlGeometry/SqlGeography绘制区域,并将它们转换为WPF LocationCollection的等效形式,然后在Bing Maps WPF控件上对它们进行标注。我已经将标签绘制在了区域上,并将其附加到STCentroid()找到的点上。当然,你可以想象,在'U'或'C'形状的区域中,质心会落在区域外部,这会导致标签不正确。
有没有一种方法可以使用SqlGeometry/SqlGeography找到“视觉”中心,或者找到最大的圆,以适应该形状并使用该中心?我尝试过使用STPointOnSurface()各种方法,但似乎STPointOnSurface()总是选择边缘上的一个点,比如DCREHA(底部深绿色区域的标签总是落在边缘上)。

enter image description here


假设只有一个形状,一种解决方法可能是找到开放的一侧,然后将标签移动到相反的一侧,直到标签在形状内。您还可以进行一些过滤以去除某些区域。或者您可以尝试找到最大的凹面积(我不知道是否有算法可用于此)。 - Phil1970
相关链接:https://dev59.com/MHM_5IYBdhLWcg3w2XBg - Peet Whittaker
那么,U形的“视觉中心”在哪里? - Sergei Patiakin
1
最大内切圆的中心。我发布的示例是U形的,所以在非正式情况下,最大内切圆似乎位于西南部,包括加纳并接触PDNUNN区域。 - Hershizer33
1个回答

10
一个几乎相同的问题已经被提出在这里。对于你的情况,最相关的答案可能是这个。那个答案的难点在于确定将多边形分成两个相等面积的线在哪里划分。因此,我提出了一个稍微修改过的版本适用于SQL Server:
  1. 使用STCentroid查找质心。
  2. 如果质心在多边形内部(使用STWithin),则无需进一步处理;否则:
  3. 确定多边形外接矩形的质心(例如,使用STEnvelope获取多边形的外接矩形,并将其作为参数传递给STCentroid)。
  4. 如果此质心在多边形内部(使用STWithin),则可能足够好(需要测试);否则:
  5. 延伸连接多边形质心和外接矩形质心的线,使其向每个方向仅超出多边形的外接矩形(可能更容易在C#代码中实现,或参见此处的PostGIS解决方案)。
  6. 确定延长线与多边形的交点(STIntersection)。
  7. 从步骤1中找到的多边形质心点找到最近的交点(请参见此处)。该点是链接答案中详细描述的“第一个切点”的近似值。
  8. 找到上述步骤7中找到的交点的最近交点。该点是链接答案中详细描述的“第二个切点”的近似值。
  9. 连接两个交点的线段的中点将位于多边形内部,并且应该是多边形的“视觉中心”的合理近似值。
例如,针对上述 DCREHA 示例中的多边形,以下 GIF 演示了上述过程(根据肉眼判断 - 实际结果将有所不同):

enter image description here


1
我会接受这个答案,因为它非常接近我最终采用的方法(并且对于任何遇到类似问题的人都有效),我很感激付出的努力。我从重心处投射了8条光线(如果不在形状内部),分别朝向西北、北、东北、东、东南、南、西南和西方,取这些线与实际几何形状和视图框之间的交点,测量它们并将标签放置在最长结果线的中点处。 - Hershizer33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接