2016-09-01 58 views
13

我在Bing地圖WPF控件上繪製區域(使用SqlGeometry/SqlGeography並將它們翻譯成WPF LocationCollection等效項),並需要標記它們。我在地區上繪製了標籤,並將它們附加到STCentroid()發現的點上。當然,正如你所想象的那樣,這是一個與質心在區域外面結束的'U'或'C'形區域有關的問題,這使得標籤不正確。使用Sql Spatial Data(C#)查找不規則多邊形的「視覺」中心

有沒有辦法使用SqlGeometry/SqlGeography找到「視覺」中心,或者找到最適合形狀和使用該中心的圓?我試着用various methodsSTPointOnSurface()似乎STPointOnSurface()總是挑選對像這樣DCREHA(邊緣點底部的深綠色區域的標籤總是在邊緣結束:

enter image description here

+0

假設僅存在一種形狀,一種解決方案可能是找到開放的一面,然後將標籤移到另一面,直到標籤在形狀內。你也可以做一些過濾來刪除某些區域。或者你可能試圖找到最大的凹面區域(我不知道是否有算法)。 – Phil1970

+0

相關:http://stackoverflow.com/q/1203135/3628232 –

+0

那麼U形的「視覺中心」在哪裏? –

回答

9

幾乎相同問題已經被問到here。在你的情況中,最相關的答案可能是this one。答案的難點在於確定將多邊形分成兩個相等區域的線條的繪製位置,因此,我建議稍微修改一下下面爲SQL Server:

  1. 使用STCentroid找到質心
  2. 如果這在多邊形內(STWithin),則不需要進一步處理;否則:
  3. 確定多邊形的邊界框的質心(如使用STEnvelope獲得多邊形的信封,並傳遞作爲參數STCentroid
  4. 如果心是多邊形(STWithin)內,它可能不夠好(將需要測試);否則:
  5. 擴展,如此使得其延伸到剛好超過每個方向上的多邊形的包絡連接多邊形的質心和包絡的質心的線(也可以在C#代碼是更容易,或看到here用於PostGIS的溶液)
  6. 確定延長線與多邊形之間的交點(STIntersection
  7. 從步驟1中查找與多邊形的質心點最近的交點(請參閱here)。這一點是linked answer中詳細描述的「第一切割點」的近似值。
  8. 找到上面步驟7中找到的交點的最近交點。此點爲linked answer中詳述的「第2個切割點」的近似值。
  9. 連接兩個交點的線的中點將位於多邊形內,並且應該是多邊形「視覺中心」的合理近似值。

例如,給定爲上述DCREHA例如多邊形,下面的GIF動畫上面列出的過程(通過肉眼判斷 - 實際的結果將不同):

enter image description here

+1

我會接受這一點,因爲它非常接近我最終做的事情(並且會爲有類似問題的任何人工作),並且我讚賞它所付出的努力。我從質心(如果不是內部形狀)投射8條光線到NW,N,NE,E,SE,S,SW,W,並將這些線與由實際幾何和觀察盒形成的形狀相交,測量它們並將標籤放在最長的結果線的中點。 – Hershizer33

相關問題