Im letzen Artikel über das Geogedöhns habe ich ein paar Formeln zur Entfernungsberechnung zwischen zwei Geokoordinaten auf abgeschrieben. Jetzt muss man natürlich auch irgendwie an die Geokoordinaten kommen. Ich warne übrigens ausdrücklich davor, dass hier beschriebene theoretische Verfahren anzuwenden. Es verstößt vermutlich gegen die Allgemeinen Geschäftsbedingungen zur Verwendung von Google Maps. Dort steht man dürfe die Geokoordinaten nicht auslesen um sie in eine eigene Datenbank zu speichern. Das tun wir auch nicht. Ich gebe hier lediglich einen gedanklichen Ansatz wie es funktionieren würde, wenn man es denn dürfte. Als Erstes kopiert man sich das Script von Netzwelt. Dieses kopiert die Geokoordinaten nützlicherweise in input Felder.
Angenommen wir hätten jetzt eine Adressdatenbank mit 10.000 Adressen deren Geokoordinaten wir auslesen möchten. Das könnte z.B. dann nützlich sein wenn wir bedenken, dass die Google Maps API viel mehr zugriffe erlaubt, wenn man die Geokoordinaten besitzt. Wenn wir also eine hochfrequentierte Seite haben und google Maps anwenden wollen können wir nicht bei jedem Request auf deren Geocoder zugreifen, weil der nur ca. 20.000 Requests pro Monat zulässt. Es ist denkbar, dass sich diese Zahl mitlerweile geändert hat, aber davon abstrahieren wir jetzt einfach mal.
Wir benötigen also das Script auf Netzwelt.
Dieses modifizieren wir so, dass nach jedem Aufruf der Methode findAdress(String adress) das iFrame neugeladen wird. Wir übergeben dabei die Parameter longtitude, latitude und kid. Beim ersten Aufruf der Seite ist kid=0. Damit weiß das iFrame, dass es losgeht.
Wir benötigen eine Seite auf einer URL die einen GoogleMaps API Key besitzt.
Dort binden wir das Script und die Input Felder ein. Zusätzlich benötigen wir noch ein Feld als Schlüssel zu unserer Kundendatenbank. Wir nehmen hier mal kid an.
Wir benötigen ein Iframe auf der Seite das innerhalb der gleichen URL läuft.
Innerhalb dieses iFrames läuft ein kleines JSP oder PHP Script, dass inetwa folgende Abfrage absetzt:
1. Schreibe bitte die übergebenen Parameter latitude (Breitengrad), longtitude (Längengrad) und Kid (Kundennummer) in die Datenbank.
2. liebe Kundendatenbank sag mir bitte mal alle Kunden für die wir noch keine Geokoordinaten haben und limitiere das Ergebniss auf 1.
3. Führe im parentFrame ein Script aus, welches die Adressdaten aus der SQL Abfrage in das Feld ‘adress’ und die Kundennummer in das Feld kid schreibt. Führe anschließend die Methode findAdress(string adress) im ParentFrame aus.
Wenn man bei der SQL Abfrage nicht übermäßig viel Müll baut, läuft das ganze in einer Endlosschleife ab, bis alle Geokoordinaten ausgelesen sind. Die Ausführung der gegenseitigen Aufrufe bricht dann mit einem Scriptfehler ab, sobald keine Adressen mehr verfügbar sind.
Kleiner Tipp am Rande, falls das jemand implementieren möchte: Es wäre ratsam die gegenseitigen Aufrufe der Scripts mit zufälligen Timeouts zu versehen. Das simuliert dann sowas ähnliches wie Userverhalten.
Diskussion
Keine Kommentare zu “Hacking Google Maps”
Post a comment