2014-01-17 66 views
2

我需要在Android地圖v2中填充多邊形的中心,並且在多邊形很複雜並且線條互相交叉時遇到問題。用戶可以用手指在地圖上繪製,然後使用地圖投影將我的點轉換爲LatLng。如何計算Android地圖中複雜多邊形的輪廓v2

我需要填充中心,即使它是用交叉的線條繪製的。

我的代碼繪製如下:

PolygonOptions rectOptions = new PolygonOptions(); 
    rectOptions.strokeColor(getResources().getColor(R.color.blue)); 
    rectOptions.fillColor(getResources().getColor(R.color.blue_map_fill)); 
    rectOptions.strokeWidth(4); 
    rectOptions.addAll(latLngs); 
    mMap.addPolygon(rectOptions); 

截圖當我繪製渡線的恆星: enter image description here

截圖時,我畫星只有輪廓: enter image description here

有沒有一種方法可以計算LatLng構成輪廓還是有不同的解決方案?

編輯:我正在處理的應用程序的iOS版本處理這個完美..他們只是將所有點添加到一個多邊形和谷歌地圖數字出來。在這一點上,我相信這是Android谷歌地圖所缺乏的缺陷/功能。

編輯:錯誤報告:https://code.google.com/p/gmaps-api-issues/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal&groupby=&sort=&id=6255

+0

您是否解決了這個問題?我面臨同樣的問題 – Sunny

+0

不,我沒有,並且錯誤報告也沒有出現在任何地方。 – egfconnor

回答

1

一種可能的方式是檢測在線條相互碰撞,然後轉換這些像素位置緯度/經度點。

您需要跟蹤您的情況下第一個和最後一個點,然後檢查每條線與多邊形中的所有其他線。根據您開始檢查的方向(即順時針/逆時針)跟蹤您找到的訂單。將所有交點從x,y轉換爲lat/lng。

找到所有交點位置後,您可以從第一個點開始創建一條線作爲第一個交點,然後下一條線成爲您的下一個非交點的第一個交點(即提示等等)等等,直到你形成所有新點的新列表,然後給出地圖列表來繪製。

你可以用這個公式來上手http://en.wikipedia.org/wiki/Line-line_intersection

有可能是在我的邏輯一些漏洞,我沒有想到的。

+0

感謝您的回答。我並不特別需要它僅僅爲一顆星而工作,而是任何用相交線繪製的多邊形,所以我相信如果他們畫出一些瘋狂的東西,這個邏輯就會失敗。 – egfconnor

1

我知道這已經過去了一年,但這裏是我的解決方案。 我使用JTS library,我想你也可以使用這個庫的客戶端來創建周圍的多邊形。

此方法創建一個新的LatLng對象列表,您可以使用它來繪製輸入的周圍多邊形。

private void createSurroundingPolygon(List<LatLng> polygonPath) { 
    List<Coordinate> coordinates = new ArrayList<>(); 
    for (LatLng latLng : polygonPath) { 
     coordinates.add(new Coordinate(latLng.longitude, latLng.latitude)); 
    } 

    GeometryFactory factory = new GeometryFactory(); 
    Geometry lineString = factory.createLineString(coordinates.toArray(new Coordinate[coordinates.size()])); 
    Polygon polygon = (Polygon) BufferOp.bufferOp(lineString, 0.0001); 

    Coordinate[] coordinatesSurroundingPolygon = polygon.getExteriorRing().getCoordinates(); 
    List<LatLng> surroundingPolygon = new ArrayList<>(); 
    for (int i = 0; i < coordinatesSurroundingPolygon.length; i++) { 
     surroundingPolygon.add(new LatLng(coordinatesSurroundingPolygon[i].y, coordinatesSurroundingPolygon[i].x)); 
    } 
    drawPolygon(surroundingPolygon); 
} 

首先它創建一個新的Coordindates列表。它們用於創建JTS幾何體,即LineString。您不能直接從座標列表創建LinearRing或Polygon,因爲您不知道它是否是有效的(閉合多邊形沒有交點)。當你用給定的幾何圖形緩衝距離時,你會得到一個多邊形,在我的情況下是0.0001。距離是額外的空間,它被添加到您的原始多邊形之外。

最後用方法Polygon.getExtgeriorRing()得到沒有任何相交和交叉線的輪廓多邊形。

相關問題