2010-05-28 55 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