Как мога да получа видимите маркери в Google Maps v2 за Android? Знам, че мога да използвам Projection и да премахна точки ‹ 0 и точки > размер на екрана. Но не искам да проверявам един по един, може да е твърде бавно, ако имам много маркери. Има ли лесен начин? Или някакво готово решение? Ако да, кой?
Как мога да получа видимите маркери в Google Maps v2 в Android?
Отговори (4)
Добре, следното е кодът, който използвах преди, за да определя какво може да види потребителят и след това да начертая само маркерите, които са видими. Мисля, че може да успеете да го адаптирате към вашата цел.
вземете текущия правоъгълник "viewport" на картата (забележка: трябва да се изпълнява в главната нишка)
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;
}
тогава в моя случай имах тези данни в db, така че можех да използвам >= и ‹=, за да извлека само щифтовете, които исках
Можете да използвате библиотеката android-map-extension. Наред с други предлага метод 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);