Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Google Maps API v3] widoczność markerów z użyciem getZoom
warland
post 18.02.2018, 14:53:07
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


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



Ten post edytował warland 19.02.2018, 10:25:03
Go to the top of the page
+Quote Post
trueblue
post 18.02.2018, 15:15:17
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
trueblue
post 18.02.2018, 16:10:15
Post #3





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
warland
post 18.02.2018, 17:53:00
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


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.



Ten post edytował warland 19.02.2018, 09:53:59
Go to the top of the page
+Quote Post
trueblue
post 18.02.2018, 18:34:06
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
warland
post 18.02.2018, 18:47:22
Post #6





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


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. });
Go to the top of the page
+Quote Post
trueblue
post 18.02.2018, 19:08:27
Post #7





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
warland
post 18.02.2018, 19:51:53
Post #8





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


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.

Ten post edytował warland 19.02.2018, 16:18:43
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 07:10