Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Moja mapa:
po kliknięciu przycisku na mapie wyświetlają się
markery z pliku KML. Parsowaniem KML'a zajmuje się
skrypt: http://sterlingudell.com/geoxml3/geoxml3.js

Demo autora skryptu geoxml.js pokazuje markery wczytane z pliku KML:
http://sterlingudell.com/geoxml3/markers.html

Próbowałem różnych metod z usuwaniem markerów z mapy:

for(var i in markers){
markers[i].setMap(null);
}

markers=[];

Powyższa metoda nie działa dla markerów ładowanych za pomocą geoxml3.js

Próbowałem też metody zalecanej w referencjach biblioteki geoxml3.js
http://code.google.com/p/geoxml3/wiki/ParserReference

var geoXml=new geoXML3.parser({map:map});
geoXml.hideDocument(geoXml.docs);

Powyższa metoda nie usuwa markerów, nie działa.

Jak zaimplementować efekt pokaż/ukryj markery? Lub, jak je usunąć z mapy?
Siedzę już kilka dni nad tym fragmentem kodu, proszę o wszelkie sugestie.Krystian Pietruszka edytował(a) ten post dnia 09.08.10 o godzinie 13:45

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Wrzuc adres albo kod calego twojego skryptu, bo inaczej bardzo trudno Ci pomoc.
Dopoki parses KMLowy nie wrzuci markerow wlasnie do tablicy markers (musi byc zadeklarowana wczesniej globalnie) to metoda setMap(null) nie ma prawa dzialac.

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Do gotowego skryptu na pewno podam linka, ale na razie ma jakieś 150 kB i moimi wypocinami nie chciał bym Was raczyć do momentu ukończenia - pewnie bym tylko zamieszał.

Proszę o wskazanie jak np. w tym demo usuwanie markerów zaimplementować.
http://www.geocontext.org/pliki/2010/test-geoxml3/test1/

dalej już sobie poradzę i przeniosę do mojego skryptu.

Jak zajrzysz: http://www.geocontext.org/pliki/2010/test-geoxml3/test...
to w 79 linijce jest funkcja hideDocument, która ma takie markery usuwać
i jest tam tablica doc.markers.

Podejrzewam, że kluczem do rozwiązania jest ta metoda:

var geoXml=new geoXML3.parser({map:map});
geoXml.hideDocument(geoXml.docs);

ale markerów nie usuwa.

Dodam, że przejrzałem już cały internet łącznie z chińskim.

ps
I jeszcze jedno: na mojej mapie są jeszcze inne markery w tablicy markers
i je bez problemu usuwam metodą setMap(null). Problem jest tylko z tymi z pliku KML - po wczytaniu ich na mapę nie da się usunąć.Krystian Pietruszka edytował(a) ten post dnia 10.08.10 o godzinie 11:28

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Nie moge w tej chwili w zaden sposob testowac/uruchamiac skryptow, ale po zapoznaniu sie z klasa geoXML3 stwierdzilem ze geoXML3.docs to tablica sparsowanych dokumentow (deklaracja
var docs = [];
na poczatku metody parser), wiec moze odwolanie sie do
geoXml.hideDocument(geoXml.docs[0])
rozwiaze sprawe? Poniewaz parsujesz tylko jeden dokument to tablica powinna miec tylko 1 element, ale odwolanie do niego i tak bedzie wymagalo indeksu [0].

ewentualnie:

for(var i in geoXml.docs[0].markers){
geoXml.docs[0].markers[i].setMap(null);
}
geoXml.docs[0].markers=[];


Nie wiem tylko jak ponownie pokazac markery... parsowac kml-a od nowa? Trzeba by chyba bylo od nowa stworzyc obiekt geoXml zeby za bardzo nie nabalaganic. Ewentualnie wykorzystac jakas inna metode z klasy geoXML3.Tomek Rodakiewicz edytował(a) ten post dnia 09.08.10 o godzinie 22:11

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Zajrzalem w te metody hideDocument i showDocument - jedyne co tak na prawde robia to we wszystkich markerach uruchamiaja metode setVisible(), wiec chyba to bedzie dzialac najlepiej. Ale oczywiscie wywolywac metody z indeksem dokumentu [0] albo w petli wszystkie dokumenty.

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Prawie EUREKA!

To znaczy, drobna modyfikacja Twojej pętli usuwa markery na testowej mapie.
Przeniosłem do docelowego skryptu i wywala: docs[0] is undefined.

Jutro coś więcej napiszę i wrzucę na serwer.

Dziękuję za pomoc

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Działający przykład na bazie Twoich (@Tomek) propozycji
(parę słów dla Angoli: Hide KML markers in geoxml3):
http://www.geocontext.org/pliki/2010/test-geoxml3/test2/

Spośród wielu kombinacji jakie zastosowałem powyższa metoda działa
i nie wyrzuca żadnych błędów. Usunąłem zawartość funkcji hideDocument
i wstawiłem tam Twoją pętlę.

Bardzo ważne aby:
geoXml=new geoXML3.parser({map:map});

zadeklarować globalnie w funkcji wywołującej ładowanie markerów.

Jak już pisałem przeniosłem tą samą metodę do
głównego skryptu i mimo kolejnych wielu prób z różnymi konfiguracjami nie działa.
Błąd: "docs[0] is undefined" sugeruje, że markery z pliku KML są wczytane do jakiejś innej tablicy lub... już sam nie wiem gdzie. Dodam, że przed wczytaniem markerów KML, są już na mapie inne markery wczytane do tablicy markers=[]

Jeszcze raz Wielkie dzięki za pomoc. Wiem przynajmniej w jakim kierunku szukać rozwiązania bo wczoraj, po kilku dniach szukania wyjścia, zabrnąłem w kozi róg. Jeśli komuś przyjdą jakieś sugestie do głowy piszcie proszę.

EDYCJA: Ostatecznie przed chwilą znalazłem rozwiązanie.
I mogę napisać, że sposób przedstawiony pod linkiem test2 działa.
A problem z przeniesieniem skryptu na moją mapę wynikał z błedu, który popełniłem
podczas edycji skryptu.Krystian Pietruszka edytował(a) ten post dnia 10.08.10 o godzinie 15:43

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Spośród wielu kombinacji jakie zastosowałem powyższa metoda działa
i nie wyrzuca żadnych błędów. Usunąłem zawartość funkcji hideDocument
i wstawiłem tam Twoją pętlę.

Bardzo ważne aby:
geoXml=new geoXML3.parser({map:map});

zadeklarować globalnie w funkcji wywołującej ładowanie markerów.

Najzabawniejsze jest to, ze i tak w sumie dziwie sie, ze dziala ;), poniewaz:
1. obiekt geoXml jest nie jest deklarowany globalnie ale wewnatrz funkcji load_markers_kml(), wiec po zakonczeniu funkcji sam obiekt bedzie istnial, ale referencja do niego (nazwa geoXml) powinna byc przez JS po wykonaniu funkcji usunieta. Zwlaszcza, ze http://code.google.com/p/geoxml3/wiki/ParserReference twierdzi, ze cty.: "docs|Array|(...bla bla bla) Note: documents for which geoxml3 is being used solely as a real-time parser are not retained in this array."...
2. metoda hideDocument() nie wyglada na taka, ktora mozna byloby wywolywac bez parametru... bo przeciez przy wywolaniu doc.markers.length (wewnatrz petli w tej metodzie) gdzie parametr doc jest null - powinien wyskoczyc blad ;)

Aaaale... nie czepiam sie... najwazniejsze, ze dziala ;) ;)

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Pomijając fakt, że o obiektowości javascript niewiele wiem i pewnie prędko tego zagadnienia nie zrozumiem,
to również się dziwę :)
W pewnym momencie zrozumiałem, że trzeba tu stosować metodę totolotka
lub jak kto woli "brute force", tzn., każdą kombinację próbować jaka przyjdzie do głowy, aż zadziała. Trwało to kilka dni, i dzięki Twojej pomocy, jak to mówił premier Marcinkiewicz: "YES, YES, YES".

Nie przypuszczałem, że dwie linijki kodu mogą przynieść tyle szczęścia :)
Aż sobie pójdę na rower.Krystian Pietruszka edytował(a) ten post dnia 10.08.10 o godzinie 16:50

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Hehe... jak to sie dzieje, ze sciagam caly kod do siebie lokalnie... zamieszczam lokalnie tego samego kml-a, tego samego geoxml3.js... i nie dziala.. ;) Wyskakuje blad (spodziewany zreszta)
Błąd: doc is undefined
Plik źródłowy: [blablabla]/geoxml3.js Wiersz: 92

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

U mnie na localhost działa.
Sprawdź czy zapisałeś test2 - bo tylko to działa
http://www.geocontext.org/pliki/2010/test-geoxml3/test2/

i chyba plik KML też musi być ładowany lokalnie.

I jeszcze jedna uwaga: kliknięcie więcej niż raz w button "load markers" blokuje
funkcję hidenDocument gdyż wtedy jest załadowanych kilka tablic docs a pętla usuwa tylko docs[0]Krystian Pietruszka edytował(a) ten post dnia 10.08.10 o godzinie 16:55

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Dopiero teraz zauwazylem, ze u Ciebie geoxml3.js jest zmodyfikowany :) Nie bardzo mam pomysl jak wyciagnac geoXml3.docs bez modyfikowania klasy. A o to by w tym wszystkim przeciez chodzilo :)

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

No wiec chyba mam najlepsze rozwiazanie. GeoXML3 jest taka "doszywka" do Google Maps API V3 podobnie jak np. ProjectedOverlay. Obydwie te funkcjonalnosci zostaly juz w API v3 zaimplementowane, wiec nie ma potrzeby uzywania tych dodatkowych klas.

W API V3 pojawila sie klasa google.maps.KmlLayer (http://code.google.com/intl/pl/apis/maps/documentation... wiec nie ma sie co meczyc z GeoXML3 :)

Jedyne ograniczenie, ktore teraz znalazlem jest takie, ze sciezka do kmla musi byc bezwzgledna (czyli kmle zamieszczone lokalnie przez file:// nie beda chodzic).

Ponizej poprawny kod (przydaloby sie jeszcze sprawdzenie, czy istnieje warstwa kml przy pokazywaniu i chowaniu markerow.


<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>geoxml3 Markers Example</title>
<style type="text/css">
html, body, #map_canvas {width: 100%; height: 98%; margin: 0; padding: 0;}
.infowindow * {font-size: 90%; margin: 0}
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="geoxml3.js"></script>

<script type="text/javascript">
var map, markerykml;
function initialize() {
var myLatlng = new google.maps.LatLng(39.397, -100.644);
var myOptions = {
zoom: 5,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);

markerykml = new google.maps.KmlLayer('http://www.geocontext.org/pliki/2010/test-geoxml3/test2/state_capitals.kml');
markerykml.setMap(map);
};

function show_markers_kml(){
markerykml.setMap(map);
}

function hide_markers_kml(){
markerykml.setMap(null);
}


</script>
</head>
<body onload="initialize()">

<button onclick="show_markers_kml();">show markers</button>
<button onclick="hide_markers_kml();">hide markers</button>

<div id="map_canvas"></div>

</body>
</html>


:) POZDRO!

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Jakieś 3 tygodnie temu testowałem to rozwiązanie i z tego co pamiętam
KmlLayer nie pozwala zdefiniować markerów mniejszych niż 32 piksele.
Choć Google Maps 3 rozwija się z dnia na dzień, więc może.

Chętnie zobaczę Twój pomysł na umieszczenie markerów niewielkich rozmiarów.
Jest gdzieś info o tym w internecie, że się nie da.

Dlatego przerzuciłem się na geoxml3.js
ale gdybym wiedział co mnie czeka, to pewnie ostatecznie do markerów wybrał bym plik XML. Obecnie zaszedłem za daleko aby się wycofać.

EDYCJA:
tutaj znalazłem wątek dyskusji na ten temat: http://www.devcomments.com/KML-and-custom-icons-being-...

oraz przykład małych ikon które po załadowaniu na mapę są przeskalowane do rozmiaru 32x32 piksele:
http://www.councilsites.co.uk/_kml.htmKrystian Pietruszka edytował(a) ten post dnia 11.08.10 o godzinie 16:52

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery

Przyznaje, ze nie spotkalem sie jeszcze z tym problemem. No i nie przegladnalem wczesniej calej specyfikacji KmlLayer, bo skupilem sie na funkcjonalnosci pokazywania/ukrywania markerow.

Zagladajac w reference KmlLayer mocno sie rozczarowalem. Mialem nadzieje, ze klasa bedzie miala w sobie troche wiecej metod czy struktur, do ktorych moznaby sie bylo dobrac. Szkoda, ze nigdzie nie ma np tablicy markerow, overlayow itp, do ktorych moznaby bylo podlaczyc normalne opcje znane z samego API a nie ograniczonego specyfikacja Kml.

Przychodzi mi do glowy tylko jedno rozwiazanie, ktore wcale nie jest jakies bardzo trudne: Potraktowac plik Kml jako XML(co zreszta nie jest sprzeczne z prawda ;) ), za pomoca AJAXa (XMLHttpRequest()/ActiveXObject("Microsoft.XMLHTTP")) wczytac go do dokumentu i samodzielnie parsowac JavaScriptowa metoda wczytanyXML.getElementsByTagName('nazwa xml/kmlowego tagu) i dodawac markery przypisujac im style i ikonki wewnatrz skryptu.

Nawet to mozna sobie uproscic stosujac na przyklad jQuery podobnie jak w przykladzie http://www.switchonthecode.com/tutorials/xml-parsing-w... .Tomek Rodakiewicz edytował(a) ten post dnia 12.08.10 o godzinie 12:36

Temat: Maps API V3 i skrypt geoxml3 - pokaż/ukryj markery


Przychodzi mi do glowy tylko jedno rozwiazanie, ktore wcale nie jest jakies bardzo trudne: Potraktowac plik Kml jako XML(co zreszta nie jest sprzeczne z prawda ;) ), za pomoca AJAXa (XMLHttpRequest()/ActiveXObject("Microsoft.XMLHTTP")) wczytac go do dokumentu i samodzielnie parsowac JavaScriptowa metoda wczytanyXML.getElementsByTagName('nazwa xml/kmlowego tagu) i dodawac markery przypisujac im style i ikonki wewnatrz skryptu.

Wszystkim, którzy przymierzają się aby w swoim projekcie zastosować
bibliotekę geoxml3, do innych celów niż wczytanie markerów z pliku KML tuż po załadowaniu mapy - odradzam.

Do zaawansowanych manipulacji markerami na mapie, łatwiej i szybciej będzie zastosować to co podał @Tomek w powyższym cytacie.
Ja jak już pisałem, zabrnąłem za daleko aby się wycofać z rozwiązania geoxml3.

Mam nadzieję, że wkrótce przedstawię na forum Mapę nad którą pracuję.Krystian Pietruszka edytował(a) ten post dnia 12.08.10 o godzinie 14:16



Wyślij zaproszenie do