Die deutsche Google Maps Community.
Die Möglichkeiten sind da!
Forum Suche | Forum Übersicht | Anmerkung: registrierte Benutzer können sich über neue Einträge benachrichtigen lassen | Anmerkung: registrierte Benutzer können sich über neue Einträge benachrichtigen lassen
Übersicht ::
Google Maps API ::
Google Maps API ::
Mit SQL erstellte Marker/map(s) "beißen" sich mit geocode via Form
moderiert von:
Steffen
Mit SQL erstellte Marker/map(s) "beißen" sich mit geocode via Form |
||
|---|---|---|
| hansi-r6 | verfasst: 13.05.2008, 00:07 | |
Neu hier
registriert: Mai. 2008
Beiträge: 6
Status: offline letzter Besuch: 23.05.08 |
Grüßt Euch. Ich bastel hier grade an einem kleineren Projekt herum. Bin rel. weit gekommen aber nun bräuchte ich eine kleine Hilfe. Zur Sache bzw zum aktuellen Aufbau: es werden Marker via SQL eingelesen und dargestellt sobald die Seite geladen wird(Umkreis 5 km um einen fixen Punkt). Dieser wird auch als map.center festgelegt(akt. Karlsruhe) in meiner load Funktion. Eine Form am top der Seite ermöglicht die Eingabe einer Adresse welche dann via Geocoder als neuer map.center umgesetzt werden soll. Hier liegt nun das Problem. Ich hab bei Google auf der Seite geschaut und ein Beispiel implementiert...nur hab ich das Problem das sobald ich Suche die aktuellen Marker verschwinden. Was nach kurzem überlegen auch klar ist, da in der "Geocode" funktion eine neue Map definiert ist. da er ja sonst meckert das dass Objekt 'map' leer ist. Hat jemand eine Idee wie ich die Map aus meiner load Funktion, in der ja auch meiner Marker geladen werden, an diese Fkt übergeben kann, damit die Marker ehalten bleiben? Quasi "var map = new GMap2(document.getElementById("map"));" gloabl definieren. Und nicht in jeder Funktion neu, damit alle Fkt. die es brauchen Zugriff haben. Es soll dann später so sein, dass die Marker nicht mehr am Start geladen werden sondern nur noch nach dem Geocode. Von diesem werden dann lat, lng an das PHP-File übergeben welches die SQL Abfrage mit integrierter Umkreissuche macht und nur diese Marker in einem XML zurück liefert. Welches dann geparsed wird und die Marker anzeigt. Gruß & Danke schon mal Hannes |
|
|
|
|
|
| micker | verfasst: 13.05.2008, 22:02 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
Hallo Hannes, ehrlich gesagt versteht ich das Problem nicht ganz, denn der Clint-Geocoder benötigt nicht zwangsweise Karte, und weil das Erzeugen einer neuen Karte für jedes Ergebnis einer Suchanfrage absolut keinen Sinn macht. Allerdings muss man sich dann Gedanken machen wie die Marker (die bei Dir jetzt verschwinden) bei einer neuen Anfrage entfernen will oder nicht. Prinzipell ist es möglich Variablen die Karten referenzieren zu kopieren. Könntest Du mal die Geocode Funktion posten? |
|
|
|
|
|
| micker | verfasst: 13.05.2008, 22:13 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
oder machen wir's kurz... steht irgendwo map.clearOverlays(); ? Wenn ja bitte auskommentieren, wenn nein bitte, die geocode funktion mit callback funktion, in der die marker geadded werden, posten. |
|
|
|
|
|
| hansi-r6 | verfasst: 13.05.2008, 23:39 | |
Neu hier
registriert: Mai. 2008
Beiträge: 6
Status: offline letzter Besuch: 23.05.08 |
Das mit dem clear overlay hatte ich schon gemacht. Hatte ich vergessen zu erwähnen. Hier mal der Code also akutell sieht es so aus: Diese Fkt. wird geladen beim Start: function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(49.006290,8.529502), 10); GDownloadUrl("asuche.php?wert=49.006290", function(data) { var XML = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name"); var address = markers[i].getAttribute("address"); var stadt = markers[i].getAttribute("stadt"); var offenwo = markers[i].getAttribute("offenwo"); var type = markers[i].getAttribute("type"); var sonstiges = markers[i].getAttribute("sonstiges"); var tel = markers[i].getAttribute("tel"); var fax = markers[i].getAttribute("fax"); var lat2 = parseFloat(markers[i].getAttribute("lat")); var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var marker = createMarker(point, stadt, address, type, offenwo, sonstiges, tel, fax, lat2); map.addOverlay(marker); } }); } } Und diese wird durch den Geocoder bedient nachdem man auf den "such" Button clickt. function addAddressToMap(response) { //map.clearOverlays(); if (!response || response.Status.code != 200) { alert("Sorry, we were unable to geocode that address"); } else { place = response.Placemark[0]; point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]); map.setCenter(point, 13); marker = new GMarker(point); map.addOverlay(marker); marker.openInfoWindowHtml(place.address + ' ' + 'Country code: ' + place.AddressDetails.Country.CountryNameCode); } } function createMarker(point, stadt, address, type, offenwo,sonstiges, tel, fax, lat2) { var markersq = new GMarker(point, customIcons[type]); var HTML = "" + stadt + " " + address + " " + offenwo + " " + sonstiges +" "+ tel+ " " + fax + " " + lat2; GEvent.addListener(markersq, 'click', function() { markersq.openInfoWindowHtml((this.getPoint().lng().toFixed(5) )+(HTML)); }); return markersq; } // showLocation() is called when you click on the Search button // in the form. It geocodes the address entered into the form // and adds a marker to the map at that location. function showLocation() { var address = document.forms[0].q.value; geocoder.getLocations(address, addAddressToMap); } Danke |
|
|
|
|
|
| micker | verfasst: 14.05.2008, 12:16 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
also ich vermute mal: dass die load() funktion beim Laden der Seite ausgeführt wird, in der die Karte erzeugt wird. UND die Funktion(-sdefiniton von) GDownloadUrl enthält, die dann aufgerufen wird. Hier wird dann für das Sucherergebnis mit createMarker(...) die Marker erzeugt und zur Karte hinzugfügt. Dein "Such"-Button ruft wahrscheinlich die Funktion showLocation auf, deren callbackfunktion addAddressToMap ist. Diese Zentriert zwar die Karte auf das Element des Suchergebnisse mit zoomlvl 13, aber added keine Marker... (ich denke hier müsste eigentlich diese GDownloadUrl stehen oder aufgerufen werden) Also woher kommen deine Marker wenn Du auf den "Such"-Button klickst? |
|
|
|
|
|
| micker | verfasst: 14.05.2008, 12:30 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
versuch das mal, ist aber logischerweise ungetestet function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(49.006290,8.529502), 10); } } function addAddressToMap(response) { //map.clearOverlays(); if (!response || response.Status.code != 200) { alert("Sorry, we were unable to geocode that address"); } else { place = response.Placemark[0]; point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]); map.setCenter(point, 13); marker = new GMarker(point); map.addOverlay(marker); marker.openInfoWindowHtml(place.address + ' ' + 'Country code: ' + place.AddressDetails.Country.CountryNameCode); GDownloadUrl("asuche.php?wert="+place.Point.coordinates[1]", function(data) { var XML = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name"); var address = markers[i].getAttribute("address"); var stadt = markers[i].getAttribute("stadt"); var offenwo = markers[i].getAttribute("offenwo"); var type = markers[i].getAttribute("type"); var sonstiges = markers[i].getAttribute("sonstiges"); var tel = markers[i].getAttribute("tel"); var fax = markers[i].getAttribute("fax"); var lat2 = parseFloat(markers[i].getAttribute("lat")); var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var marker = createMarker(point, stadt, address, type, offenwo, sonstiges, tel, fax, lat2); map.addOverlay(marker); } }); } } |
|
|
|
|
|
| hansi-r6 | verfasst: 17.05.2008, 00:59 | |
Neu hier
registriert: Mai. 2008
Beiträge: 6
Status: offline letzter Besuch: 23.05.08 |
Also danke erstmal für deine Mühen... hab leider wegen Job wenig Zeit gehabt, aber heute doch noch gebastelt... Egal wie ich es dreh und wende es kommt nicht vorran. In einem Document macht er die Marker aus der DB im Anderen setzt er das Center richtig zeigt aber keine Marker an. Isch wärd noch narrisch. Hier mal der Code welche Center macht aber keine Icons zeigt: [code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> <head> <title>Google Maps API Example: Simple Geocoding</title> var map = null; var geocoder = null; function initialize() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map_canvas")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(49.006290,8.529502), 10); geocoder = new GClientGeocoder(); var coord = GLatLng(" "); } } Search.setOnLoadCallback(initialize); var clusterer = new Clusterer(map); function showAddress(address) { if (geocoder) { geocoder.getLatLng( address, function(point) { if (!point) { alert(address + " not found"); } else { map.setCenter(point, 13); var marker = new GMarker(point); GEvent.addListener ( marker , 'dragend' , function () { alert ( this.getPoint().lng().toFixed(5) ); }); map.addOverlay(marker); marker.openInfoWindowHtml(address); GDownloadUrl("asuche.php?wert=49.006290", function(data) { var xml = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name"); var address = markers[i].getAttribute("address"); var stadt = markers[i].getAttribute("stadt"); var offenwo = markers[i].getAttribute("offenwo"); var type = markers[i].getAttribute("type"); var sonstiges = markers[i].getAttribute("sonstiges"); var tel = markers[i].getAttribute("tel"); var fax = markers[i].getAttribute("fax"); var lat2 = parseFloat(markers[i].getAttribute("lat")); var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var marker = createMarker(point, stadt, address, type, offenwo, sonstiges, tel, fax, lat2); map.addOverlay(marker); } }) } } ); } } function createMarker(point, stadt, address, type, offenwo,sonstiges, tel, fax, lat2) { var marker = new GMarker(point, customIcons[type]); var html = "" + stadt + " " + address + " " + offenwo + " " + sonstiges +" "+ tel+ " " + fax + " " + lat2; GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml((this.getPoint().lng().toFixed(5) )+(html)); }); return marker; } </head> <body onload="initialize()" onunload="GUnload()"> <form action="#" onsubmit="showAddress(this.address.value); return false">
</form> </body> </html> [/code] kann doch net so schwer sein ein Center bei ner Map zu erreichen und dann Icons ein zu blenden. Mit ner reinen XML Datei hab ich es übrigens schon mal geschafft...nur wo es jetzt dynamisch werden soll gibts Ärger. Gruß mit der Bitte um Hilfe Hannes |
|
|
|
|
|
| micker | verfasst: 17.05.2008, 18:39 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
könnte es sein dass der die Icons nur um Karlsruhe macht, aber nicht an anderen Orten? das wäre dadurch begründet, dass du bei der asuche.php immer den gleichen Lat-Wert mitgibst. GDownloadUrl("asuche.php?wert=49.006290", function(data) { |
|
|
|
|
|
| hansi-r6 | verfasst: 17.05.2008, 18:50 | |
Neu hier
registriert: Mai. 2008
Beiträge: 6
Status: offline letzter Besuch: 23.05.08 |
Jo is richtig... weil wegen ich such auch zum testen nur um Karlsruhe ;-) | |
|
|
|
|
| micker | verfasst: 17.05.2008, 19:04 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
ok das sagt der debugger? springt er in die GDownloadUrl funktion? wird dort die Schleife durchlaufen? Weiss Du wie oft er die Schleife beim Ergebnis in KA durchlaufen müsste? mach mal in die for-Schleife ein alert(i); und schau was passiert |
|
|
|
|
|
| hansi-r6 | verfasst: 17.05.2008, 20:54 | |
Neu hier
registriert: Mai. 2008
Beiträge: 6
Status: offline letzter Besuch: 23.05.08 |
Also hab es jetzt anders gelöst: Hab mich am Shop findr Bsp von Google orientiert. Das läuft nun Top genau so wie ich es wollte...hat ja auch nur 3h Anpassung und umschreiben in Anspruch genommen ;-) Danke an alle anbei noch der Link zum Example von Google http://code.google.com/su...134&topic=&ctx=sibling |
|
|
|
|
|
| nethaase | verfasst: 02.06.2008, 23:47 | |
Neu hier
registriert: Jun. 2008
Beiträge: 1
Status: offline letzter Besuch: 02.06.08 |
Aloa ihr GMapler. Bin ganz junges Küken auf diesem Gebiet, dennoch nicht abgeneigt und schon ein begeistert, wie schnell man so schöne Karten basteln kann. Egal.... Nun zur Frage. ich weiß nicht obs dir noch weiterhilft oder ob dus überhaupt noch benötigst. nur der vollständigkeit halber: [quote=hansi-r6]Quasi "var map = new GMap2(document.getElementById("map"));" gloabl definieren. Und nicht in jeder Funktion neu, damit alle Fkt. die es brauchen Zugriff haben.[/quote] einfach das "var" vor map weglassen. mit "var" deklariert man in js innerhalb einer funktion LOKALE variablen, d.h. sie sind nur innerhalb dieser gültig. außerhalb einer funktion definiert man mit "var" GLOBALE variablen, d.h. diese sind im gesamten script gültig. lässt man bei der variablendeklaration innerhalb einer funktion "var" weg, erhält man ebenfalls eine globale variable. nachzulesen in der HTML+js bibel: http://de.selfhtml.org/ja.../sprache/variablen.htm moral von der geschicht': lässt du das "var" vor map weg, müsstest du eigentlich in allen funktionen auf ein und die selbe "map" zugreifen können. gruß, nethaase |
|
|
|
|
|
| micker | verfasst: 04.06.2008, 14:34 | |
Häufiger hier
registriert: Jun. 2007
Beiträge: 23
Status: offline letzter Besuch: 16.07.08 |
@nethaase Hi junger GoogleMaps-Jedi :-) Vielen Dank für den Hinweis, der sehr gut ist, denn man hat in der Regel nur eine map, und das sollte die gleiche sein. Aber diese mit dem weglassen von var ist eine Eigenheit von JS. Wenn Du die "lokale Variable" ausserhalb definiert, wird sie global und das ist in fast jeder Programmiersprache so. Generell sollte man aber Globale Variablen vermeiden, da es durch sogenannte Seiteneffekte zu Fehlern kommen kann, die nicht mehr nachvollbar sind. editiert von: micker, 04.06.2008, 01:35 Uhr |
|
|
|
|
|
User online:
Diese Angaben basieren auf den Useraktivitäten der letzten 10 Minuten