将地名拟合为地图形状

时间:2010-05-28 12:46:17

标签: c# gdi+ geospatial

我正在使用GDI +使用lat / lon浮点列表绘制形状,我需要将该位置的名称放在多边形的边框内。简单地将文本居中在边界矩形中不适用于不规则形状。我有文本和字体,所以我可以得到文本需要适应的矩形的大小,但在那一点上我被卡住了。

这似乎是所有绘图软件解决的常见问题,以及您在算法或计算机图形教科书中可以找到的类型。

因此,给定多边形和矩形的浮点列表,有没有办法获得放置文本的最佳点,使用: 1)GDI +; 2)SQL Server地理空间;要么 3)c#代码(或c,伪代码等)

2 个答案:

答案 0 :(得分:1)

我认为你基本上是在寻找你的多边形的centroid,你可以在它周围居中。维基百科文章包含对各种方法的良好描述。

一种简单的方法是只取出构成多边形的所有点的平均值,并使用此平均点作为文本的中心。

另见这个问题:

How do I find the center of a number of geographic points?

它比简单平均稍微复杂一些,因为你需要在计算中考虑地球的曲率(如果比例足够大,可能)。

更新:我只想到一种简单的方法就可以做到这一点。写一个像这样的函数:

public Point Centrality(Point somePoint, Point[] otherPoints)
{
    float sumOfSquares = 0;
    foreach (Point point in otherPoints)
    {
        float dist = DistanceBetween(somePoint, point);
        sumOfSquares += dist * dist;
    }
    return 1 / sumOfSquares;
} 

然后(这可能在计算上很昂贵)通过限制该区域的矩形迭代您想要的任何分辨率,并评估每个点的中心性。具有最高中心分数的点几乎肯定会在复杂区域的边界内,因为该区域外的点将远离构成该区域的所有点(这就是为什么使用平方距离而不是只是距离)。

这可能只是一个起点。这个度量将受到构成该区域的点/线的粒度的高度影响 - 例如,如果使用佛罗里达州另一半的两倍多的点来定义佛罗里达州的狭长地带,那么具有最高中心度量的点将很好进入狭长地带,而不是应该在中心。

答案 1 :(得分:0)

最简单的方法就是将它们全部绘制在你的形状下方,周围有一个矩形。

-Get the maximum Y from your coordinates
-Get the minimum & maximum X from your coordinates
-Draw the box at position [maxX-minX / 2 - (sizemessage/2)),y]