2014-01-17 3 views
2

안드로이드지도 v2에서 다각형의 중심을 채우고 다각형이 복잡하고 서로 교차하는 선이있는 경우 문제가 발생합니다. 사용자는 손가락으로지도에 그림을 그릴 수 있으며지도 투영을 사용하여 내 포인트를 LatLng로 변환합니다.안드로이드지도에서 복잡한 다각형의 개요를 계산하는 방법 v2

교차하는 선으로 그려져 있어도 가운데를 채워야합니다. enter image description here

: 난 단지 개요와 함께 별을 그릴 때 enter image description here

스크린 샷 :

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

스크린 샷 내가 교차하는 라인 별을 그릴 때 다음과 같이

그려 내 코드입니다

LatLng이 윤곽선을 구성하는 점을 계산하는 방법이 있습니까? 아니면 다른 해결책이 있습니까?

EDIT : 내가 처리하고있는 앱의 iOS 버전이 완벽하게 처리됩니다. 모든 점을 다각형에 추가하면 Google지도에서이를 계산합니다. 이 시점에서 나는 이것이 Android Google Maps에서 부족한 버그/기능이라고 생각합니다.

편집 : 버그 리포트 : 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

한 가지 가능한 방법은 선이 다음/LNG 포인트를 LAT에 그 픽셀 위치를 변환 서로 충돌 위치를 감지하는 것입니다.

사례에서 동일한 첫 번째 점과 마지막 점을 추적하고 다각형의 다른 모든 선으로 각 선을 검사해야합니다. 또한 검사를 시작하는 방향 (예 : 시계 방향/시계 반대 방향)에 따라 찾은 순서를 추적하십시오. 모든 교차점을 x, y에서 lat/lng로 변환합니다.

모든 교차 위치를 찾으면 첫 번째 점에서 시작하여 첫 번째 교차점을 만들고 다음 선은 다음 교차점이 아닌 첫 번째 교차점이됩니다 (예 : 팁). 스타의) 등 등 모든 새로운 지점의 새로운 목록을 형성 할 때까지지도 그 음모에 목록을 제공합니다.

당신은이 공식은 내가 생각 didnt는 나의 논리에 구멍이 몇 개있을 수 있습니다

http://en.wikipedia.org/wiki/Line-line_intersection를 시작하는 데 사용할 수 있습니다.

+0

답해 주셔서 감사합니다. 별에 대해서만 작동하도록 특별히 필요한 것은 아니지만 교차 선으로 그려지는 모든 다각형을 필요로하므로 미친 뭔가를 그릴 경우이 논리가 실패 할 것이라고 생각합니다. – egfconnor

1

나는 이미 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() 메서드를 사용하면 교차점과 교차 선이없는 외곽선 폴리곤을 얻을 수 있습니다.

관련 문제