Как получить видимые маркеры в Google Maps v2 для Android? Я знаю, что могу использовать проекцию и исключить точки ‹ 0 и точки > размера экрана. Но я не хочу проверять по одному, это может быть слишком медленно, если у меня много маркеров. Есть ли простой способ? Или какое-то готовое решение? Если да, то какой?
Как я могу получить видимые маркеры в Google Maps v2 на Android?
Ответы (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;
}
тогда в моем случае у меня были эти данные в базе данных, поэтому я мог использовать >= и ‹= для извлечения только тех контактов, которые мне нужны
Вы можете использовать библиотеку android-map-extensions. Среди прочего, он предлагает метод List GoogleMap.getDisplayedMarkers().
Вы можете добавить эту функцию расширения в класс GoogleMap, если используете Kotlin.
fun GoogleMap.isMarkerVisible(markerPosition: LatLng) =
projection.visibleRegion.latLngBounds.contains(markerPosition)
Вы просто передаете позицию маркера в качестве параметра этого метода и делаете с результатом все, что хотите.
Если вы используете Java, вы можете просто объявить функцию там, где вам больше подходит.
Надеюсь, поможет!
Вы ищете любой маркер: 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);