2015-08-14 4 views
2

У меня есть метод, называемый маркером create, который принимает LatLng и цвет для создания маркера с определенной координатой.Android: проверьте, существует ли маркер карты Google на основе цвета

public void createMarker(LatLng latLong, float thisNewColor){ 
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
    if(mMap != null) { 
     mMap.addMarker(options).showInfoWindow(); 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17); 
     mMap.animateCamera(cameraUpdate); 
     mMap.setMyLocationEnabled(true); 
    } 
} 

Основываясь на пользователя, отправляющего новое место, которое будет зеленый маркер, карта должна обновлять каждый раз он посылает новое место. Как я могу проверить, существует или нет зеленый маркер, и удалить и создать новый, если он существует?


EDIT

Эта нить выполняется в фоновом режиме и, когда новое место LatLng найден, он выполняет метод createMarker с зеленым цветом. Поэтому мне нужно, чтобы проверить, что существует, и заменить его, если новый LatLng получает нить:

@SuppressWarnings("unused") 
public void onEventMainThread(DisplayNewLocation displayNewLocation){ 
    newLatLngToDisplay = displayNewLocation.getNewLatLng(); 
    this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN); 
} 

EDIT 2

Вот моя попытка проверить, что добавленный маркер существует , а затем установить его невидимым и попытаться перезаписать его, используя глобальный логический флаг. При построении и тестировании он не переопределяет маркер, он просто создает новый. Следовательно, почему я думаю, что было бы проще сделать это с помощью цвета маркера.

@SuppressWarnings("unused") 
    public void onEventMainThread(DisplayNewLocation displayNewLocation){ 
     if(isPeerLocation){ 
      this.peerLocation.visible(false); 
     } 
     newLatLngToDisplay = displayNewLocation.getNewLatLng(); 
     this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN); 
     Log.e("NEwLatLng Success!- ", newLatLngToDisplay.toString()); 
} 

public void createMarker(LatLng latLong, float thisNewColor){ 
    if(thisNewColor == BitmapDescriptorFactory.HUE_GREEN){ 
     peerLocation = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
     this.isPeerLocation = true; 
    }else{ 
     options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
     this.isPeerLocation = false; 
    } 

    //MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
    if(mMap != null) { 
     if(isPeerLocation) { 
      mMap.addMarker(peerLocation).showInfoWindow(); 
     }else{ 
      mMap.addMarker(options).showInfoWindow(); 
     } 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17); 
     mMap.animateCamera(cameraUpdate); 
     mMap.setMyLocationEnabled(true); 
    } 
} 

Благодаря

+0

По цвету это невозможно. Но вы можете сделать это, используя «MarkerId» –

+0

. Проблема заключается в том, что маркер создается динамически без идентификатора маркера. Поскольку создание основано на том, когда пользователь решает отправить свое местоположение клиенту. – TejjD

+0

, но вы можете setId() и getId(). –

ответ

0

Так что я решил свою проблему. Это не идеальное решение, но оно решает мою проблему.

Я просто добавил флаг, чтобы проверить, анализируется ли местоположение сверстника методу createMarker. Если это так, карта очищается, а исходное местоположение клиентов перерисовывается с новым местоположением сверстников.

public void createMarker(LatLng latLong, float thisNewColor, boolean isPeerLocation){ 
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
    if(mMap != null) { 
     if(isPeerLocation){ 
      mMap.clear(); 
      //This is the method that is called to place your current location on the map 
      handleNewLocation(location); 
     } 
     mMap.addMarker(options).showInfoWindow(); 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17); 
     mMap.animateCamera(cameraUpdate); 
     mMap.setMyLocationEnabled(true); 
    } 
} 
0

По цвету это не представляется возможным, так ясно все маркер, прежде чем новый маркер создается

Редактировать

попробовать

Marker marker; 

if(marker!=null) { 
marker.remove(); 
marker=mMap.addMarker(options); 
} 
+0

Я не могу очистить все маркеры. Начальный маркер должен оставаться, а зеленый маркер показывает обновленное местоположение на основе того, когда пользователь решает отправить новое местоположение. – TejjD

+0

- это начальный маркер фиксированной позиции? – userDroid

+0

Да, это маркер изначально связанных лиц на его карте. Когда репортер решит отправить ему место, новое место будет зеленым. Если партнер решает отправить другое местоположение, тогда необходимо заменить старое отправленное местоположение. – TejjD

1

Вы можете создать HashMap (ключ - это цвет, MarkerOptions в качестве значения), в котором вы будете хранить все маркеры, а затем manu , если маркер существует внутри HashMap.

EDIT

Попробуйте этот код

Map<Integer, Marker> mMarkers = new HashMap<>(); 
public void createMarker(LatLng latLong, float thisNewColor){ 
    MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
    if(mMap != null) { 
     if (mMarkers.contains(thisNewColor)){ 
      Marker old = mMarkers.get(thisNewColor); 
      old.remove(); 
     } 
     Marker marker = mMap.addMarker(options); 
     marker.showInfoWindow(); 
     mMarkers.put(thisNewColor, marker); 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17); 
     mMap.animateCamera(cameraUpdate); 
     mMap.setMyLocationEnabled(true); 
    } 
} 
+0

Это не работает. Все, что происходит, заключается в том, что вы удаляете маркер из HashMap, а не из самой карты Google. Просто проверено, и это дает результат, который я объяснил. – TejjD

+0

@TejjD Когда вы вызываете old.remove(), маркер должен удаляться из карты. См. Документацию - https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#remove(). Это не работает? – Oleksandr

+0

Это не работает, потому что вы устанавливаете экземпляр Marker на значение карты и затем удаляете эту ссылку. Не ссылка, на которую указывает карта. Пройдите через логику. – TejjD

0

Почему вы не используете setPosition() вашего маркера?

Если у вас всегда есть только один маркер, вы можете просто сохранить его, а затем сменить позицию.

private Marker mMarker; 

public void createMarker(LatLng latLng, float thisNewColor, boolean isPeerLocation) { 
    if (mMap == null) return; 
    if (mMarker != null) { 
     //update existing 
     mMarker.setPosition(latLng); 
    } else { 
     // create new marker 
     MarkerOptions options = new MarkerOptions() 
       .position(latLng) 
       .draggable(false) 
       .icon(BitmapDescriptorFactory.defaultMarker(thisNewColor)); 
     mMarker = mMap.addMarker(options); 
    } 
    mMarker.showInfoWindow(); 
    ... 
} 

Если у вас много маркеров, ответ Александра правильный. Ссылки на маркер в HashMap и в GoogleMaps одинаковы.