我在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会动画化上述步骤(由眼睛判断 – 实际结果会有所不同):