Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#44

AW: Google Maps über COM (Component Object Model)

  Alt 6. Mär 2011, 10:26
Hallo MapMan,

das Konzept des GeoWebCache hört sich sehr gut an. Aber bis so etwas in Delphi umgesetzt ist, wird noch einige Zeit vergehen...
Um auf Deine Frage zu antworten: Ja, in diese Richtung gehen meine Vorstellungen. Aber momentan muß der eigentliche Proxy erst einmal richtig funktionieren (Durchlauf der Daten ohne Verluste und brauchbare Ereignishandler mit weitreichender Einflußmöglichkeit)- -187- wartet schon ganz ungeduldig.

Bei dieser Gelegenheit möchte ich auf eine Anfrage antworten, ob vom Framework Reverse Geocoding - also die Umwandlung von Koordinaten in eine Adresse - unterstützt wird:
reversegeocoding.jpg

Die Antwort dazu: Ja, das geht - wenn auch in der Version 1.1 des Frameworks noch nicht direkt, sondern über einen kleinen Trick.
Das liegt daran, daß ich mich eng an die API-Dokumentation gehalten habe und dort Reverse Geocoding nicht explizit beschrieben wird. Aber es funktioniert und wird in der kommenden Version des Frameworks direkt unterstützt werden.

Die Geocoding-Anfrage erfolgt über
Delphi-Quellcode:
TGeocoder.Geocode(Request: TGeocoderRequest,...);
//...
Im Objekt TGeocoderRequest kann eine Koordinate übergeben werden, für die die Daten ermittelt werden. Die Eigenschaft TGeocoderRequest.LatLng gibt es momentan noch nicht. Diese kann aber leicht hinzugefügt werden:
Delphi-Quellcode:
type
  TGeocoderRequestAccess = class(TGeocoderRequest);
 
  ...
  Request:=TGeocoderRequest.Create;
  TGeocoderRequestAccess(Request).SetProp('latLng',LatLng,true);
  Geocoder.Geocode(Request,GeocoderCallback);
  ...
Wird in der Callback-Methode die Eigenschaft TGeocoderResults[n].Types genutzt, muß in der Unit JScriptObjects eine kleine Korrektur vorgenommen werden:
Delphi-Quellcode:
function TStringArray.GetItem(Index: Integer): String;
begin
  Result:='';
  if (Index>=0) and (Index<Count)
    then Result:=VarToStr(inherited Items[IntToStr(Index)]);
end;
Der Hintergrund dazu ist, daß das API die Strings in String-Arrays nicht als Objekte, sondern als einfache Strings speichert.
Wird diese Änderung nicht vorgenommen, kommt es zu einer Exception.

Quelltext der Demo (siehe Screenshot oben):
Angehängte Dateien
Dateityp: zip ReverseGeocoding.zip (11,2 KB, 177x aufgerufen)
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat