Delphi-PRAXiS
Seite 2 von 14     12 3412     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Google Maps über COM (Component Object Model) (https://www.delphipraxis.net/157004-google-maps-ueber-com-component-object-model.html)

MapMan 27. Feb 2011 21:07

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

mich würde deine Meinung zum GoogleEarth-API des GoogleEarth-Plugin's interessieren.

Das GE-Plugin verfügt ja auch über ein JS-API. Einige Ansätze (z.B. http://www.delphidabbler.com/articles?article=26) installieren das GE-Plugin in einem HTML-Container in einem WebBrowser und kommunizieren konventionell über JS-Delphi-Bridges. Aber ich denke, das auch hier dein COM-Ansatz der Elegantere wäre.
Ich sehe in der Nutzung des GE einen potentiellen Mehrwert gegenüber den GoogleMaps (oder OpenLayers) Lösungen in einer höheren Darstellungsgeschwindigkeit von Massen-Geodaten, da eben hier ein ActiveX werkelt und kein JS-Framework.

Thom 4. Mär 2011 11:43

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

bitte entschuldige die späte Antwort - momentan ist die Zeit bei mir äußerst knapp.

Ich bastle momentan an einem Proxy, der solche Aufgabe (Lieferung des JavaScript-API's, der Daten und Karten aus einem lokalen Cash, einer Datenbank oder dergleichen) übernehmen könnte.

Bei selbst programmierten Layern kann/muß ja sowieso die Kachel-URL berechnet werden und könnte damit - je nach Aufgabenstellung - webbasiert oder lokal sein. Bei Google Maps hatte ich das schon probiert - das sollte dann eigentlich auch bei OpenLayers funktionieren.

Das Google Earth Plugin hatte ich schon vor einiger Zeit auf meinem Rechner installiert - aber leider bin ich bisher noch nicht zu umfangreicheren Tests gekommen.
Interessant wäre mal eine Art "Benchmark", der die Zugriffe über JavaScript und COM bei Goggle Maps, Google Earth und OpenLayers bei verschiedenen Aufgaben - zum Beispiel die Erstellung und Anzeige von 1000 Markern - miteinander vergleicht.

MapMan 4. Mär 2011 14:35

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

Apropos Proxy...
schau dir mal GeoWebCache http://geowebcache.org/ an.
Find ich eine interessante Lösung, da die gängigen Kartenquellen unterstützt werden und das Programm auf jedem PC als Online/Offline-MapServer bzw. Proxy installiert werden kann.
Nach einer gewissen Zeit hat GeoWebCache die "Reviere" seines Anwenders erfasst.

Geht das in die Richtung deines Proxy ?
Wie werden Anwender deines Proxy diesen "füttern" können ?

Im Sinne einer einfachen Handhabung durch den Anwender halte ich es so :

1. Anwender erzeugt sich seine Wunschkarten. Entweder kompliziert und schnell mit Mapnik.
Oder einfacher mit MobileAtlasCreator http://mobac.dnsalias.org/

2. Er speichert diese Karten in einem definierten RootDir als XYZ.olm (darin die ZoomLevels) ab.

3. Die Geo-Anwendung durchsucht das RootDir und erzeugt entsprechenden JS-Kode. Zum Beispiel :
Code:
var OfflineMap1 = new OpenLayers.Layer.OSM("Deutschland_Mapnik_0_10", "http://localhost:28991/Deutschland_Mapnik_0_10.olm/${z}/${x}/${y}.png", {numZoomLevels: 19});
map.addLayer(OfflineMap1);
var OfflineMap0 = new OpenLayers.Layer.OSM("My TopoMapper OfflineTest", "http://localhost:28991/My TopoMapper OfflineTest.olm/${z}/${x}/${y}.png", {numZoomLevels: 19});
map.addLayer(OfflineMap0);
Die Praxis hat gezeigt, dass dieses Procedere ganz reibungslos läuft...

Ich habe übrigens mal bei Google nach den Kosten für die Nutzung von GoogleEarth und GoogleMaps(StreetView) auf Einzelplatzsystemen nachgefragt. Bin gespannt, ob man sich das leisten kann...

Thom 6. Mär 2011 09:26

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
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... :roll:
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. :wink:

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:
Anhang 33531

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):

MapMan 7. Mär 2011 10:44

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

wie kann man beim ReverseGeocoding direkt Latitude und Longitude (ohne TLatLng-Objekt mit readonly Lat Lng) übergeben ?
Z.B. Koordinaten aus einer DB...

Thom 7. Mär 2011 10:57

AW: Google Maps über COM (Component Object Model)
 
Über das Google Maps API ist mir kein Weg bekannt, da dort immer objektorientiert gearbeitet wird.
Ansonsten geht es offiziell über das Geocoding API von Google.

Thom 15. Mär 2011 14:14

AW: Google Maps über COM (Component Object Model)
 
Herzlichen Dank an die United Navigations GmbH für die Nutzung des Frameworks und die freundliche Unterstützung!

Thom 9. Mai 2011 20:23

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
In letzter Zeit gibt es ein Problem mit der Darstellung des StreetView-Panoramas im Browser-ActiveX bei der Verwendung des IE8. Das betrifft sowohl TWebBrowser als auch TEmbeddedWB. Der Grund dafür ist ein Bug im Google Maps API der aktuellen Version 3.4.

Das Ganze sieht dann etwa so aus:
Anhang 34163

Von Google wird die Verwendung der vorherigen, stabilen API-Version 3.3 empfohlen. Damit steht man leider vor der Wahl: Neue Steuerelemente oder StreetView.

Die Auswahl einer bestimmten API-Version ist in der Version 1.3 des Frameworks möglich - momentan komme ich leider aus Zeitgründen noch nicht zur Veröffentlichung.

Wer selbst Hand anlegen möchte, kann in der Unit gmAPI in der Funktion HTMLPage die URL des Goggle Maps API's etwas modifizieren:

'<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.3&sensor=';

Damit ist auch das StreetView-Panorama wieder sichtbar:
Anhang 34164

P.S.:
Der Bug im Google Maps API wurde behoben: Street View funktioniert wieder in allen IE-Versionen.

bwilms 13. Mai 2011 11:38

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

ich versuche gerade gmAPI und die Demos unter Delphi 6 zum laufen zu bringen.
Aber bei jedem Demo kommt die Fehlermeldung "Unbekannter Name". Es sieht so aus, also ob die Funktion "AddProp" jedes Mal fehl schlägt. Bei "supports(..)" kommt immer false zurück und das Prop wird nicht angelegt.

Muss dazu noch irgendwas beachtet werden?
Ist die IE-Version relevant?

Vielen Dank im voraus.

Thom 13. Mai 2011 11:53

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

das Framework wurde von mir unter anderem auch mit Delphi 5, Windows XP und dem IE 8 getestet. Delphi 6 sollte also eigentlich keine Probleme verursachen.

Welche Windows- und Browser-Version verwendest Du?

Wie sehen die Fehlermeldungen konkret aus? Also in welcher Unit und für welche Zeilennummer wird der Fehler angezeigt?

P.S.:
Jetzt habe ich's verstanden: Die Fehlermeldung kommt nicht während der Compilierung, sondern zur Laufzeit des Programms!?

bwilms 13. Mai 2011 11:58

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

schon mal danke für die schnelle Antwort.

Wie gesagt, der Fehler lautet "Unbekannter Name" beim Aufruf der Funktion SetProp in der unit BrowserTools Zeile 665.

OS: Windows XP Pro SP 3
Browser: IE 8.0.6001.18702

Die kompilierte Exe zum Thema OpenMap konnte ich starten.

Schönen Gruß,

Benjamin

Thom 13. Mai 2011 12:23

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok. Dann sollte es auch nicht am Browser-ActiveX - sprich: der IE-Version - liegen.

Könntest Du bitte mal mit Hilfe des Debuggers feststellen, bei welchem (Google Maps) Objekt und bei welcher Eigenschaft die Fehlermeldung auftritt? Am besten bei einer einfachen Demo, wie Simple Demo.

Da könnte der Fehler auftreten beim Anlegen des Objektes TScript (eher unwahrscheinlich), beim Anlegen des Objektes TMapOptions (auch unwahrscheinlich), beim Hinzufügen der Eigenschaften Zoom (ist meine Vermutung), der Erzeugung des Objektes TLatLng, der Hinzufügung des TLatLng-Objektes zum Options-Objekt, der Hinzufügung der Eigenschaft MapTypeID oder der Erzeugung der Karte selbst (Google.Maps.Map(...)).

P.S.:
Ich habe einmal die compilierte Version von Simple Map angehangen. Funktioniert die bei Dir oder gibt es damit auch eine Fehlermeldung?

P.S.:
Ach, ich sehe gerade: In diesem Beitrag ist sie auch schon enthalten. Na gut, nicht so schlimm...

bwilms 13. Mai 2011 12:37

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

die Demo-Exe funktioniert.

Der Fehler tritt beim SimpleDemo bei dem Attribut Zoom auf.

Gruß,

Benjamin

Thom 13. Mai 2011 12:44

AW: Google Maps über COM (Component Object Model)
 
Aha - also liegt's doch an Deinem Delphi 6. Da müssen offensichtlich noch ein paar Compilerschalter angepaßt werden.
Ich stelle mal eine Checkliste zusammen.

Teste mal bitte mit dem Debugger den folgenden Ablauf:
Delphi-Quellcode:
->Unit1: Zoom:=13;

->gmMap:
procedure TMapOptions.SetZoom(Value: Integer);
begin
  SetProp(MapOptionsProp_Zoom{'zoom'},Value{13},true);    //siehe nächste Methode
end;

->DispObject
procedure TDispObject.SetProp(const Name: String; const Value: OleVariant; CreateIfNotExists: Boolean = false);
begin
  if CreateIfNotExists and not PropertyExists(Name)       //PropertyExists('zoom') liefert false
    then AddProp(Name);                                   //siehe nächste Funktion
  BrowserTools.SetProp(FDisp,Name{'zoom'},Value{13},{false}true);
end;

->DispObject
function TDispObject.AddProp(const Name: String): Boolean;
var
  DispatchEx: IDispatchEx;
  PName: PWideChar;
  DispID: Integer;
begin
  Result:=false;
  if Supports(FDisp,IDispatchEx,DispatchEx) then          //->muß true liefern
  begin
    PName:=SysAllocString(PWideChar(WideString(Name)));   //PName muß 'zoom' als WideString enthalten
    try
      if Succeeded(DispatchEx.GetDispID(PName,fdexNameCaseSensitive or fdexNameEnsure,DispID)) then //<- tritt hier der Fehler auf?
      begin                                               //DispID sollte einen kleinen Integerwert enthalten (z.B. 1)
        SetProp(DispID,varEmpty);
        Result:=true;
      end;
    finally
      SysFreeString(PName);
    end;
  end;
end;
Ich habe noch eine Idee:

Delphi 6 enthält doch in der Unit ActiveX die Deklaration von IDispatchEx!? Wie ist das dort definiert? Wie sind die Konstanten fdexNamexxx definiert? Ich vermute dort einen Bug (evtl. WideString).
In Delphi 5 ist das nämlich noch nicht enthalten. Deshalb habe ich die Definition in die Unit BrowserTools integriert - allerdings per Compilerschalter nur bis Delphi 5. Ab Delphi 6 wird die Deklaration aus der Unit ActiveX verwendet. Mit Delphi 7 funktioniert das - nur Du hast mit Delphi 6 Probleme. Also könnte die Ursache in einer fehlerhaften Implementation des Interfaces unter Delphi 6 liegen.
Versuche mal bitte, die Compilerschalter {$IFNDEF DELPHI6_UP} in der Unit BrowserTools in {$IFNDEF DELPHI7_UP} zu ändern und poste mal die Deklaration von IDispatchEx aus der Unit ActiveX von Delphi 6.

bwilms 16. Mai 2011 15:46

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

nun funktioniert es. habe wie von dir beschrieben die BrowserTools.pas angepasst und nun kann ich die Demos auch mit D6 kompilieren.

Vielen Dank für die Hilfe und noch ein riesen Lob für die Umsetzung.

Gruß,Benjamin

Thom 16. Mai 2011 21:21

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

vielen Dank für das Lob! :-D

Schön, daß das Framework jetzt auch unter Delphi 6 funktioniert.
Ich werde die Compilerschalter in der nächsten Version entsprechend anpassen.
Da mich die Ursache für den Fehler aber trotzdem interessiert, würde ich Dich - oder jemanden, der auch Delphi 6 besitzt - darum bitten, mir die Deklaration von IDispatchEx aus der Unit ActiveX zukommen zu lassen (hier, per PM oder Email). Ich habe Delphi 6 übersprungen und kann das leider nicht selbst überprüfen.

Danke! :love:

Jumpy 17. Mai 2011 10:54

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

Delphi-Quellcode:
type
  {$EXTERNALSYM IDispatchEx}
  IDispatchEx = interface(IDispatch)
    ['{A6EF9860-C720-11D0-9337-00AC090DCAA9}']
    function GetDispID(const bstrName: TBSTR; const grfdex: DWORD;
       out id: TDispID): HResult; stdcall;
    function InvokeEx(const id: TDispID; const lcid: LCID; const wflags:
       WORD; const pdp: PDispParams; out varRes: OleVariant; out pei:
       TExcepInfo; const pspCaller: PServiceProvider): HResult; stdcall;
    function DeleteMemberByName(const bstr: TBSTR;
       const grfdex: DWORD): HResult; stdcall;
    function DeleteMemberByDispID(const id: TDispID): HResult; stdcall;
    function GetMemberProperties(const id: TDispID; const grfdexFetch:
       DWORD; out grfdex: DWORD): HResult; stdcall;
    function GetMemberName(const id: TDispID; out bstrName: TBSTR):
       HResult; stdcall;
    function GetNextDispID(const grfdex: DWORD; const id: TDispID;
       out nid: TDispID): HResult; stdcall;
    function GetNameSpaceParent(out unk: IUnknown): HResult; stdcall;
  end;

Thom 17. Mai 2011 11:30

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

genau das! Vielen Dank!

Allerdings konnte ich hier keinen Fehler entdecken. Gut für Borland & Co., schlecht für meine Fehlersuche... :stupid:

Lauten die Konstanten
Delphi-Quellcode:
  fdexNameCaseSensitive  = $1;
  fdexNameEnsure         = $2;
  fdexNameImplicit       = $4;
  fdexNameCaseInsensitive = $8;
?
Ist der Typ TBSTR
Delphi-Quellcode:
  TBStr = POleStr;
  POleStr = PWideChar;
?

Jumpy 17. Mai 2011 11:52

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

Zitat von Thom (Beitrag 1101337)
Lauten die Konstanten
Delphi-Quellcode:
  fdexNameCaseSensitive  = $1;
  fdexNameEnsure         = $2;
  fdexNameImplicit       = $4;
  fdexNameCaseInsensitive = $8;

Ja!
Delphi-Quellcode:
const
  { Input flags for GetDispID }
  {$EXTERNALSYM fdexNameCaseSensitive}
  fdexNameCaseSensitive      = $1;
  {$EXTERNALSYM fdexNameEnsure}
  fdexNameEnsure             = $2;
  {$EXTERNALSYM fdexNameImplicit}
  fdexNameImplicit           = $4;
  {$EXTERNALSYM fdexNameCaseInsensitive}
  fdexNameCaseInsensitive    = $8;
Zitat:

Zitat von Thom (Beitrag 1101337)
Ist der Typ TBSTR
Delphi-Quellcode:
  TBStr = POleStr;
  POleStr = PWideChar;

Ja!
Delphi-Quellcode:
{ Automation types }

  PBStr = ^TBStr;
  TBStr = POleStr;
Delphi-Quellcode:
{ OLE character and string types }

  TOleChar = WideChar;
  POleStr = PWideChar;
  PPOleStr = ^POleStr;

  POleStrList = ^TOleStrList;
  TOleStrList = array[0..65535] of POleStr;

Thom 17. Mai 2011 11:58

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

Da bin ich an dieser Stelle erst einmal ratlos und muß mir bei Gelegeneheit mal eine Delphi 6 - Version besorgen, um das Problem im Debugger nachvollziehen zu können. :roll:

capo 17. Mai 2011 13:14

AW: Google Maps über COM (Component Object Model)
 
Hallo, eine andere Frage. Darf man die Maps auch in eine kommerzielle Version bauen?
Ich müßte die nur die Entfernung zwischen A und B berechnen.
Oder soll ich besser einen neuen Thread aufmachen?

Thom 17. Mai 2011 13:32

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

nein, paßt auch in diesen Thread. :wink:

Ja, Du kannst die Karten bzw. das Framework natürlich auch in einem kommerziellen Programm verwenden. Das müßten wir nur vorher bereden. Außerdem will Google in diesem Fall Lizenzgebühren, die sich in der Größenordnung von 10000 ($ oder €) an aufwärts bewegen. Ob sich das für eine einfache Entfernungsberechnung von A nach B lohnt, mußt Du selbst entscheiden. Das hängt natürlich auch davon ab, wie genau diese Entfernung sein soll und ob zum Beispiel die Bewegungsart eine Rolle spielt (Fußgänger, Fahrrad- oder Autofahrer). Ist die Genauigkeit von geringerer Bedeutung, käme evtl. eine Berechnung der Luftlinie in Betracht. Das ist nur ein wenig Mathematik und kostet (außer etwas Überlegung) keine Lizenzgebühren.

capo 18. Mai 2011 08:12

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

10.000 habe ich leider nicht.
Ich brauche die Autofahrer-Variante.

Evtl. darf ich ja die OpenStreetMap dazu verwenden.
http://www.openstreetmap.org/

LG

Thom 18. Mai 2011 10:22

AW: Google Maps über COM (Component Object Model)
 
Ja, das sollte möglich sein. Schau mal zum Beispiel hier und hier.

capo 23. Mai 2011 07:31

AW: Google Maps über COM (Component Object Model)
 
Hey Danke. Ich schau mir das mal an.
:-D

Thom 29. Mai 2011 18:35

AW: Google Maps über COM (Component Object Model)
 
Der Bug im Google Maps API, der die Darstellung des Street View Panoramas im IE8 verhinderte, wurde behoben.

Ich wurde von BlueLiquidCell darauf aufmerksam gemacht, daß die Demo "Simple Overlay" nicht mehr richtig funktioniert.
Das liegt daran, daß der IE keine Positionsangaben mit einem Komma akzeptiert, sondern nur die englische Variante mit einem Punkt. Deshalb muß folgende Änderung vorgenommen werden:
Delphi-Quellcode:
procedure USGSOverlay.Draw;
var
  //...
  OldDecimalSeparator: Char; //<- neu
begin
  //...
  OldDecimalSeparator:={$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}DecimalSeparator; //<- neu
  try
    {$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}DecimalSeparator:='.'; //<- neu
    DivNode.Style.Left:=FloatToStr(SW.x)+'px';
    DivNode.Style.Top:=FloatToStr(NE.y)+'px';
    DivNode.Style.Width:=FloatToStr(NE.x-SW.x)+'px';
    DivNode.Style.Height:=FloatToStr(SW.y-NE.y)+'px';
  finally
    {$IFDEF DELPHIXE_UP}FormatSettings.{$ENDIF}DecimalSeparator:=OldDecimalSeparator; //<- neu
  end;
end;
Wobei ich mir nicht ganz sicher bin, ab welcher Delphi-Version FormatSettings existiert. Sollte also der Compiler mit einem Hinweis kommen, bitte ich um Information.

BBoy 3. Jun 2011 13:36

AW: Google Maps über COM (Component Object Model)
 
kann ich diese API auch für andere maps nutzen? Bräuchte das für detaillierte WAnderkarten wo auch kleine Waldwege usw drauf sind.

Und kann ich auf der Karte auch Text darstellen oder einen Marker benennen und deren Namen anzeigen lassen?

Thom 3. Jun 2011 15:11

AW: Google Maps über COM (Component Object Model)
 
Mit Google Maps kannst Du eigentlich beliebige Karten anzeigen lassen (z.B. auch OpenStreetMap - OSM). Diese besitzen in der höchsten Zoomstufe in der Regel mehr Details als die Google Karten (wobei das auf die Region ankommt).
Prinzipiell könntest Du auch unter Beachtung der entsprechenden Copyrights eine eigene Karte erstellen und anzeigen lassen.

Wie das geht, zeigt die Demo Image Map Types. Falls Du konkrete Frage zur Einbindung einer speziellen Karte hast: Ich habe noch etliche Demos auf meinem PC herumliegen, die ich bisher aus Zeitgründen noch nicht veröffentlicht habe.

Zu den Markern gibt es ebenfalls verschiedene Demos: Marker können gesetzt, verschoben und gelöscht werden. Ihr Aussehen kann individuell gestaltet und sogar animierte GIF's können verwendet werden. Einen ausführlichen Artikel mit etlichen Beispielen dazu gibt es in der Toolbox 3/2011.

Dein Delphi-Programm kann auf Events von der Karte reagieren und Hinweisfenster und dergleichen anzeigen.

Also um auf Deine Frage zu antworten: Ja, das ist alles möglich.

BBoy 3. Jun 2011 17:57

AW: Google Maps über COM (Component Object Model)
 
Und wie würde das dann funktionieren mit dem Text anzeigen lassen oder noch besser den namen der Marker?

Als Karte würde ich eine Topografische karte benötige. Vorliegen habe ich z.B. die Garmin Topo Deutschland.

Thom 3. Jun 2011 20:13

AW: Google Maps über COM (Component Object Model)
 
Schau Dir mal die Demo Events an: Dort siehst Du, wie das Programm auf Nachrichten der Karte reagiert. Auch Marker haben Event-Handler, die Du nutzen kannst.

Von der Garmin-Sache würde ich aus rechtlichen Gründen die Finger lassen: Lies Dir das mal durch.

Für satte 199 € die Dongelung an ein Navi-Gerät!? Für den Preis kann man sich eine Menge Papierkarten kaufen und diese sogar verleihen oder weiterverkaufen. Na gut: Wer's braucht und zuviel Geld hat...

Außerdem bringt die Garmin-Karte eine Software mit, die zur Anzeige und Planung dient - muß übrigens auch aktiviert werden.

Suche Dir also unbedingt eine frei verfügbare Karte - dann kann ich auch Tips zur Einbindung geben.

BBoy 3. Jun 2011 21:13

AW: Google Maps über COM (Component Object Model)
 
ok, dann schaue ich mal nach einer günstigeren oder kostenlosen karte.

Aber wegen Text auf der Map darstellen weis ich nicht wie mir das Events demo weiterhelfen soll.
Wie gesagt, am besten wäre es wenn die markernamen nicht nur angezeigt werden wenn man mit den Mauszeiger darüber geht sondern wenn er immer angezeigt wird. Oder eben wenn man wenigstens ein Textelement an die Marker platzieren könnte.

Thom 3. Jun 2011 22:52

AW: Google Maps über COM (Component Object Model)
 
Dann ist es am günstigsten, jeden Marker mit einem DIV-Element zu versehen, damit die Markierung samt Karte verschoben werden kann.

BBoy 4. Jun 2011 14:50

AW: Google Maps über COM (Component Object Model)
 
Ist es nicht einfach möglich ein label element an der marker position mit deiner api zu erstellen?

Und wie kann man z.B. Openstreetmap anstatt Google maps nutzen?

BBoy 5. Jun 2011 19:08

AW: Google Maps über COM (Component Object Model)
 
Wie kann ich denn eigentlich erstellte Marker oder PolyObjekte wieder löschen von der Karte?

Thom 7. Jun 2011 11:54

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

Zitat von BBoy (Beitrag 1104580)
Ist es nicht einfach möglich ein label element an der marker position mit deiner api zu erstellen?

Jain. Erst einmal eine kurze Erklärung zum Veständins: "Mein" API ist kein eigenständiges API, sondern lediglich ein Wrapper für das Google Maps API. Grundsätzlich kann es also weder mehr noch weniger als das JavaScript-API von Google. "Grundlegend" deshalb, weil einerseits aus Zeitgründen noch nicht alle Funktionen und Objekte des JavaScript-API's umgesetzt wurden (das betrifft vor allen Dingen den Teil von Street View), ich aber andererseits etliche Delphi-"Komfortfunktionen" hinzugefügt habe.

Zusätzliche Beschriftungen werden vom Google Maps API nicht explizit unterstützt. JavaScript-Programmierer nutzen für Labels meistens DIV-Container, die im Browser hinzugefügt und - bei Bedarf - mit Markern verknüpft werden. Ein Beispiel dazu habe ich in diesem Blog gefunden. Dadurch werden diese bei der Verschiebung der Karte mehr oder weniger verzögerungsfrei mitgeführt. Das ist aber ein konzeptionelles Problem, welches leider auch der Delphi-Wrapper nicht beseitigen kann.

Die gute Nachricht ist, daß die benötigten DIV-Container vom Framework angelegt werden können:
Delphi-Quellcode:
//...
var
  Container: TDivNode;
begin
  Container:=Script.Document.CreateDivNode;
  with Container.Style do
  begin
    Position:='absolute';
    Bottom:='50px';
    Left:='10px';
    Height:='10px';
    WhiteSpace:='nowrap';
    FontSize:='10px';
    FontFamily:='Arial, sans serif';
    //...
  end;
  //...
end;
Zitat:

Zitat von BBoy (Beitrag 1104580)
Und wie kann man z.B. Openstreetmap anstatt Google maps nutzen?

Eine Verständnisfrage: Meinst Du die Anzeige von Karten aus dem OSM-Projekt im Google Maps Player oder die Darstellung dieser Karten völlig ohne Google Maps API - also zum Beispiel im OpenLayers Player?
Es funktioniert nämlich beides: Der Google Player ist in der Lage, (nahezu) beliebige Karten darstellen. Dazu kann das Objekt ImageMapType verwendet werden.
Für die Nutzung von OpenLayers muß dessen API in Delphi Wrapper umgesetzt werden. Das ist technisch machbar - darüber wurde schon in früheren Beiträgen diskutiert. Ein erster Test verlief recht gut.

Zitat:

Zitat von BBoy (Beitrag 1104725)
Wie kann ich denn eigentlich erstellte Marker oder PolyObjekte wieder löschen von der Karte?

Einfach der Map-Eigenschaft den Wert nil zuweisen:
Delphi-Quellcode:
  Marker.Map:=nil;
  Polygon.Map:=nil;
Damit werden diese Objekte von der Karte entfernt. Die zugehörigen JavaScript-Objekte werden dann vom Browser selbst irgendwann freigegeben und die Delphi-Wrapper-Objekte durch den Programmcode oder bei Beendigung der Anwendung.

BBoy 9. Jun 2011 16:56

AW: Google Maps über COM (Component Object Model)
 
Danke für die ausführliche Antwort.
Die Sache mit dem löschen funktioniert 1a :)

Ich würde eigentlich gerne die onlinemap von Openstreetmap nutzen. Ist das aufwendig zu realisieren? Oder wäre es einfacher die offlinemap zu verwenden?

Und als Label auf der Karte meinte ich eher einfach Text darstellen, egal wie. Möchte einfach nur die Marker nummerieren. Weis aber nicht wie :(

Thom 9. Jun 2011 18:24

AW: Google Maps über COM (Component Object Model)
 
Jetzt hast Du leider immer noch nicht geschrieben, welchen Player Du zur Darstellung der OSM-Karten verwenden willst: Google Maps (damit meine ich nicht die Karten selbst, sondern das Ding, das die Karten anzeigt und für das der Wrapper geschrieben wurde) oder OpenLayers. :glaskugel:

Das geht - wie schon geschrieben - mit beidem, ist aber ein Unterschied bei der Programmierung:
  • Mit Google Maps und dem Framework ist es jetzt schon möglich, (fertig gerenderte) Karten aus dem OSM-Projekt anzuzeigen. Da bedeutet aber trotzdem bei kommerziellen Projekten Lizenzkosten an Google, da ja desses API zur Anwendung kommt - auch wenn es fremde Karten sind. Das würde ich zumindest vermuten - ich bin aber kein Rechtsanwalt. Eine Anfrage bei Google würde da Klarheit bringen.
  • Die Wrapper für OpenLayers existieren nur im Ansatz - es würde deshalb eine ganze Weile dauern, dessen API in Delphi nachzubilden. Diese Variante hätte allerdings den Vorteil, ohne Lizenzkosten auszukommen - außer eventuell einer Spende an das OSM-Projekt... :thumb:

Zur Frage online/offline:
Es kommt darauf an, ob Du nur einen Bereich oder die komplette Karte offline verwenden willst. Davon hängt nämlich die Kapazität Deiner Festplatte ab: In Zoomstufe 15 besteht eine Karte zum Beispiel aus (2^15*256)^2=70.368.744.177.664 Pixeln und ist damit ein Terrapixel-Bild 8-)
Eine andere Möglichkeit besteht darin, nur die geometrischen Kartendaten lokal zu speichern und daraus selbst eine Karte zu rendern. Dafür gibt's fertige Lösungen - zum Beispiel Maperitive.

Insofern ist natürlich eine Onlinevariante, die sich einfach die fertigen Kartenteile von den entsprechenden Servern holt, leichter zu realisieren.

Für Marker können auch eigene Bilder verwendet werden und damit auch solche, die zum Beispiel einen Buchstaben oder eine Zahl enthalten. Dafür empfehle ich den Artikel Delphi und Google Maps (Teil 3) in der Toolbox 3/2011, in dem es genau um dieses Thema geht.

BBoy 9. Jun 2011 19:06

AW: Google Maps über COM (Component Object Model)
 
Wegen dem Player verstehe ich nicht wirklich was du meinst. Ich nutze einfach deine Api, denke das es dann der google Player ist oder?
Genau genommen geht es mir immer nur um einen kleinen Kartenausschnitt den ich benötige. Vielleicht eine Kleinstadt groß. Aber ich benötige halt immer wieder andere Kartenteile von anderen Orten. Das ganze benötige ich auch nur weil google maps leider nicht kleine wege anzeigt, die mir aber wichtig sind.
Die Garmin Topo 2010 Karten habe ich mir mal gekauft da diese echt die besten sind. da ist jeder kleine Weg drauf und ist voll routingfähig. Da sind lauter .img dateien dabei und eine basemap. Kann man das irgendwie verwenden?
Hast du da ein Idee ob und wie in etwas man so was realisieren könnte?

Wegen den Markern, ich verwende schon eigene Marker die ich mit Google.Maps.MarkerImage einbinde. Diese sollen jedoch dynamisch nummeriert werden. Ich bringe die in eine Reihenfolge und in dieser sollen die dann per buttonklick nummeriert (oder sonst wie benannt) werden. Da es sich auch um mehere verschiedene Marker handelt ist eine feste Nummerierung keine option.
Was gibt es da noch für Möglichkeiten?

Thom 9. Jun 2011 20:01

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von BBoy (Beitrag 1105547)
Wegen dem Player verstehe ich nicht wirklich was du meinst. Ich nutze einfach deine Api, denke das es dann der google Player ist oder?

Ja. Jetzt habe ich das verstanden. :idea:
Zur Erklärung: Die Karten sind die eine Seite - die andere das Programm, das die Karten anzeigt. Ich nenne diese einfach allgemein "Player" - in Analogie zu Multimediaplayern wie zum Beispiel Windows Media Player oder DivX Player. Ob es dafür bei Geo-Daten eine einheitliche Bezeichnung gibt, weiß ich nicht. Ich lasse mich da aber gern belehren...
Für Google Maps gibt es offiziell das JavaScript-API (zu dem ich den Wrapper geschrieben habe), das dazu dient, die Karten von Google innerhalb eines Browsers darzustellen und das API für Flash.
Insofern sind die Begriffe API und Player Synonyme für die selbe Sache.

Zitat:

Zitat von BBoy (Beitrag 1105547)
Genau genommen geht es mir immer nur um einen kleinen Kartenausschnitt den ich benötige. Vielleicht eine Kleinstadt groß. Aber ich benötige halt immer wieder andere Kartenteile von anderen Orten. Das ganze benötige ich auch nur weil google maps leider nicht kleine wege anzeigt, die mir aber wichtig sind.
Die Garmin Topo 2010 Karten habe ich mir mal gekauft da diese echt die besten sind. da ist jeder kleine Weg drauf und ist voll routingfähig. Da sind lauter .img dateien dabei und eine basemap. Kann man das irgendwie verwenden?

Die Garmin Karten würde ich aus lizenzrechtlichen Gründen nicht verwenden (hatte ich schon einmal geschrieben).
Allerdings besitzen OSM-Karten teilweise eine bessere Qualität (Genauigkeit, Details) als Google-Karten. Das müßtest Du mal für den Bereich, der Dich interessiert, visuell überprüfen.
Zitat:

Zitat von BBoy (Beitrag 1105547)
Hast du da ein Idee ob und wie in etwas man so was realisieren könnte?

Die Anzeige von OSM-Karten mit dem Google Maps API funktioniert. Im Anhang befindet sich eine Demo, die eigentlich nicht zur Veröffentlichung bestimmt war (deshalb auch nur als compilierte EXE) und mir dazu diente, einige Designstudien vorzunehmen. Aber sie zeigt auch, daß die Verwendung von OSM-Karten kein Problem ist.
Zitat:

Zitat von BBoy (Beitrag 1105547)
Wegen den Markern, ich verwende schon eigene Marker die ich mit Google.Maps.MarkerImage einbinde. Diese sollen jedoch dynamisch nummeriert werden. Ich bringe die in eine Reihenfolge und in dieser sollen die dann per buttonklick nummeriert (oder sonst wie benannt) werden. Da es sich auch um mehere verschiedene Marker handelt ist eine feste Nummerierung keine option.
Was gibt es da noch für Möglichkeiten?

Ja - Toolbox lesen und zugehörige Beispiele ansehen. :wink:

BBoy 9. Jun 2011 20:41

AW: Google Maps über COM (Component Object Model)
 
Danke für die ausführliche Antwort.
Werde mir die Demos der Toolbox mal ansehen, kaufen werde ich mir die Zeitung aber deswegen nicht :)

Habe mir die angehängte exe mal angesehen. Diese "Mapnik" Map wäre für mich schon ok (zumindest besser als die google map). Wenn ich jetzt noch wüsste wie ich die in mein Programm bekomme mit deiner Api wäre ich glücklich :) Hast du da eine Idee??


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 Uhr.
Seite 2 von 14     12 3412     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz