google maps api GDownloadUrl return

0

witam serdecznie,
mam taki problem
mam taki oto kod:

function wczytajObj(icon){
               var markers = [];
          

               var icon1 = icon;
               GDownloadUrl('objmapxml.xml',function(dane,kodOdpowiedzi)
               {
                    if(kodOdpowiedzi==200)
                    {
                        var xml = GXml.parse(dane);
                        var markery = xml.documentElement.getElementsByTagName("marker");
                        for(var i=0; i<markery.length; i++)
                        {                            
                                var lat			=	parseFloat(markery[i].getAttribute("lat"));
                                var lon			=	parseFloat(markery[i].getAttribute("lng"));
                                var nazwa		=	markery[i].getAttribute("nazwa");
                                var marker = new GMarker(new GLatLng(lat,lon));
                                markers.push(marker);
                        }
                        alert('Wczytano '+markery.length+' markerów z pliku dane1.xml');
                    }
                    else
                    {
                        alert('Nie mogłem otworzyć pliku dane1.xml');
                    }   
               });
            
           }

problem polega na tym ze chcialbym zwrocic tablice markers ale nie wiem kiedy i w jakie sposob:| kiedy zrobie to bezposrednio po forze to dostaje undefined a jesli na koniec funkcji to rozmiar jest 0. ma ktos moze jakies rozwiazanie?

dziekuje i pozdrawiam

0

bo funkcja wewnątrz się wykonuje asynchronicznie - gdy dane są już pobrane, funkcja wczytajObj jest już dawno zakończona, więc nie może zwrócić danych z przyszłości

potrzebujesz albo zmianę podejścia - rozwalenie funkcji do której chcesz zwrócić dane na dwie części i wywołanie tej drugiej części wewnątrz funkcji (po forze) podając tablicę markers, lub zmianę narzędzia - zastosowanie skryptu pozwalającego na synchroniczne pobranie danych, przy czym polecam te pierwsze wyjście

0

no wlasnie najpierw zrobilem tak jak radzisz czyli 1 podejscie..i faktycznie dziala fajnie..ale problem polega na tym ze dane do markers beda parsowane z 2 a pozniej wiekszej ilosci odrebnych plikow xml. i jak to wtedy polaczyc w jedna duza tablice markers? asynchronicznosc bedzie dobra bo mi nie zamuli za bardzo funckojonalnosci portalu..ale jak to ogarnac zeby bylo dobrze?

0

przykładowo markers zrób zmienną globalną (lub tak żeby była widoczna z wszystkich tych funkcji), dorzuć jeszcze jedną zmienną globalną liczącą ilość zadań w toku, zwiększaj tę zmienną przy każdym wywołaniu GDownloadUrl a w tej anonimowej funkcji w środku ją zmniejszaj i gdy dojdzie do zera, wywołaj funkcję kończącą operującą na gotowej tablicy markers

ale zastanów się czy na pewno potrzebujesz tej tablicy w całości na raz - czy nie możesz operować na tych obiektach na żywo

0

co znaczy na zywo? generalnie idea jest taka: mam sobie powiedzmy 5000 punktow do dodania z roznych plikow xml.. zeby to ogarnac uzywam markerclusterer stad ta tablica markers. no i jak to zrobic na zywo i to jeszcze tak zeby to nie zabijalo przegladarki?

0

no to w tym przypadku mówiąc operacje "na żywo" miałbym na myśli skorzystanie z MarkerClusterer.addMarkers

czyli na początku tworzysz pusty MarkerClusterer (lub go czyścisz przez ::clearMarkers), potem wywołujesz zapytania do tych wszystkich xmlów a w funkcjach kończących ściąganie (czyli tam gdzie chciałeś dać return) dodajesz lokalne sety markerów poprzez MarkerClusterer.addMarkers(markers);

czyli nawet nie potrzebujesz dużych zmian w kodzie

0

czyli markerclusterer ma byc zmienna globalna do ktorej maja dostep wszystkie funkcje? i wtedy na nim sobie operuje robiac add/clear itd? dobrze to rozumiem? czy moze jest jakis sposob na przekazanie go do funkcji i zmienianie zewnetrznej zmiennej w srodku funkcji?

0
  1. tak, właśnie o to mi chodziło
  2. zauważ że tablica "markers" jest właśnie zmienną zewnętrzną którą zmieniasz w środku funkcji
    w ten sam sposób możesz przekazywać markerclusterer (wystarczy że ją przekażesz jako parametr funkcji wczytajObj i ta zmienna będzie widoczna wewnątrz funkcji anonimowej jako że jest tworzona wewnątrz tamtej funkcji)

drugi przypadek trochę bardziej złożony i pójdzie parę cykli procesora więcej, ale za to będzie to bardziej elastyczne i będzie można łatwiej stosować kilka map z różnymi markerclustererami na jednej stronie

ja prawdopodobnie stworzyłbym do tego klasę, ale mną się nie przejmuj bo ja po prostu lubię klasy i nie lubię zmiennych globalnych ;)

0

wersja 1 jest prosta i ku niej sie sklaniam . jesli chodzi o 2 to przekazanie markers jako parametr nic nie daje. czyli zewnetrzna zmienna nie jest modyfikowana... czyli wniosek jest tak ze globalne rzadza..chociaz na studiach uczyli ze globalne zmienne sa srednim pomyslem..jednak tu uwazam ze sie nadadza. dzisiaj przetestuje rozwiazanie i zdam relacje

0

nie przekazanie markers, ale przekazanie markerClusterer
pokaż kod, bo to musi działać

0

dobra...dodawanie punktow dziala ale teraz mam problem z usuwaniem:/
mialem 2 pomysly:

  1. markerCluster.clearMarkers();
    ale potem jak dodawalem markery to mapa jakby sie nie odswiezala przy zoomie czyli ten cluster sie nie rozdzielal:/

wiec wpadlem na pomysl ze napisze wlasna funkcje do usuwania wiec skonstruowalem:
2)

for (var i =0; i<markersObj.length; i++){
                              marker = markersObj[i];
                              markerCluster.removeMarker(marker);
                          }

ale to ma 2 minusy po pierwsze jak jest juz zoom taki ze widac pojedynczy obiekt to przestaje dzialac:/ no a drugi minus odswiezania..znaczy ze jak usune punkty to dopiero po zoomie widac efekt...

1 użytkowników online, w tym zalogowanych: 0, gości: 1