2010-05-28 21 views
1

我画使用GDI +使用经/纬度花车的列表形状,我需要把多边形的边界内的地名。简单地将文本居中在边界矩形中对于不规则形状不起作用。我有文本和字体,所以我可以得到文本需要适合的矩形的大小,但是在那个时候我卡住了。配件地名进入地图形状

这似乎是所有的制图软件解决了一个共同的问题,以及那种你会发现在一个算法或计算机图形教材的事情。

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

回答

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; 
} 

然后(这可能是计算昂贵的),你希望通过界定该区域的矩形任何分辨率迭代,并评价每个点的中心地位。具有最高Centrality得分的点几乎肯定会在复杂区域的边界内,因为该区域外的点将远离构成该区域的所有点(这就是为什么您使用平方距离而不是距离)。

这可能只是一个起点。这个衡量标准很大程度上受到构成该地区的点/线的粒度的影响 - 例如,如果佛罗里达州的土豆块被定义为佛罗里达另一半的两倍,那么具有最高中心性度量的点将会很好进入锅柄,而不是在它的中心。

+0

谢谢,centriod是一种改进,使围绕框中的文字居中。尽管如此,我所见过的所有东西都将“佛罗里达”一词放在墨西哥湾。我对这个中心不感兴趣,因为它在“干地”上,即不在毗邻的管辖区内。 – 2010-05-28 17:22:18

+0

是的,我想在边界矩形内尝试一堆点是实现它的方法。这将是昂贵的,但它只需要做一次。关于你的函数返回的东西靠近锯齿状的边界而不是直的边界,你是对的。 我只需选择符合地理形状的名称矩形,并且距离边界矩形的中心最近,如果没有合适的话最接近中心的矩形。 – 2010-05-30 11:31:35

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] 
+0

这里的问题是,它不会清楚名称如何附着到形状上。我需要包含在形状中的名称。 – 2010-05-29 00:20:08