使用 Sql 空间数据 (C#) 查找不规则多边形的 "visual" 中心
Using Sql Spatial Data (C#) to find the "visual" center of irregular polygons
我正在 Bing Maps WPF 控件上绘制区域(使用 SqlGeometry
/SqlGeography
并将它们转换为 WPF LocationCollection
等价物)并且需要标记他们。我在区域上绘制了标签,并将它们附加到 STCentroid()
找到的点。当然,正如您想象的那样,这是 'U' 或 'C' 形状区域的问题,其中质心最终位于区域之外,这使得标签不正确。
有没有一种方法可以使用 SqlGeometry
/SqlGeography
找到 "visual" 中心,或者找到适合该形状的最大圆并使用该中心?我试过 various methods 使用 STPointOnSurface()
但似乎 STPointOnSurface()
总是像 DCREHA 那样在边缘选择一个点(底部深绿色区域的标签总是在边缘结束:
几乎相同的问题已经被问过here. In your case, the most relevant answer is probably this一个。该答案的困难部分是确定在哪里绘制将多边形分成两个相等区域的线。因此,我在下面为 SQL Server:
提出了一个稍微修改的版本
- 使用
STCentroid
找到质心
- 如果在多边形(
STWithin
)内部,则无需进一步处理;否则:
- 确定多边形边界框的质心(例如,使用
STEnvelope
获取多边形的包络并将其作为参数传递给 STCentroid
)
- 如果这个质心在多边形(
STWithin
)内,它可能就足够了(需要测试);否则:
- 延长连接多边形质心和包络质心的线,使其在每个方向上延伸到刚好超出多边形包络线(在 C# 代码中可能更容易,或参见 here 了解 PostGIS 解决方案)
- 确定延长线与多边形的交点(
STIntersection
)
- 从步骤 1 中找到与多边形质心点最近的交点(参见 here). This point is an approximation for the "1st cut point" detailed in the linked answer。
- 找到与上面第 7 步中找到的交点最近的交点。此点是 linked answer.
中详述的“第二个切点”的近似值
- 连接两个交点的线的中点将在多边形内部,应该是多边形 "visual centre" 的合理近似值。
例如,给定上面 DCREHA 示例的多边形,下面的 GIF 动画显示上面列出的过程(通过眼睛判断 - 实际结果会有所不同):
我正在 Bing Maps WPF 控件上绘制区域(使用 SqlGeometry
/SqlGeography
并将它们转换为 WPF LocationCollection
等价物)并且需要标记他们。我在区域上绘制了标签,并将它们附加到 STCentroid()
找到的点。当然,正如您想象的那样,这是 'U' 或 'C' 形状区域的问题,其中质心最终位于区域之外,这使得标签不正确。
有没有一种方法可以使用 SqlGeometry
/SqlGeography
找到 "visual" 中心,或者找到适合该形状的最大圆并使用该中心?我试过 various methods 使用 STPointOnSurface()
但似乎 STPointOnSurface()
总是像 DCREHA 那样在边缘选择一个点(底部深绿色区域的标签总是在边缘结束:
几乎相同的问题已经被问过here. In your case, the most relevant answer is probably this一个。该答案的困难部分是确定在哪里绘制将多边形分成两个相等区域的线。因此,我在下面为 SQL Server:
提出了一个稍微修改的版本- 使用
STCentroid
找到质心 - 如果在多边形(
STWithin
)内部,则无需进一步处理;否则: - 确定多边形边界框的质心(例如,使用
STEnvelope
获取多边形的包络并将其作为参数传递给STCentroid
) - 如果这个质心在多边形(
STWithin
)内,它可能就足够了(需要测试);否则: - 延长连接多边形质心和包络质心的线,使其在每个方向上延伸到刚好超出多边形包络线(在 C# 代码中可能更容易,或参见 here 了解 PostGIS 解决方案)
- 确定延长线与多边形的交点(
STIntersection
) - 从步骤 1 中找到与多边形质心点最近的交点(参见 here). This point is an approximation for the "1st cut point" detailed in the linked answer。
- 找到与上面第 7 步中找到的交点最近的交点。此点是 linked answer. 中详述的“第二个切点”的近似值
- 连接两个交点的线的中点将在多边形内部,应该是多边形 "visual centre" 的合理近似值。
例如,给定上面 DCREHA 示例的多边形,下面的 GIF 动画显示上面列出的过程(通过眼睛判断 - 实际结果会有所不同):