Mam zestaw punktów, które chcę narysować na wbudowanej Mapie Google (API v3). Chciałbym, aby granice obejmowały wszystkie punkty, chyba że poziom powiększenia jest zbyt niski (tj. Zbyt duży oddalenie). Moje podejście wyglądało tak:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
To nie działa Ostatni wiersz „gmap.setZoom ()” nie zmienia poziomu powiększenia mapy, jeśli zostanie wywołany bezpośrednio po fitBounds.
Czy istnieje sposób na uzyskanie poziomu powiększenia granic bez zastosowania go na mapie? Inne pomysły na rozwiązanie tego?
Odpowiedzi:
Edycja : Zobacz komentarz Matta Diamonda poniżej.
Rozumiem! Spróbuj tego:
Dostosuj do swoich potrzeb.
źródło
Rozwiązałem podobny problem w jednej z moich aplikacji. Byłem trochę zdezorientowany twoim opisem problemu, ale myślę, że masz ten sam cel, który miałem ...
W mojej aplikacji chciałem wykreślić jeden lub więcej znaczników i upewnić się, że mapa pokazuje je wszystkie. Problem polegał na tym, że gdybym polegał wyłącznie na metodzie fitBounds, poziom powiększenia byłby maksymalny, gdyby istniał jeden punkt - to nie było dobre.
Rozwiązaniem było użycie fitBounds, gdy było wiele punktów, i setCenter + setZoom, gdy był tylko jeden punkt.
źródło
Odwiedziłem tę stronę wiele razy, aby uzyskać odpowiedź i chociaż wszystkie istniejące odpowiedzi były bardzo pomocne, nie rozwiązały dokładnie mojego problemu.
Zasadniczo stwierdziłem, że zdarzenie „zoom_changed” zapobiegło „pomijaniu” interfejsu użytkownika, który miał miejsce, gdy czekałem na zdarzenie „bezczynności”.
Mam nadzieję, że to komuś pomoże!
źródło
fitBounds()
jeśli używaszzoom_changed
bounds_changed
, ponieważzoom_changed
nie trzeba go uruchamiać w przypadku, gdyfitBounds
utrzymuje poziom powiększenia. Moja próba jsfiddle.net/rHeMp/10 tego nie potwierdza, ale nie należy polegać na niezdefiniowanym zachowaniu.Właśnie to naprawiłem, ustawiając maxZoom z góry, a następnie usuwając go później. Na przykład:
źródło
Jeśli się nie mylę, zakładam, że chcesz, aby wszystkie twoje punkty były widoczne na mapie z możliwie najwyższym poziomem powiększenia. Osiągnąłem to, inicjując poziom powiększenia mapy do 16 (nie jestem pewien, czy jest to najwyższy możliwy poziom powiększenia w V3).
Potem zrobiłem rzeczy na granicy:
Wynik: sukces!
źródło
Używam:
Spowoduje to użycie mniejszego z 24 i niezbędnego poziomu powiększenia zgodnie z Twoim kodem, jednak prawdopodobnie i tak to zmieni i nie będzie miało znaczenia, jak bardzo pomniejszyłeś.
źródło
Spróbuj tego:
źródło
Miałem ten sam problem i udało mi się go rozwiązać za pomocą następującego kodu. To
google.maps.addListenerOnce()
zdarzenie listener ( ) zostanie uruchomione tylko raz, zaraz pomap.fitBounds()
jego wykonaniu. Więc nie ma takiej potrzebyidle
.Początkowo ustawia odpowiedni poziom powiększenia i pozwala użytkownikowi powiększać i pomniejszać początkowy poziom powiększenia, ponieważ detektor zdarzeń wygasł. Na przykład, jeśli tylko
google.maps.addListener()
został wywołany, użytkownik nigdy nie byłby w stanie wykonać powiększenia przekraczającego podany poziom powiększenia (w przypadku 4). Po wdrożeniugoogle.maps.addListenerOnce()
użytkownik będzie mógł przybliżyć się do dowolnego wybranego przez siebie poziomu.źródło
Miał ten sam problem, musiał zmieścić wiele znaczników na mapie. To rozwiązało moją sprawę:
bounds.extend(objLatLng)
)Wykonaj dopasowania PO ukończeniu mapy:
źródło
Znalazłem rozwiązanie, które sprawdza, zanim zadzwonisz,
fitBounds
aby nie powiększać i nie pomniejszać nagleBędziesz musiał pobawić się zmienną minLatSpan, aby dostać się tam, gdzie chcesz. Będzie się różnić w zależności od poziomu powiększenia i wymiarów płótna mapy.
Możesz także użyć długości geograficznej zamiast szerokości geograficznej
źródło
Widziałem wiele niepoprawnych lub zbyt skomplikowanych rozwiązań, więc postanowiłem opublikować działające, eleganckie rozwiązanie .
Powód
setZoom()
nie działa zgodnie z oczekiwaniami, ponieważfitBounds()
jest asynchroniczny, więc nie daje żadnej gwarancji, że natychmiast zaktualizuje powiększenie, ale twoje połączeniesetZoom()
polega na tym.To, co możesz rozważyć, to ustawienie
minZoom
opcji mapy przed wywołaniem,fitBounds()
a następnie wyczyszczenie jej po jej zakończeniu (aby użytkownicy nadal mogli ręcznie pomniejszyć, jeśli chcą):Ponadto, jeśli chcesz również ograniczyć maksymalny zoom, możesz zastosować tę samą sztuczkę z
maxZoom
właściwością.Zobacz dokumenty MapOptions .
źródło
Używam tego, aby upewnić się, że poziom powiększenia nie przekracza ustalonego poziomu, dzięki czemu wiem, że zdjęcia satelitarne będą dostępne.
Dodaj detektor do
zoom_changed
wydarzenia. Ma to tę dodatkową zaletę, że kontroluje także zoom w interfejsie użytkownika.Wykonuj tylko w
setZoom
razie potrzeby, więcif
instrukcja jest lepsza niżMath.max
lubMath.min
Aby zapobiec zbyt dużemu oddaleniu:
źródło
W tej funkcji musisz dynamicznie dodawać metadane, aby przechowywać typ geometrii tylko dlatego, że funkcja akceptuje dowolną geometrię.
„fitGeometries” to funkcja JSON rozszerzająca obiekt mapy.
„geometrii” to ogólna tablica javascript, a nie MVCArray ().
źródło
ta praca jest dla mnie z API v3, ale z ustawionym stałym powiększeniem:
źródło
Podobnie jak ja, jeśli nie chcesz grać ze słuchaczami, wpadłem na proste rozwiązanie: dodaj metodę na mapie, która działa ściśle według twoich wymagań, takich jak ta:
możesz zadzwonić
map.fitLmtdBounds(bounds)
zamiastmap.fitBounds(bounds)
ustawić granice w ramach zdefiniowanego zakresu zoomu ... lubmap.fitLmtdBounds(bounds,3,5)
zastąpić zakres zoomu ...źródło
Spróbuj tego.
Jeśli to ci pomoże.
Wszystkiego najlepszego
źródło
Po obliczeniu granic można sprawdzić odległość między lewym górnym a prawym dolnym rogiem; wtedy możesz zrozumieć poziom powiększenia, testując odległość (jeśli odległość jest zbyt daleko, poziom powiększenia byłby niski), możesz wybrać, czy używasz metody setbound lub setZoom ..
źródło
Nie lubię tego sugerować, ale jeśli musisz spróbować - najpierw zadzwoń
gmap.fitBounds(bounds);
Następnie utwórz nowy Thread / AsyncTask, pozwól mu spać przez około 20-50ms, a następnie zadzwoń
gmap.setZoom( Math.max(6, gmap.getZoom()) );
z wątku interfejsu użytkownika (użyj modułu obsługi lub
onPostExecute
metody AsyncTask).Nie wiem, czy to działa, tylko sugestia. Poza tym musiałbyś jakoś samodzielnie obliczyć poziom powiększenia na podstawie punktów, sprawdzić, czy jest on zbyt niski, poprawić go, a następnie po prostu zadzwonić
gmap.setZoom(correctedZoom)
źródło
Jeśli „bounds_changed” nie odpala poprawnie (czasem Google wydaje się, że nie akceptuje idealnie współrzędnych), rozważ użycie zamiast tego opcji „center_changed”.
Zdarzenie „center_changed” jest uruchamiane za każdym razem, gdy wywoływana jest funkcja fitBounds (), chociaż jest uruchamiane natychmiast i niekoniecznie po przesunięciu mapy.
W normalnych przypadkach „bezczynność” jest nadal najlepszym odbiornikiem zdarzeń, ale może to pomóc kilku osobom napotkać dziwne problemy z wywołaniami fitBounds ().
Zobacz Google Maps fitBounds oddzwonienia
źródło
Aby wdrożyć inne rozwiązanie - odkryłem, że podejście „nasłuchuj zdarzenia bounds_changed, a następnie ustaw nowe powiększenie” nie działało dla mnie niezawodnie. Myślę, że czasami
fitBounds
dzwoniłem, zanim mapa została w pełni zainicjowana, a inicjalizacja spowodowała zdarzenie bounds_changed, które zużyłoby nasłuchiwacza, zanimfitBounds
zmieniłem granice i poziom powiększenia. Skończyło się na tym kodzie, który wydaje się działać do tej pory:źródło
Dla mnie najłatwiejszym rozwiązaniem było:
źródło
źródło
Wszystko co zrobiłem to:
I działa na API V3.
źródło