Gmapper 0.7 - Geocoding, verbesserte XML Unterstützung
Heute habe ich mal wieder eine neue Version von Gmapper fertig gestellt.
Die aktuelle Version bringt viele Neuerungen, sowohl struktureller als auch funktionaler Art.
Javascript ausgelagert
Zum Einen wurden sämtliche statischen Javascript Bestandteile in eine JS Datei ausgelagert.
Diese, wird wie bisher der JS Code, von der Methode headjs() eingebunden.
Die Datei bodyjs.js muss dazu einfach nur im gleichen Ordner liegen, wie die Seite in der die Karte eingebunden wird.
Dies bietet den Vorteil, dass JS Dateien von Browsern gecached werden und so der HTML Code der Kartenseiten schlanker wird.
Neue Funktionen
Neben dieser strukturellen Änderung gibt es auch einige neue Funktionen:
- Die Methode map() kennt nun den Parameter overview. Ist er aktiviert, wird eine kleine Übersichtskarte rechts unten angezeigt. (Default: aus)
- Die beiden neuen Methoden XmlMap und XmlMapPoints erlauben es, komplett in XML beschriebene Karten auszugeben. Ein Beispiel dazu findet sich im Downloadarchiv (demoxml2.php). Die bisherige Methode parseGxml die hier näher beschrieben , bleibt erhalten.
- Die neue Methode linkMarker() ermöglicht es Marker ohne Infofenster, die bei Klick direkt auf eine beliebige URL weiterleiten zu erzeugen
- Die neue Methode geocode() erlaubt es, eine Adresse zu übergeben und anhand dieser einen Kartenmarker einzufügen
Geocoding
Die Methode geocode(adresse,marker,grafik) nimmt 3 Parameter:
- adresse
- markertyp
- grafik
Als Adresse wird ein String erwartet, als Marker wird ein String welcher der gewünschten Markermethode entspricht erwartet (Möglich: marker,otherMarker,mapMarker). Als Grafik wird ein Dateiname erwartet.
Beispiel:
$karte->geocode("Berlin","otherMarker","marker.png");Zusätzlich wird zum Auslesen von Inputfeldern die JS Funktion getAdress() bereitgestellt.
Mit ihr ist es möglich aus einem Inputfeld mit der ID “adresse” die Adresse zu entnehmen.
Beispiel:
<input type = "text" id = "adresse" size = "30"><br> <input type = "button" onclick = "$karte->geocode("getAdress()","otherMarker","marker.png");" value = "Geocode">
Tutorials
Ich habe zu den neuen Funktionalitäten noch kein Tutorial geschrieben. Ich versuche das am Wochenende nachzuholen.
Derweil findet ihr in der Datei demo.php im Downloadarchiv eine komplette Demo der neuen Funktionen (XML: demoxml2.php)
Eine Projektseite samt Forum muss ich nach wie vor schuldig bleiben, freue mich aber wie immer über Euer Kommentar-Feedback
Links:
Demo: http://philipp.gothic-singles.de/demo.php
Dokumentation: http://philipp.gothic-singles.de/gmap.html
Download: http://philipp.gothic-singles.de/classgmapper07.zip
Sorry - ich habe immer noch 3 JS-Fehler im IE6 (in deiner Demo):
- Zeile 92 ‘GIcon ist undefined
- Zeile 35 ‘GMap2′ ist undefined
- Zeile 68 ‘GLatLng’ ist undefined
Dirk Ginader
22 Feb 07 um 8:42
Hallo,
Sorry aber - ich nicht. -> Screenshot
Die von dir genannten Fehlermeldungen deuten an, dass Du nur die Klassendatei ausgetauscht hast (class.gmapper.php), oder vergessen hast die mit 0.7 neu eingeführte JS Datei bodyjs.js in dein Verzeichnis zu kopieren.
Davon abgesehen:
Ein Fehler wie “‘GMap2′ is undefined”, sollte auch in Firefox und anderen Browsern zu einer Unbenutzbarkeit der Karte führen.
Vielleicht solltest Du dir die Beispiele im Downloadarchiv nochmals genauer anschauen….
Ebenfalls gab es in dieser Version mal wieder eine strukturelle Veränderung (Auslagerung des statischen JS).
Insofern kann ich dir da momentan leider nicht weiterhelfen.
Philipp
22 Feb 07 um 9:51
klappt super!
Bis auf das “Einschalten” des Überblickfensters brauchte ich vom Update von 06 auf 07 nix verändern.
Schöne Zugabe: Ein Doppelclick zentriert UND ZOOMT die Karte.
Ein DoppelRECHTSclick zoomt zurück (leider poppt dann auch das Kontextmenü auf.
Wie wichtig ist das onunload im body tag?
Danke und Gruß
Karl Linne
Karl
22 Feb 07 um 10:33
Ja das mit dem Doppelklick Zoom, ist ein neues Feature des API namens “Continuous zoom”, das ich mal (mehr testweise) aktiviert habe.
Wenn du darauf achtest ist der Zoom ein wenig “weicher” als beim normalen Zoomen.
Interessant, das es direkt jemand bemerkte
Ich hatte das an sich absichtlich noch nicht dokumentiert da ich es als “beta” ansehe.
Ist wichtig um “memory Leaks” vor allem im Internet Explorer zu fixen.
Dies wird ebenfalls vom Maps API bereitgestellt.
Ich habe es immer drin, da es empfohlen wird.
Habe die Auswirkung aber noch nicht wirklich getestet.
Philipp
22 Feb 07 um 10:56
Seh die Seite heute zum ersten mal. Toll gemacht, ganz klasse. Beim Auslesen von Markern aus xml-Dateien bekomme ich allerdings folgende Fehlermeldung:
Warning: array_merge() [function.array-merge]: Argument #1 is not an array in /home/www/????/html/gmaps/class.gmapper.php on line 494
Warning: Invalid argument supplied for foreach() in /home/www/????/html/gmaps/class.gmapper.php on line 347 .
Danke und viele Grüße
Gumprecht
Gumprecht
22 Feb 07 um 3:57
Hast du mal einen Link zu der von dir verwendeten XML Datei ?
Philipp
22 Feb 07 um 4:56
na klar. Hier ist der Link:
http://www.stammtischonline.de/gmaps/data.xml
Gumprecht
22 Feb 07 um 6:09
Hallo,
ich konnte deine XML Datei problemlos auslesen.
Siehe:
http://philipp.gothic-singles.de/demoxml.php
(http://philipp.gothic-singles.de/data.xml)
Du musst zum Auslesen einer solchen einfachen XML Datei, den in demoxml.php und hier beschriebenen Weg wählen.
Das bedeutet Du musst die Datei mit der Methode parseGxml auslesen.
Die neuen Methoden XmlMap und XmlMapPoints dienen zum Auslesen komplexerer XML Dateien (in denen eine komplette Karte beschrieben wird, und mehr optionen bei den Markern möglich sind.)
Mit parseGxml wird nur eine einfachst-mögliche XML Syntax implementiert - die von Google in der API Dokumentation vorgeschlagen wird.
Diese Methode dient der Kompatibilität / möglichst vollständigen Umsetzung der API.
Beispiele zu den Methoden xmlMap und xmlMapPoints findest Du in der Datei demoxml2.php im Downloadarchiv.
Die dazugehörige XML Datei ist data1.xml
Codebeispiel:
Philipp
22 Feb 07 um 6:57
Beschneidest du die ermittelten Kooridinanten irgendwo?
Wenn ich mir die Daten über ein anderes Modul liefern lassen, sind diese wensendlich länger als bei dir….
per http://mapki.com/getLonLat.php
Latitude: 54.327598772345716
Longitude: 10.145541429519653
bei dir
54.327598
10.145414
Timo
22 Feb 07 um 7:56
Hallo,
Nein ich verwende für das Geocoding den Google Geocoding Dienst und gebe die Daten so zurück wie sie vom Google Geocoder kommen.
Kann halt sein das Google hier die Genauigkeit beschränkt.
Es gibt ja auch noch eine “Premium” Version der Maps API …und Mapki ist eine der Seiten die von Google als Referenz in den API Docs angegeben werden..
Möglicherweise nutzt Mapki aber auch einfach einen anderen Geocoding Dienst (etwa den Yahoo geocoder)
Google gibt für den Geocoder eine Genuigkeit von “down to street level” an.
Das kann ich nach ein paar kurzen Tests in etwa bestätigen.
Philipp
22 Feb 07 um 8:25
Alles klar…
danke.
Dann bin ich zufrieden, kontne nämlich nichts finden….
dachte schon ich bin blind^^
So, arbeit ruft…
Timo
23 Feb 07 um 3:38
Hallo,
danke für die ausführliche Antwort. Hab alle Dateien aus dem Downloadarchiv nochmals hochgeladen. Die demo.php läuft prima, beide demoxml haben die oben beschriebene Fehlerausgabe. Im Quelltext der demoxml.php Deines Servers hab ich die Datei 079.png ausgemacht. Die fehlt irgendwie im Downloadarchiv. Wollt ich nur anmerken.
Viele Grüße
Gumprecht
23 Feb 07 um 10:08
Verdammt.
Immer diese Nachlässigkeiten von mir….
Versuch doch mal folgendes:
Ersetze in demoxml.php die Zeile
foreach($points as $point) { $karte->marker($point[0],$point[1] ); }durch die Zeile
foreach($points as $point) { $karte->marker($point[0],$point[1],'143.png' ); }Oder erzeuge eine Grafik namens “079.png” im Verzeichnis deiner Kartenseite.
Das Problem liegt offenbar daran, dass ich vergessen habe eine Grafik ins DL Archiv einzubinden.
Ich habe nun eine bereinigte Version der Klasse ins DL Archiv gepackt.
Sie nutzt nun für alle Methoden die mitgelieferte Grafik 143.png.
Philipp
23 Feb 07 um 11:59
Hallo,
danke, aber das wars auch nicht. In Deiner demo.php und demoxml.php sehe ich allerdings kleine png’s (diese blauen Dreiecke) welche im DL Archiv unter “img” liegen. Bei mir sind sie nicht zu sehen. Dann sollen doch in der demoxm..php durch die Funktion “polyline” die einzelnen Marker verbunden werden. Das haut auch nicht so richtig hin.
Nun aber genug angemeckert.
Viele Grüße und ein schönes WE
Gumprecht
24 Feb 07 um 5:57
Du machst definitiv irgendetwas falsch.
Ich kann absolut problemlos deine XML Datei mit der Methode parseGxml auslesen und die Marker in eine Karte einfügen.
Siehe: http://philipp.gothic-singles.de/demoxml.php
Die Sache mit den Richtungspfeilen bei den Polylines ist noch ziemlich experimentell. Ich würde eher dazu raten das zu deaktivieren.
Speziell bei Markern die so nah zusammenliegen, gibt es da immer wieder Probleme.
Philipp
24 Feb 07 um 7:17
Hier mal eine kleine Beispielanwendung, die ich dieses WE erstellt habe:
http://philipp.gothic-singles.de/friendfinder/
Philipp
25 Feb 07 um 11:12
Oh, sehr schönes Beispiel. Benutzt du hier die Premium Version der API? Würde das bei mir auch gerne integrieren, dass ich die Leute per geocoding den genauen Standort definieren lassen kann.
Gruss
Rob
niiconn
26 Feb 07 um 10:54
toll gemacht, der Friendfinder.
Hab die demoxml.php jetzt auf einem Server mit php4 ausprobiert. Funktioniert anstandslos. Dann hat die Fehlermeldung vielleicht mit der php-Version zu tun?
Viele Grüße
Gumprecht
26 Feb 07 um 3:32
Gumbert:
Gmapper ist in PHP4 geschrieben (sollte ich vielleicht irgendwo in der Dokumentation mal erwähnen…).
PHP5 hat ein bekanntermaßen zu PHP4 inkompatibles Klassenmodell.
Das bedeutet: Gmapper kommt nur für die Verwendung in PHP4 Anwendungen in Frage.
(Dabei wird es wohl auf absehbare Zeit auch bleiben)
niiconn:
Nein der Friendfinder nutzt den standard Geocoder der in Gmapper mit der Methode geocode implementiert wird.
Lediglich die in der Klasse mitgelieferte JS Funktion GetAdress habe ich ein wenig erweitert, um die Adresse aus 3 verschiedenen Feldern auszulesen (statt einem).
Ansonsten basiert der Friendfinder komplett auf Gmapper.
Philipp
26 Feb 07 um 4:24
Würde die klasse gerne erweitert sehen….
per klick in die map soll ein Marker gesetzt werden
und damit natürlich auch die Längen und breiterngrade vorliegen, so das ich damit weiter arbeiten kann.
Denn ab und zu gibt es adressen die geocoding nicht ermitteln kann.
Weiß einer wie ich das einabauen kann?
Timo
28 Feb 07 um 3:21
::HLIGHT_BLOCK_1::
das wäre der Code um dies zu bewärkstelligen, aber leider läufts nicht in der Klasse wenn ich ihn einfach reinkopiere….
Timo
1 Mär 07 um 12:19
GEvent.addListener(map, \"click\", function(marker, point) { if (marker) { // map.removeOverlay(marker); } else { var marker = createMarker(point,point.toString()); map.addOverlay(marker); } });Timo
1 Mär 07 um 12:19
Hab hier irgendwie ein Hänger… Wie konvertiere ich die Adressdaten aus der Adresszeile in Koordinaten (latitude, longtitude) bzw. wie kann ich diese Koordinaten anzeigen lassen?
LG
Rob
niiconn
4 Mär 07 um 12:44
Hallo xml_parser.. Freunde unter PHP5,
hat jemand eine Idee, wie ich ich den xml_parser unter PHP5 zum Laufen kriege.
Gruß Wanderpaddler.
wanderpaddler
5 Mär 07 um 2:06
Hallo Zusammen,
ich habe ein Problem mit der Version 07 der gmapper.php.
Nach allen Regeln der Kunst versuche ich das Ding einzubinden und
im FireFox wird mir die Karte dann richtig angezeigt, jedoch erhalte
ich im IE (6) den Fehler, dass die Seite nicht angezeigt werden könne
(sehe noch kurz die Seite mit MAP) und dann läuft das mit o.g. Fehlermeldung auf einen DNS error ??!
http://www.qtwo.de/engbers
Irgenjemand ne Idee?
Gruß,
Klaus
Klaus
27 Mär 07 um 8:57
Hallo,
ich stand gerade auch vor dem selben Problem wie einige andere auch. Der xml-Parse läuft unter PHP5 nicht.
Bei mir hat es geholfen, dass ich in der Datei class.gmapper.php die Zeile 738 von
$tag = array_merge($tag, $this->getchildren($vals, $i));
nach
$tag = array_merge((array)$tag, (array)$this->getchildren($vals, $i));
geändert habe. Danach läuft es problemlos.
Viele Grüße,
Christoph
Christoph
1 Sep 07 um 1:02
Werde das in der nächsten Version berücksichtigen.
Danke für den Hinweis.
Philipp
3 Sep 07 um 12:16