2013-10-31 2 views
14

앱에서 Google지도를 사용하며 여러 마커가 각 마커가 사람을 나타내는 동일한 위치에 연결되어있을 가능성이 큽니다. 이 상황에서 사용자는이 마커 뒤에 다른 마커/사람이 있다는 것을 알 수 없습니다.Google지도에서 동일한 위치의 여러 마커를 처리하는 방법은 무엇인가요?

나는이 상황을 처리하기 위해 둘러 보았고 그래서 한 가지 질문은 하나의 마커를 표시하고 모든 사람을 그 하나의 마커와 연결할 수 있음을 제안합니다. 사용자가 마커를 탭하면 해당 마커와 관련된 모든 사용자의 목록을 표시해야합니다. 이는 좋은 해결 방법이지만 Google지도가 거의 숨겨져있는보기는 표시하지 않는 것이 좋습니다.

비슷한 상황에서 어떤 해결 방법을 사용하는 사람이 있습니까?

+0

목록보기를 표시하고 싶지 않다면 그게 정말로 유일한 옵션입니다. – tyczj

+0

@tyczj 다른 사람들이 멀티플 마커를 설명하기 위해 왼쪽/오른쪽으로 기울어 진 마커 아이콘을 표시하는 등의 다른 해결책을 찾고 있습니다. 같은 지점에. 또는 다른 사람 주위에 어떤 다른 작품을 가지고 있습니다. – Geek

+0

안녕하세요, mapView.List에 같은 위치에있는 표식을 확장하거나 표시하려면이 방법을 구현할 수 있습니까? 다음과 같이 구현하고 싶습니다. http://jawj.github.io/OverlappingMarkerSpiderfier/demo.html – AndiM

답변

13

해결 방법은 같은 위치에 마커를 표시하는 것입니다 조금 비트 맵을 따로 따로 분리하여 사용자가 여러 마커에 대해 약간의 아이디어를 얻을 수 있도록합니다.

지도상의 마커와 그 위치를지도에 기록하고지도에 마커를 추가 할 때마다 동일한 위치에 다른 마커가 표시되지 않도록합니다. 그렇다면 추가하려는 새 마커의 위치에 오프셋을 추가합니다.

static final float COORDINATE_OFFSET = 0.00002f; // You can change this value according to your need 

아래 방법은 새 마커에 사용해야하는 위치를 반환합니다. 이 메서드는 새로운 마커의 현재 위도와 경도를 매개 변수로 사용합니다.

// Check if any marker is displayed on given coordinate. If yes then decide 
// another appropriate coordinate to display this marker. It returns an 
// array with latitude(at index 0) and longitude(at index 1). 
private String[] coordinateForMarker(float latitude, float longitude) { 

    String[] location = new String[2]; 

    for (int i = 0; i <= MAX_NUMBER_OF_MARKERS; i++) { 

     if (mapAlreadyHasMarkerForLocation((latitude + i 
       * COORDINATE_OFFSET) 
       + "," + (longitude + i * COORDINATE_OFFSET))) { 

      // If i = 0 then below if condition is same as upper one. Hence, no need to execute below if condition. 
      if (i == 0) 
       continue; 

      if (mapAlreadyHasMarkerForLocation((latitude - i 
        * COORDINATE_OFFSET) 
        + "," + (longitude - i * COORDINATE_OFFSET))) { 

       continue; 

      } else { 
       location[0] = latitude - (i * COORDINATE_OFFSET) + ""; 
       location[1] = longitude - (i * COORDINATE_OFFSET) + ""; 
       break; 
      } 

     } else { 
      location[0] = latitude + (i * COORDINATE_OFFSET) + ""; 
      location[1] = longitude + (i * COORDINATE_OFFSET) + ""; 
      break; 
     } 
    } 

    return location; 
} 

// Return whether marker with same location is already on map 
private boolean mapAlreadyHasMarkerForLocation(String location) { 
    return (markerLocation.containsValue(location)); 
} 

위의 코드에서 markerLocation은 HashMap입니다.

HashMap<String, String> markerLocation; // HashMap of marker identifier and its location as a string 

이 답변에는 Android 용 코드가 있지만 iOS에는 동일한 로직이 적용됩니다.

+0

좋은 해결 방법 –

0

(단일) 마커의 클릭 이벤트를 처리하고 Google 마커 캔버스 외부에있는 요소를 해당 마커의 사람들에 대한 세부 정보로 업데이트 할 수 있습니다.

+0

좋은 생각. 하지만 전체 화면에는 Google지도가 있습니다. – Geek

+0

InfoWindow를 사용하는 경우 - https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple –

+0

이미 사용하고 있습니다. 그러나 사용자는 마커를 여러 번 두드리는 경우에만 여러 마커에 대해 알게됩니다. – Geek

1

아마 마커 클러스터링을 살펴 봐야합니다. 같은 장소에 많은 마커를 표시하는 일반적인 솔루션입니다. 그것에 대해 구글 기사 : https://developers.google.com/maps/articles/toomanymarkers

도 존재하는 라이브러리가이 작업을 수행하는, 예를 들면 : 내가 사용

+2

당신이 제공 한 링크는 유용하지만 제 경우에는지도 상에 최대 12 개의 마커가 있습니다. 내 문제는 그들이 '정확히 똑같은'위치에 있다면 어떨까요? – Geek

0

오프셋을 지정하면 사용자가 최대로 확대 할 때 마커가 멀어집니다. 그래서 나는 그것을 성취 할 길을 찾았습니다. 이것은 적절한 방법이 아닐 수도 있지만 매우 잘 작동합니다. 당신이 그렇지 않으면 자동 스와핑 같은 마커를 애니메이션 것입니다, 당신은 상단에 표시 할 마커 아이콘을 볼 수 있도록

for loop markers 
{ 
//create marker 
let mapMarker = GMSMarker() 
mapMarker.groundAnchor = CGPosition(0.5, 0.5) 
mapMarker.position = //set the CLLocation 
//instead of setting marker.icon set the iconView 
let image:UIIMage = UIIMage:init(named:"filename") 
let imageView:UIImageView = UIImageView.init(frame:rect(0,0, ((image.width/2 * markerIndex) + image.width), image.height)) 
imageView.contentMode = .Right 
imageView.image = image 
mapMarker.iconView = imageView 
mapMarker.map = mapView 
} 

마커의 Z- 색인을 설정합니다. 사용자가 마커를 탭하면 zIndex 스왑을 사용하여 마커를 맨 위에 가져 오도록 zIndex를 처리합니다.

관련 문제