GoogleMap에서 마커 제거


124

새로운 Android 용 Google Maps API 에서 마커를 추가 할 수 있지만 마커 를 (쉽게) 삭제할 수있는 방법은 없습니다.

내 해결책은 마커를지도에 유지하고 마커를 제거하고 싶을 때지도를 다시 그리는 것이지만 그다지 효율적이지 않습니다.

private final Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();

private void add(String name, LatLng ll) {
  final MarkerOptions marker = new MarkerOptions().position(ll).title(name);
  mMarkers.put(name, marker);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.addMarker(marker);
    }
  });
}

private void remove(String name) {
  mMarkers.remove(name);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.clear();

      for (MarkerOptions item : mMarkers.values()) {
        mMap.addMarker(item);
      }
    }
  });
}

누구든지 더 나은 아이디어가 있습니까?


마커를 추가하기 위해 Runnable ()을 사용하는 이유는 무엇입니까?
user3927312

UI 스레드에서 수행하려면
Jonas

모든 마커를 지우려면 mMap.clear () 사용
Bahaa Salaheldin

답변:


260

에 대한 메서드 서명 addMarker은 다음과 같습니다.

public final Marker addMarker (MarkerOptions options)

따라서 마커에 대한 GoogleMap옵션을 지정하여에 마커를 추가 할 때 Marker반환 된 객체를 저장해야합니다 ( MarkerOptions생성하는 데 사용한 객체 대신 ). 이 개체를 사용하면 나중에 마커 상태를 변경할 수 있습니다. 마커 작업이 끝나면를 호출 Marker.remove()하여지도에서 마커 를 제거 할 수 있습니다.

잠시만 숨기고 싶다면를 호출하여 마커의 가시성을 전환 할 수 있습니다 Marker.setVisible(boolean).


1
이것은 나를 위해 작동하지 않습니다. marker.setVisible (false), marker.remove (), 심지어 markerManager.remove (marker)도지도에 영향을주지 않습니다. 마커는 여전히 남아 있습니다. 힌트가 있습니까?
Totalys

1
마커를 유지하는 방법에 대한 아래의 내 의견을 참조하십시오. 마커가지도에서 제거 된 후에는 거의 사용하지 않습니다. 값을 조사하기로 결정해야합니다. Remove 메서드는 태그 값을 null로 설정합니다 ...
Speckpgh

영리한! 감사!
Taslim Oseni

32

이렇게지도에 마커를 추가하세요

Marker markerName = map.addMarker(new MarkerOptions().position(latLng).title("Title"));

그런 다음 remove 메서드를 사용할 수 있으며 해당 마커 만 제거됩니다.

markerName.remove();

25

지도 사용에있는 모든 낙서를 지우려면

map.clear()

14
이렇게하면 질문에서 알 수 있듯이 마커뿐만 아니라지도의 모든 오버레이가 지워집니다.
Emzor

4

마커가 있으면 마지막 마커를 제거합니다. 마커가 존재하지 않는 경우 현재 마커 생성

Marker currentMarker = null;
if (currentMarker!=null) {
    currentMarker.remove();
    currentMarker=null;
}

if (currentMarker==null) {
    currentMarker = mMap.addMarker(new MarkerOptions().position(arg0).
    icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}

3

Kotlin 언어를 사용하는 경우 다음 코드를 추가하면됩니다.

GoogleMapMarker유형 의 전역 변수를 만듭니다 .

변수 마커를 사용하여 변수 마커 값을 직접 변경할 수 있습니다.

private lateinit var map: GoogleMap
private lateinit var marker: Marker

그리고이 함수 / 방법을 사용하여지도에 마커를 추가합니다.

private fun placeMarkerOnMap(location: LatLng) {
    val markerOptions = MarkerOptions().position(location)
    val titleStr = getAddress(location)
    markerOptions.title(titleStr)
    marker = map.addMarker(markerOptions)
}

함수를 만든 후이 코드를에 배치 onMapReady()하여 마커를 제거하고 새 마커를 만듭니다.

map.setOnMapClickListener { location ->
        map.clear()
        marker.remove()
        placeMarkerOnMap(location)
    }

마커를 클릭 할 때 주소 위치를 표시하려면이 코드를 추가하여 마커 주소를 숨기고 표시하지만 주소 위치를 가져 오는 방법이 필요하면 보너스입니다. 이 게시물에서 코드를 받았습니다. 위도와 경도에서 완전한 주소를 얻는 방법?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }

2

다음 코드를 사용하십시오.

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
       @Override
       public boolean onMarkerClick(Marker marker) {

           marker.remove();
           return true;
       }
   });

"마커" 를 클릭 하면 제거 할 수 있습니다.


2

그냥 메모, 오늘 밤 추적하는데 시간을 낭비한 것 ...

어떤 이유로 마커를 유지하기로 결정한 경우지도에서 마커를 제거한 후 ... getTag는 마커가 생성 될 때 설정 한 값으로 나머지 get 값이 반환 되더라도 NULL을 반환합니다. .

마커를 제거한 다음이를 참조하려고하면 TAG 값이 NULL로 설정됩니다.

나에게 버그처럼 보인다 ...


1

1. 마커를 제거하려면 marker.remove(); 다른 방법으로 마커를 제거하는 대신 숨길 수 있습니다.

 marker.setVisible(false);

나중에 필요할 때마다 볼 수 있도록합니다.
2. 그러나지도에서 모든 마커를 제거 하려면 map.clear();
참고 : map.clear(); 등도 제거합니다 Polylines, Circles.
3.Polylines, Circles 등 을 제거하지 않으려면 마커 길이에 대한 루프를 사용하여 (여러 마커가있는 경우) 제거합니다. 여기에 예를 체크 아웃 또는 그들에게 눈에 보이는 거짓을 설정하고 사용하지 않는 map.clear();등의 경우.


1

마커를 추적하기 위해 전역 변수 만들기

private Marker currentLocationMarker;

// 이전 마커 제거

            if (null != currentLocationMarker) {
                currentLocationMarker.remove();
            }

// 업데이트 된 마커 추가 및 카메라 이동

            currentLocationMarker = mMap.addMarker(new MarkerOptions().position(
                    new LatLng(getLatitude(), getLongitude()))
                    .title("You are now Here").visible(true)
                    .icon(Utils.getMarkerBitmapFromView(getActivity(), R.drawable.auto_front))
                    .snippet("Updated Location"));

            currentLocationMarker.showInfoWindow();

0

지도에 추가 할 때 모든 마커가있는 배열을 만듭니다.

나중에 다음을 사용하십시오.

Marker temp = markers.get(markers.size() - 1);
temp.remove();

0

GoogleMaps-MapWithMarker 프로젝트 의 예를 따르는 사람들의 경우 그렇게 하여 마커를 제거 할 수 있습니다.

override fun onMapReady(googleMap: GoogleMap?) {
    googleMap?.apply {

        // Remove marker
        clear()

        val sydney = LatLng(-33.852, 151.211)
        addMarker(
            MarkerOptions()
                .position(sydney)
                .title("Marker in Sydney")
        )
        moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.