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

我在Bing Maps WPF控件上绘制区域(使用sqlgeometry / sqlGeography并将其转换为WPF LocationCollection等效项),并需要标记它们.我在区域上绘制了标签,并将它们附加到STCentroid()发现的点上.当然,你可以想象这是’U’或’C’形区域的问题,其中心脏在区域之外结束,这使得标签不正确.

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

解决方法

一个几乎相同的问题已经被问到了 here.在你的情况下,最相关的答案可能是 this.答案的困难在于确定将多边形分割成两个相等区域的线.因此,我建议稍后修改版本下面的sql Server:

>使用STCentroid找到质心
>如果这是在多边形内(STWithin),则不需要进一步处理;除此以外:
>确定多边形边界框的质心(例如,使用STEnvelope获取多边形的包络并将其作为参数传递给STCentroid)
>如果这个质心在多边形内(STWithin),它可能足够好(需要测试);除此以外:
>扩展连接多边形的质心和信封的质心的线,使其在每个方向上延伸到多边形的信封之外(可能更容易在C#代码中,或者参见here的PostGIS解决方案)
>确定延伸线和多边形之间的交点(STIntersection)
>从步骤1中查找到多边形的质心点的最近交叉点(参见here).这一点是linked answer中详细描述的“第一切点”的近似值.
>在步骤7中找到上面交叉点的最近交叉点.这一点是linked answer中详细说明的“第二个切割点”的近似值.
>连接两个交叉点的线的中点将在多边形内,并且应该是多边形“视觉中心”的合理近似.

例如,给定上述DCREHA示例的多边形,以下GIF会动画化上述步骤(由眼睛判断 – 实际结果会有所不同):

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...