Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Po stronie przeglądarki _ [Google Maps API v3] widoczność markerów z użyciem getZoom

Napisany przez: warland 18.02.2018, 14:53:07

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. });


Napisany przez: trueblue 18.02.2018, 15:15:17

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.

Napisany przez: trueblue 18.02.2018, 16:10:15

Podałem Ci wskazówkę. Również nie odnosi skutku?

Napisany przez: warland 18.02.2018, 17:53:00

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.


Napisany przez: trueblue 18.02.2018, 18:34:06

Dlaczego nadal funkcja obsługująca zdarzenie zoom_changed jest w środku pętli dodającej markery?

Napisany przez: warland 18.02.2018, 18:47:22

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. });

Napisany przez: trueblue 18.02.2018, 19:08:27

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.

Napisany przez: warland 18.02.2018, 19:51:53

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)