Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Sql空间数据(C#)查找;“视觉”;不规则多边形的中心_C#_.net_Sql Server_Polygon_Bing Maps - Fatal编程技术网

使用Sql空间数据(C#)查找;“视觉”;不规则多边形的中心

使用Sql空间数据(C#)查找;“视觉”;不规则多边形的中心,c#,.net,sql-server,polygon,bing-maps,C#,.net,Sql Server,Polygon,Bing Maps,我正在Bing Maps WPF控件上绘制区域(使用SqlGeometry/SqlGeography并将其转换为WPFLocationCollection等效项),需要对其进行标记。我在区域上绘制了标签,并将它们附着到STCentroid()找到的点上。当然,正如您想象的,这是“U”或“C”形区域的一个问题,其中质心位于该区域之外,这使得标签不正确 有没有一种方法可以使用SqlGeometry/SqlGeography找到“可视”中心,或者找到适合形状的最大圆并使用该中心?我尝试过使用STPoi

我正在Bing Maps WPF控件上绘制区域(使用
SqlGeometry
/
SqlGeography
并将其转换为WPF
LocationCollection
等效项),需要对其进行标记。我在区域上绘制了标签,并将它们附着到
STCentroid()
找到的点上。当然,正如您想象的,这是“U”或“C”形区域的一个问题,其中质心位于该区域之外,这使得标签不正确

有没有一种方法可以使用
SqlGeometry
/
SqlGeography
找到“可视”中心,或者找到适合形状的最大圆并使用该中心?我尝试过使用
STPointOnSurface()
,但似乎
STPointOnSurface()
总是在边上拾取一个点,就像这样DCREHA(底部深绿色区域的标签总是在边上结束:


已经提出了一个几乎相同的问题。在您的案例中,最相关的答案可能是一个。答案中最难的部分是确定在何处绘制将多边形分割为两个相等区域的线。因此,我建议对SQL Server的以下版本稍作修改:

  • 使用
    STCentroid
    查找重心
  • 如果它位于多边形内(
    STWithin
    ),则无需进一步处理;否则:
  • 确定多边形边界框的质心(例如,使用
    stedevelope
    获取多边形的封套,并将其作为参数传递给
    STCentroid
  • 如果该质心位于多边形内(
    STWithin
    ),则可能足够好(需要测试);否则:
  • 延伸连接多边形质心和封套质心的线,使其在每个方向上延伸到多边形封套的正上方(在C#代码中可能更容易,或有关PostGIS解决方案,请参见)
  • 确定延长线和多边形之间的交点(
    STIntersection
  • 从步骤1中找到距离多边形质心点最近的交点(请参见)。该点是中详述的“第一个切点”的近似值
  • 找到距离上述第7步中找到的交点最近的交点。该点是“第二个切割点”的近似值,详见
  • 连接两个交点的线的中点将位于多边形内部,并且应该是多边形“视觉中心”的合理近似值
  • 例如,给定上面DCREHA示例的多边形,下面的GIF将为上面列出的过程设置动画(通过眼睛判断-实际结果将有所不同):


    假设只有一个形状,一个解决方案可能是找到开放的一面,然后将标签移动到另一面,直到标签位于形状内。您还可以进行一些过滤以删除一些区域。或者您可以尝试找到最大的凹面区域(我不知道是否有算法)。相关:那么U形的“视觉中心”?内部最大圆圈的中心。我贴的例子是U形的,所以在我看来,可以容纳的最大圆圈应该在西南部,包围加纳,接触PDNUNN区域。我会接受这一点,因为它非常接近我最终所做的(对任何有类似问题的人都适用)我很感激他们的努力。我从质心(如果不是内部形状)投射了8条射线对于NW、N、NE、E、SE、S、SW、W,取这些线与实际几何图形和视口形成的形状的交点,测量它们,并将标签放置在最长生成线的中点。