Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Google Maps API v3] widoczność markerów z użyciem getZoom
Forum PHP.pl > Forum > Po stronie przeglądarki
warland
Witam.
Czy ktoś potrafi mi pomóc w zrozumieniu czemu nie działa mi w skrypcie opcja ukrywania markerów przy pomniejszeniu mapy?
Użyłem getZoom z marker.setMap a także z marker.visible i nic nie daje mi rezultatu chociaż w innych skryptach z użyciem google maps api działa bez zarzutu.

Część kodu odpowiedzialna za widoczność markerów:
  1. google.maps.event.addListener(map, 'zoom_changed', function() {
  2. zoom = map.getZoom();
  3.  
  4. if (zoom < 10) {
  5. marker.visible = false;
  6. } else {
  7. marker.visible = true;
  8. }
  9. });

trueblue
Obsługa zoom powinna być wyprowadzona poza pętlę tworzącą markery (jaki jest sens podpinania takiej funkcji przy tworzeniu każdego markera?). Tam też powinna być iteracja po wszystkich markerach i chowanie/ukrywanie w zależności od powiększenia mapy.
trueblue
Podałem Ci wskazówkę. Również nie odnosi skutku?
warland
Spróbowałem w ten sposób:
  1. google.maps.event.addListener(map, 'zoom_changed', function() {
  2. var zoom = map.getZoom();
  3. for (i = 0; i < locations.length; i++) {
  4. markers[i].setVisible(zoom <= 10);
  5. }
  6. });


działa to ładnie gdy dodam go w przykładowym kodzie wyciągniętym ze skryptu co link podałem w pierwszym poście ale już po wprowadzeniu u mnie nie reaguje.

trueblue
Dlaczego nadal funkcja obsługująca zdarzenie zoom_changed jest w środku pętli dodającej markery?
warland
markery są tworzone w czasie rzeczywistym i usuwanie przez graczy. Aby w grze aktualizowały się zaraz po wykonaniu działania innej opcji nie da rady zastosować.
Co do problemu który miałem dokładniej mi to wyjaśnili na stackoverflow.
Wystarczyło potem odpowiedni wzór zastosować i tyle.
W moim projekcie już perfekt hula opcja zoom. Podpiąłem złą tablicę i dlatego nie działało. Teraz już ok.

Problem mam jeszcze z przestawieniem ikon markerów by znajdowały się niżej niż w tej chwili i nie wiem na razie jak to obejść.
Może ktoś wie jak to zrobić.
  1. marker = new google.maps.Marker({
  2. position: latlng,
  3. map: map,
  4. visable: true,
  5. icon: icon_p
  6. });
trueblue
Nie ma znaczenia, że markery są tworzone w czasie rzeczywistym. Zdarzenie zoom_change nie dotyczy markerów tylko mapy i takie powinno być obsłużone poza pętlą tworzącą markery. Podpinasz raz, w środku przebiegasz po tablicy markerów i włączasz/wyłączasz.
Teraz oczywiście iterujesz po pętli markerów, o czym pisałem wcześniej, natomiast nadal bezsensownością jest podpinanie zdarzenia tyle razy ile tworzysz markerów. W ten sposób przy każdym przybliżaniu/oddalaniu mapy będziesz przelatywał po pętli markerów nie 1 raz, a tyle razy ile tych markerów tworzysz na początku. Jeśli więc utworzysz 100 markerów , to pętla for (i = 0; i < boxes2.length; i++) wykona się 100 razy, zamiast jednokrotnie.

Być może Tobie jest potrzebna zmiana właściwości anchor lub origin markera. Nie wiem jednak co znaczy, że marker ma być niżej. Niżej jeśli chodzi o współrzędne geograficzne, czy niżej w pikselach.
warland
Pewne jest że masz dużo racji w tym co piszesz. Jednak moja świadomość kodowania jest jeszcze zbyt niska by to zrobić tak jak piszesz.
Próbowałem to wyprowadzić poza pętle i za każdym razem kończyło się to tym że dopiero po odświeżeniu strony ręcznie aktualizowały się znaczniki.

Dla mnie i tak sukces jest wprowadzenie rozwiązań które wg. wielu opinii nie mają prawa zaistnieć we współdziałaniu z api google maps (a raczej wymagają głębszej wiedzy niż posiadam).
Co do umiejscowienia znaczników. Chodzi raczej o piksele względem pozycji oryginalnej ponieważ w wypadku zmiany współrzędnych geograficznych automatycznie hexagony mi wariują.
Próbowałem z anchor:
  1. var icon_p = {
  2. url: icon_m,
  3. origin: new google.maps.Point(0, 0),
  4. anchor: new google.maps.Point(7, 9),
  5. labelOrigin: new google.maps.Point(0,0)
  6. };


Działa. Jednak tylko na znaczniki już będące na mapie po wejściu na stronę. W czasie rzeczywistym po wykonaniu działania utworzenia nowego znacznika pojawia się on na oryginalnym położeniu bez uwzględnienia anchor. Dopiero po odświeżeniu strony jest na miejscu które wskazuje anchor.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.