Как я могу получить видимые маркеры в Google Maps v2 на Android?

Как получить видимые маркеры в Google Maps v2 для Android? Я знаю, что могу использовать проекцию и исключить точки ‹ 0 и точки > размера экрана. Но я не хочу проверять по одному, это может быть слишком медленно, если у меня много маркеров. Есть ли простой способ? Или какое-то готовое решение? Если да, то какой?


person Felipe    schedule 18.07.2013    source источник


Ответы (4)


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

получить текущий прямоугольник "просмотр" карты (примечание: должен быть запущен в основном потоке)

    this.mLatLngBounds = this.mMap.getProjection().getVisibleRegion().latLngBounds;

отсортируйте 2 точки (вверху слева и внизу справа), чтобы мы могли использовать логику min/max

double lowLat;
double lowLng;
double highLat;
double highLng;

if (this.mLatLngBounds.northeast.latitude < this.mLatLngBounds.southwest.latitude)
{
lowLat = this.mLatLngBounds.northeast.latitude;
highLat = this.mLatLngBounds.southwest.latitude;
}
else
{
highLat = this.mLatLngBounds.northeast.latitude;
lowLat = this.mLatLngBounds.southwest.latitude;
}
if (this.mLatLngBounds.northeast.longitude < this.mLatLngBounds.southwest.longitude)
{
lowLng = this.mLatLngBounds.northeast.longitude;
highLng = this.mLatLngBounds.southwest.longitude;
}
else
{
highLng = this.mLatLngBounds.northeast.longitude;
lowLng = this.mLatLngBounds.southwest.longitude;
}

тогда в моем случае у меня были эти данные в базе данных, поэтому я мог использовать >= и ‹= для извлечения только тех контактов, которые мне нужны

person Corey Scott    schedule 19.07.2013
comment
this.mMap.getProjection().getVisibleRegion() является ответом! Это так просто, я не знаю, как я не мог понять это раньше. Спасибо! - person Felipe; 19.07.2013

Вы можете использовать библиотеку android-map-extensions. Среди прочего, он предлагает метод List GoogleMap.getDisplayedMarkers().

person Stefan    schedule 29.07.2013

Вы можете добавить эту функцию расширения в класс GoogleMap, если используете Kotlin.

fun GoogleMap.isMarkerVisible(markerPosition: LatLng) =
        projection.visibleRegion.latLngBounds.contains(markerPosition)

Вы просто передаете позицию маркера в качестве параметра этого метода и делаете с результатом все, что хотите.

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

Надеюсь, поможет!

person Emilio Quattrocchio    schedule 08.08.2019
comment
Отлично, спасибо - person HasH; 24.03.2021

Вы ищете любой маркер: https://developers.google.com/maps/documentation/android/marker

private GoogleMap mMap;
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.addMarker(new MarkerOptions()
    .position(new LatLng(0, 0))
    .title("Hello world"));

Или прямое рисование: https://developers.google.com/maps/documentation/android/shapes

// Instantiates a new Polyline object and adds points to define a rectangle
PolylineOptions rectOptions = new PolylineOptions()
    .add(new LatLng(37.35, -122.0))
    .add(new LatLng(37.45, -122.0))  // North of the previous point, but at the same longitude
    .add(new LatLng(37.45, -122.2))  // Same latitude, and 30km to the west
    .add(new LatLng(37.35, -122.2))  // Same longitude, and 16km to the south
    .add(new LatLng(37.35, -122.0)); // Closes the polyline.

// Get back the mutable Polyline
Polyline polyline = myMap.addPolyline(rectOptions); 
person Corey Scott    schedule 19.07.2013
comment
Привет @CoreyScott, спасибо за ваш ответ, но я думаю, что вы не поняли мой вопрос, или я плохо выразился. У меня уже есть экземпляр карты, я уже добавил много маркеров. Но представьте, что пользователь меняет квадрант карты, и теперь я хочу получить маркеры, на которые смотрит пользователь. Это может быть несколько маркеров или даже ноль. Теперь ты понял? - person Felipe; 19.07.2013