Delphi-PRAXiS
Seite 10 von 14   « Erste     8910 1112     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)

swaters 15. Dez 2012 04:35

AW: Google Maps über COM (Component Object Model)
 
Just had time to try your explanation out.

Works wonderfully.

Thank-you again Thom.

Really enjoying my dabbling now. A lot less frustration. Thanks again.

HJay 20. Dez 2012 15:07

AW: Google Maps über COM (Component Object Model)
 
Wenn ich mit dem folgenden Code ein Overlay-Rechteck erzeuge, dann hat dieses Rechtecke ein weißes Karomuster drübergelegt (feine weiße Linien senkrecht und waagerecht im Abstand von 5 cm oder so), das optisch immer gleich breit ist, egal welche Zoomstufe man wählt. Ist das ein Bug von GoogleMaps oder mache ich noch was falsch mit den Parametern?

Code:
procedure TGoogleMap.CreateTile;
  var Rectangle : TRectangle;
      RectOptions: TRectangleOptions;
begin
  with Script(WebBrowser) do begin
    Rectangle := New(Google.Maps.Rectangle);

    RectOptions:=TRectangleOptions.Create;
    with RectOptions do begin
      StrokeColor  := clBlack;
      StrokeOpacity := 0.8;
      StrokeWeight := 1;
      FillColor    := clRed;
      FillOpacity  := 0.35;
      Map          := Maps[0];
      Bounds       := Maps[0].GetBounds;
    end;

    Rectangle.SetOptions(RectOptions);
  end;
end;
Noch eine Ergänzungsfrage: Sollte ich RectOptions mit Free wieder freigeben oder ist das egal?

Thom 20. Dez 2012 15:52

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

:thumb:

Hallo HJay,

das liegt am API/dem IE. Die Karte besteht aus Kacheln der Größe 256x256 Pixel (sollte etwa dem 5x5 cm Raster auf Deinem Bildschirm entsprechen). Diese Bilder werden in DIV-Containern abgelegt. Unter Umständen gibt es dabei den von Dir erwähnten Pixelfehler. Dieser tritt aber in der Regel nur bei älteren IE-Versionen auf. Hast Du Dein Programm in der Registry "freigeschaltet"?

Das Optionsobjekt kannst Du freigeben - mußt Du aber nicht. Momentan kommt es einfach nur darauf an, wie oft Du ein neues Rechteck erstellst: Bei 10 Stück spielt der Speicherverbrauch kaum eine Rolle, bei 10000 aber schon. In diesem Fall solltest Du nicht mehr benötigte Objekte in Deinem Programmcode freigeben.

HJay 20. Dez 2012 16:27

AW: Google Maps über COM (Component Object Model)
 
Ich habe das Konzept mit den New()-Befehlen noch nicht ganz verstanden. Häufen sich dadurch nicht jede Menge Objekte an, die man eigentlich freigeben müsste?

Ich kann ein Rectangle wieder entfernen, indem ich seine Eigenschaft Map auf nil setze. Dann kann ich es aber erneut sichtbar machen, indem ich wieder eine Map zuweise. Wie aber lösche ich ein Rectangle endgültig und gebe die Ressourcen frei?

In der folgenden Routine erzeuge ich nur zum Ausprobieren nach dem Event drag_end kleine Rechtecke in den Ecken des neuen sichtbaren Bereichs. Muss ich mich um die mit New() erzeugten Objekte noch irgendwie kümmern? Belasten die TLatLng und TLatLngBounds nach Ende der Routine weiterhin die Ressourcen?

Und umgekehrt, kann ich mir das von function CreateTile: TRectangle zurückgegebene Rechteck in einer TObjectList merken und später weiter verwenden, z.B. um Farbe oder Bounds anzupassen?

Darf ich die Objekte mit Rectangle.Free freigeben und fertig? Wenn ich das TLatLngBounds-Object nur temporär benötige, dann müsste ich also eher ALatLngBounds := New(...) zuweisen und dann CreateTile(ALatLngBounds) aufrufen und dann ALatLngBounds.Free aufrufen, um sauber zu bleiben?

Der Aufruf RectOptions.Bounds := ABounds kopiert die Werte, oder? Dafür muss es das ursprünglich mit New erzeugte und der Funktion übergebene TLatLngBounds-Object nicht dauerhaft geben, oder?

Ich werde nämlich relativ viele Rechtecke und Punkte berechnen müssen und möchte schon von vornhereins auber bleiben.

Ich werde noch nicht schlau daraus, was jetzt klassische Objekte sind und was Variablen.

Code:
function TGoogleMap.CreateTile(ABounds: TLatLngBounds): TRectangle;
  var Rectangle : TRectangle;
      RectOptions: TRectangleOptions;
begin
  with Script(WebBrowser) do begin
    Rectangle := New(Google.Maps.Rectangle);

    RectOptions := TRectangleOptions.Create;
    with RectOptions do begin
      StrokeColor  := clBlack;
      StrokeOpacity := 0.8;
      StrokeWeight := 1;
      Clickable    := False;
      FillColor    := clRed;
      FillOpacity  := Random;
      Map          := Maps[0];
      Bounds       := ABounds;
    end;

    Rectangle.SetOptions(RectOptions);
    Result := Rectangle;
  end;
end;

procedure TGoogleMap.MapDragEnd(Sender: TObject);
  var ALatLng : TLatLng;
      BLatLng : TLatLng;
begin
  with Script(WebBrowser) do begin
    ALatLng := Maps[0].Bounds.GetSouthWest;
    BLatLng := New(Google.Maps.LatLng(ALatLng.Lat + 0.003, ALatLng.Lng + 0.003));
    CreateTile(New(Google.Maps.LatLngBounds(ALatLng, BLatLng)));

    BLatLng := Maps[0].Bounds.GetNorthEast;
    ALatLng := New(Google.Maps.LatLng(BLatLng.Lat - 0.003, BLatLng.Lng - 0.003));
    CreateTile(New(Google.Maps.LatLngBounds(ALatLng, BLatLng)));
  end;
end;

HJay 20. Dez 2012 16:34

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

Zitat von Thom (Beitrag 1196282)
Unter Umständen gibt es dabei den von Dir erwähnten Pixelfehler. Dieser tritt aber in der Regel nur bei älteren IE-Versionen auf. Hast Du Dein Programm in der Registry "freigeschaltet"?

Ich habe Windows 7 mit IE9 und das Programm ist in der Registry freigeschaltet. Na ja, schade, aber nicht so schlimm.

Google gibt etliche Treffer in bezug auf DOCTYPE-Deklarationen, die nötig sind. Das wird doch aber sicherlich von Dir schon gemacht, oder?

Thom 20. Dez 2012 18:29

AW: Google Maps über COM (Component Object Model)
 
Jaaaaa, die Speicherverwaltung. Das ist ein abendfüllendes Thema. :)

Prinzipiell arbeiten alle Objekte des Frameworks als "Wrapper" oder "Adapter" für bestehende oder neu zu erstellende JavaScript-Objekte. (siehe Grafik). Die JavaScript-Objekte werden über ihre COM-Interfaces angesprochen, die vom Delphi-Wrapper-Objekt gespeichert werden. Solange das Delphi-Objekt also noch existiert, wird auch nicht die Interface-Referenz auf das JavaScript-Objekt freigegeben (Referenz-Zählung) und damit kann auch die JavaScript-Engine des Internet Explorers das (JavaScript-)Objekt nicht freigeben.

Damit möglichst wenig/nichts verloren geht, werden alle vom Framework erstellten Wrapper-Objekte zentral verwaltet und spätestens beim Beenden des Programmes freigegeben.
Unterscheiden muß man dabei die eigentlichen Karten-(Wrapper-)Objekte wie TMap, TRectangle, TMarker usw. und die "Hilfs"-Objekte wie zum Beispiel TMapOptions oder TRectangleOptions. Die Karten-Objekte werden beim Aufruf der entsprechenden Methoden erstellt (Google.Maps.Map, Google.Maps.Rectangle usw.) und anschließend vom Script-Objekt verwaltet (Script.Maps[...], Script.Rectangles[...] usw.).

In JavaScript werden neue Objekte mit der Anweisung "new" erstellt:
Code:
var latLng = new google.maps.latLng(10,20);
[...]
Damit ist auch ersichtlich, daß hier ein neues Objekt angelegt wird. Delphi bietet so etwas nicht, so daß das neue Objekt einfach mit
Delphi-Quellcode:
var LatLng: TLatLng;
  [...]
  LatLng:=Google.Maps.LatLng(10,20);
  [...]
erstellt wird. Viele (Delphi-)Programmierer halten das aber für eine unsaubere Programmierung: Es wird aufgrund des Syntax nicht deutlich, daß an dieser Stelle ein neues Objekt entsteht, wem es "gehört" und wer für dessen Freigabe zuständig ist. Deshalb wurde in der Version 2 des Frameworks die New-Funktion eingeführt, die vom programmtechnischen Standpunkt eigentlich vollkommen überflüssig ist:
Delphi-Quellcode:
function New(Value: Txxx): Txxx;
begin
  Result:=Value;
end;
Sie kann also ohne Probleme weggelassen werden und dient lediglich der besseren Lesbarkeit des Quelltextes:
Delphi-Quellcode:
  Map:=Google.Maps.Map;
  //hat die selbe Funktion wie
  Map:=New(Google.Maps.Map);
Das wird sich in der Version 3 des Frameworks radikal ändern: Die Maps-Methoden liefern dann nur noch eine Objekt-Klasse und erst die New-Funktion erstellt das eigentliche (Wrapper-)Objekt. Damit wird dann die Verwendung der New-Funktion obligatorisch.
Zusätzlich wird es auch für alle "Hilfs"-Objekte (wie TRectangleOptions) Konstruktor-Methoden im entsprechenden Namespace geben:
Delphi-Quellcode:
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  [...]
Die direkte Erstellung über
Delphi-Quellcode:
  RectangleOptions:=TRectangleOptions.Create;
  [...]
wird dann nicht mehr möglich sein, da die entsprechenden Konstruktor-Methoden nicht mehr public sind.

Was auf den ersten Blick wie eine Bevormundung des Programmierers aussieht, hat aber mehrere Gründe. Zum einen zählt dazu die bessere Lesbarkeit und die einheitliche Strukturierung des Quelltextes. Zum anderen gibt es den technischen Aspekt, wenn mehrere Browser-Komponenten verwendet werden: Jedes Objekt muß nämlich im entsprechenden Browser-Kontext erstellt werden und das geht nur, wenn dem neu zu erstellenden Objekt das entsprechende Script-Objekt übergeben wird.
Momentan muß das so geschehen:
Delphi-Quellcode:
  RectangleOptions:=TRectangleOptions.Create(Script(WebBrowser1));
  [...]
Das sieht nicht nur bescheiden aus, sondern ist auch im Gegensatz zum neuen Syntax wesentlich komplizierter:
Delphi-Quellcode:
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  [...]
Da das Objekt Maps "weiß", in welchem Kontext es existiert, kann demzufolge auch das Objekt RectangleOptions korrekt erstellt werden.

Obwohl - wie schon erwähnt - alle Objekte automatisch freigegeben werden (alle Karten-Objekte zum Beispiel auch bei einem Refresh mit der Taste F5) ist es mitunter sinnvoll, sie manuell im Quelltext freizugeben. Das betrifft allerdings in der Regel nur die "Hilfsobjekte" (TxxxOptions).

Trotzdem würde ich Dir empfehlen, momentan keine "Hilfsobjekte" manuell freizugeben, da die neue Frameworkversion nach außen hin ausschließlich mit Interfaces arbeitet und damit eine explizite Freigabe überflüssig wird. (Falls jetzt jemand von den Delphi-Profis kommt und sagt "Interfaces werden nicht freigegeben" - dooooooch, auch das wird gehen. Korrekterweise wird natürlich nicht das Interface freigegeben, sondern das dahinterliegende Objekt.)

Wird allerdings ein Rechteck nicht mehr benötigt, kann es selbstverständlich mit Free in den (digitalen) Mülleimer befördert werden. Es meldet sich dann automatisch bei allen internen Listen ab.
Delphi-Quellcode:
var
  Rectangle: IRectangle;
  RectangleOptions: IRectangleOptions;
begin
  [...]
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  RectangleOptions.xxx;
  [...]
  Rectangle:=New(Google.Maps.Rectangle(RectangleOptions));
  [...]
end; //<- hier wird RectangleOptions automatisch freigegeben, Rectangle bleibt selbstverständlich erhalten
Das Speichermanagement-Problem wird sich also mit der Umstellung auf die kommende Version quasi von selbst erledigen. Um darauf gerüstet zu sein, sollte man keine harten Typumwandlungen mehr vornehmen, sondern jetzt schon den as-Operator verwenden:
Delphi-Quellcode:
  //schlecht:
  TRectangle(Sender).xxx;
  //besser:
  (Sender as TRectangle).xxx;
Damit ist dann die Umstellung schnell erledigt:
Delphi-Quellcode:
  //geht nicht:
  IRectangle(Sender).xxx;
  //geht:
  (Sender as IRectangle).xxx;

HJay 28. Dez 2012 20:48

AW: Google Maps über COM (Component Object Model)
 
Wie kann man den Text eines GoogleMaps-Controls ändern?

Derzeit lautet der Text zum Beispiel "Text" in Fettdruck und ich möchte je nach Bool-Zustand den Text entweder in normal oder in fett ausgeben.

Derzeit ändert sich beim Click folgendes:
+ vorher: weiße Box mit Rahmen und dem Text "Text"
+ nachher: keine Box mehr, nur noch der Text "XXX"

Wie kann man die weiße Box erhalten und einfach nur '<b>Text</b>' durch 'Text' ohne Fettdruck ersetzen?

Wahrscheinlich greife ich auf das falsche InnerHTML-Objekt zu.

Vielen Dank im voraus!

Code:
procedure TGoogleMap.InitMap(Sender: TObject);
  var
    MyOptions        : TMapOptions;
    MyMap            : TMap;
    AControlDiv      : TNode;
    AControl         : TJScriptObject;
begin
  with Script(WebBrowser) do begin
    MyOptions := TMapOptions.Create(Script(WebBrowser));
    with MyOptions do begin
      Zoom := 12;
      Center := New(Google.Maps.LatLng(53.250249,9.835209));
      MapTypeID := Google.Maps.MapTypeID.Roadmap;
    end;
    MyMap := New(Google.Maps.Map(MyOptions));

    MyMap.OnZoomChanged := MapZoomChanged;
    MyMap.OnDragEnd    := MapDragEnd;

    { add button control }
    AControlDiv := Document.CreateDivNode;
    AControl   := TJScriptObject.Create;
    InitControl(AControlDiv);
    MyMap.Controls[Google.Maps.ControlPosition.TopLeft].Push(AControlDiv);
  end;

  if Assigned(Callback) then Callback(Sender);
end;

procedure TGoogleMap.InitControl(AControlDiv: TNode);
  var AControlUI, AControlText: TNode;
begin
  with Script(WebBrowser) do begin
    AControlDiv.Style.Padding := '5px';
    AControlUI := Document.CreateDivNode;
    with AControlUI do
    begin
      with Style do
      begin
        BackgroundColor :=clWhite;
        BorderStyle    :='solid';
        BorderWidth    :='1px';
        Cursor         :='pointer';
        TextAlign      :='center';
      end;
      Title:='a hint to pop up';
    end;
    AControlDiv.AppendChild(AControlUI);

    AControlText := Document.CreateDivNode;
    with AControlText do begin
      with Style do begin
        FontFamily  := 'Arial,sans-serif';
        FontSize    := '12px';
        PaddingLeft := '4px';
        PaddingRight := '4px';
      end;
      InnerHTML := '<b>Text</b>';
    end;
    AControlUI.AppendChild(AControlText);

    Google.Maps.Event.AddDomListener(AControlUI, 'click', NewFunction(ControlClick));
  end;
end;

procedure TGoogleMap.ControlClick;
begin
  with Script(Webbrowser) do Maps[0].Controls[Google.Maps.ControlPosition.TopLeft].Items[0].InnerHTML := 'XXX';
end;

swaters 31. Dez 2012 09:01

AW: Google Maps über COM (Component Object Model)
 
Thom,
I would like to get the Result for a request as a xml. Is it possible?
My idea is to edit my series of roots and then create one gpx file and then load it to my gps and hopefully be talked through my journey by my iphone.

Thanks.

Peter.Stadler 18. Jan 2013 14:42

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

Wie kann man im Delphiprogramm mit Deinem Framework und mit GoogleMaps auf einen Marker clicken und dadurch z. B. ein Programm starten, das ein Bild oder eine Bilder-Kollektion anzeigt?

mfg Peter

Peter.Stadler 19. Jan 2013 13:24

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

Habe gerade das EventSimple Projekt studiert. Im Prinzip macht es das, was ich brauche. Aber...
Wenn mehr als ein Marker vorhanden ist, wie bekommt man den Bezug zum richtigen Marker. Bei mir sollt jeder
Marker bei jedem OnClick Event etwas Anderes auslösen.

mfg Peter

HJay 20. Jan 2013 12:43

AW: Google Maps über COM (Component Object Model)
 
Thom leistet hier den besten Support, den ich bisher genossen habe. In den letzten Wochen scheint er aber abwesend zu sein, hoffentlich geht es ihm gut!

@Peter.Stadler: Ich versuche mich mal an einer Antwort auf Deine Frage. Am geradlinigsten wäre es, wenn Du für jeden Marker, den Du erzeugst, ein zusätzliches, eigenes Delphi-Objekt anlegst und selbst verwaltest. In dem Objekt speicherst Du dann auch zusätzlich als Referenz den Marker ab. Alle GoogleMap Marker können dann die gleiche Routine aufrufen und Du suchst Dir dort einfach Dein Objekt anhand des Markers heraus und machst dann, was Du willst.

jonathan 9. Feb 2013 18:30

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

ist es möglich, den Entfernungsmesser (Maps Labs) zu nutzen?
http://maps.google.de/maps?ftr=0
Oder gibt es eine alternative Lösung zum komfortablen messen von Entfernungen?

Thom 10. Feb 2013 12:38

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

bitte entschuldigt, daß ich so lange nicht auf Fragen geantwortet habe.
Ich hatte in den letzten Wochen an einem Auftragsprojekt gearbeitet und das war zeitlich so eng, daß mir leider nicht genügend Zeit für andere Dinge blieb.

@jonathan
Auf dieser Seite verwendet Goggle nicht das öffentliche API sondern testet zum Beispiel neue Funktionen. Ob diese dann Einzug in das JavaScript API halten, weiß nur Google allein.
Diesen Entfernungsmesser kannst Du allerdings ganz einfach mit den herkömmlichen Mitteln selbst zusammenbauen: Zwei Marker, ein Polyline-Objekt und zur Berechnung der Länge die Geometie-Bibliothek.
Ich hatte das gerade ausprobiert: Das läßt sich alles in 20 Minuten zusammenbasteln:
Anhang 38548

@HJay
Vielen Dank für das Lob und die Wünsche!
Ja - bis auf den Streß seit Weihnachten ist alles OK. Ich hoffe, daß ich in den nächsten Wochen wieder mehr Zeit habe, um mich um das Framework zu kümmern. Die Leute bei Google schlafen ja auch nicht, so daß inzwischen viele Neuerungen im API dazugekommen sind, die ich noch integrieren möchte.
Auf der letzten Roadshow-Veranstaltung habe ich ganz überraschend eine Lizenz für das RAD Studio XE3 gewonnen, so daß ich jetzt auch alles mit Delphi XE3 testen kann. An dieser Stelle noch einmal einen herzlichen Dank an Embarcadero!
Ich hatte mir übrigens auch noch einmal das Pixel-Problem bei Linien und Flächen angeschaut: Das tritt bis zum IE8 auf, ab IE9 aber nicht mehr. Das bedeutet, daß Windows XP-Benutzer an dieser Stelle leider Pech haben. Google wird da ganz bestimmt nichts mehr nachbessern.
Hast Du inzwischen das Problem mit dem Div-Element lösen können? Falls nicht, sag bitte Bescheid, damit ich mir die Sache noch einmal genauer anschaue.

@Peter.Stadler
Im OnClick-Ereignis wird als Sender immer das betreffende Objekt mit übergeben. Ein
Delphi-Quellcode:
  (Sender as TMarker).DoSomething;
  //
sollte in der Regel das gewünschte Ergebnis liefern.
Willst Du zusätzliche Informationen im Marker speichern, kannst Du das über die Eigenschaft Properties machen:
Delphi-Quellcode:
  Marker.Properties['MeineNeueEigenschaft']:='Test';
  [...]
  if Marker.Properties['MeineNeueEigenschaft']='Test'
    then ShowMessage('Das ist mein Lieblingsmarker');
Neue Programme starten kanns Du dann auf die herkömmliche Art und Weise zum Beispiel mit ShellExecute().

@swaters
Excuse my late answer!
You can directly use the Google Directions API to get an XML response.
If you want to create a GPX file, you can also use a XML component (for example TXMLDocument) and use data from TDirectionsResult.

jonathan 12. Feb 2013 09:38

AW: Google Maps über COM (Component Object Model)
 
Hi,
beim setzen der Property "DraggableCursor" auf z.B.'crosshair' bekomme ich die Fehlermeldung "Unbekannter Name"

Nach Änderung in der gmMap.pas
Code:
procedure TMapOptions.SetDraggableCursor(Value: String);
begin
//  SetProp(MapOptionsProp_DraggableCursor,Value,false);
  SetProp(MapOptionsProp_DraggableCursor,Value,true);
end;
funktioniert das ganze dann...

Bug?
Oder mache ich etwas falsch?

Thom 12. Feb 2013 10:03

AW: Google Maps über COM (Component Object Model)
 
Bug. :pale:
Ist in der kommenden Version gefixt. Danke für den Hinweis!

GPRSNerd 12. Feb 2013 11:16

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

Zitat von Thom (Beitrag 1203049)
Bug. :pale:
Ist in der kommenden Version gefixt. Danke für den Hinweis!

War letztes Jahr schon reportet worden in #193.

jonathan 16. Feb 2013 19:53

AW: Google Maps über COM (Component Object Model)
 
Tatsächlich. Hatte ich übersehen, sorry.

Thom 16. Feb 2013 20:38

AW: Google Maps über COM (Component Object Model)
 
Kein Grund, sich zu entschuldigen!
Mir ist es wesentlich lieber, wenn ein Fehler mehrfach gemeldet wird (und wie von Dir sogar mit einer Lösung), als gar nicht. :thumb:

Tonic1024 22. Mär 2013 09:16

AW: Google Maps über COM (Component Object Model)
 
Wir haben tatsächlich das Geld locker gemacht und einen Premier-Accout bei google gebucht. Goggle mailt nun aber grad meinen Chef grad an weil wir die API nicht richtig verwenden und nen ellen langen Text warum wir das aber müssen. Und da schei++e nach unten fällt steh ich da nun mit meinem Talent.

Präzise gesagt soll ich laut Google unsere Client-ID verwenden (woher nehm ich die?) und unsere URL, laut Google darf das gerne auch die "192.168.2.Dings" sein (wozu soll das gut sein), registrieren um danach zusätzlich lauter sinnloses Zeug (z.B. Google Analytics) tun zu können. Dabei funktioniert dank dieses Wrappers schon alles wie ich es mir wünsche. Bis heut Morgen war das Projekt für mich abgeschlossen.

Wie kann ich da vorgehen? Gibts ne Variable im Wrapper die ich füllen muss?

Gruß,

Toni

Thom 22. Mär 2013 10:10

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

herzlichen Glückwunsch! :thumb:

Da die Spenden, die ich bisher erhalten habe, Lichtjahre entfernt sind von der Summe, die für einen Premier-Account fällig sind, habe ich das Framework logischerweise noch nicht mit der kommerziellen Google Maps Variante testen können.
In der kommenden Version 3 sind allerdings schon Vorkehrungen getroffen worden, die benötigten Daten übertragen und eine SSL-Verbindung aufbauen zu können. Allerdings ist diese Version noch nicht ganz fertig und es fehlen die notwendigen Tests, um sie produktiv einzusetzen. Das wird noch einige Wochen dauern. Momentan kämpfe ich gerade mit dem Feueraffen... :roll:

Da Ihr das Framework offenbar kommerziell/innerbetrieblich einsetzt, kann ich Euch entsprechende Hilfe anbieten. Am Besten wäre eine telefonische Absprache. Näheres dazu per PM.

Viele Grüße
Thomas

Tonic1024 22. Mär 2013 12:54

AW: Google Maps über COM (Component Object Model)
 
Du erwischt mich unvorbereietet :-D

Ich werd mal intern was klären, auch wie ich das "neue" Projekt zeitlich einordnen darf/soll, und eine Testumgebung vorbereiten und Anfang der Woche auf das Angebot zurückkommen wenn das okay ist.

[Edit]Ach... Ich hab ja Urlaub.:wall: Nach Ostern, ja?[/Edit]

Gruß,

Toni

Thom 22. Mär 2013 13:07

AW: Google Maps über COM (Component Object Model)
 
Kein Problem.
Da wünsche ich Dir einen erholsamen Urlaub und schöne Osterfeiertage - vorzugsweise ohne Schnee... :thumb:

Viele Grüße
Thomas

BBoy 23. Mär 2013 18:04

AW: Google Maps über COM (Component Object Model)
 
Bevor ich alle Seiten lese... Weißt du wann in etwa V3 kommen wird? Nur so etwa....

Wo finde ich eigentlich die: Geometrie-Bibliothek?

Thom 23. Mär 2013 18:14

AW: Google Maps über COM (Component Object Model)
 
Dauert wahrscheinlich noch einige Wochen. Das liegt daran, daß ich zwischendurch noch einige andere Dinge fertigstellen muß.

Die Geometrie-Bibliothek befindet sich in der Unit gmLibrariesGeometry.pas.

alibaba 25. Mär 2013 13:19

AW: Google Maps über COM (Component Object Model)
 
Nur mal zum Nachdenken...

Bin gerade dabei ein Delphi Programm zu portieren,
Ziel ist möglichst Plattformunabhängig zu operieren,
was liegt also näher als das ganze von Delphi nach Javascript
zu portieren und im Browser auszuführen.

Zwei Tools hab ich gefunden mit denen das zu funktionieren scheint:

1: dhtmlxSuite http://dhtmlx.com/

Grid, Edit, Form, Windows usw. mit einem funktionierentem Connector für diverse Datenbanken.

2: Leaflet http://leafletjs.com/

Map Ersatz bzw. Zwischenschicht für Google Maps und allen möglichen anderen OSM, Nokia, Bing ...
Superschnell und mit allem was man sich wünscht...


Klar das das trotzdem ne Menge Arbeit mit sich bringt aber es lohnt sich, Anbindung an Websockets, WebRTC usw. sind dann ein Kinderspiel.

FROHE OSTERN
lg
Albert

Thom 25. Mär 2013 14:18

AW: Google Maps über COM (Component Object Model)
 
:gruebel: OK. Ich habe nachgedacht...

Hallo Albert,

vielen Dank für Deine Vorschläge! Aber ich vermute, Du hast den Sinn dieses Frameworks (und damit aller anderen, im ersten Beitrag verlinkten Komponenten) mißverstanden:
Das Google Maps API ist von Haus aus eine reine JavaScript-Lösung. Da muß man nichts umstellen, portieren oder dergleichen. Will oder muß man plattformübergreifen für einen Browser entwickeln, nutzt man einfach JavaScript und fertig.

Hier geht es aber darum, Delphi-Entwicklern die Nutzung zu ermöglichen, ohne selbst eine einzige Zeile JavaScript schreiben zu müssen. Das API wird übrigens im Browser (TWebBrowser) mit JavaScript ausgeführt (das ist auch die einzige legale Möglichkeit des Zugriffs).

Das, was Du vorschlägst, wäre ein JavaScript-Wrapper für einen Delphi-Wrapper für JavaScript... :wink:

Und ganz nebenbei: Ich mag Delphi (Pascal) als Programmiersprache. Sie ist mir wesentlich lieber als JavaScript. Das ist natürlich Geschmackssache und jeder kann dazu eine andere Meinung haben. Es gibt viele Entwickler, die Sprachen ohne Typisierung vorziehen und die mit Delphi nicht zurechtkämen.
Dazu kommt, daß eine kompilierte Anwendung bei effektiver Programmierung wesentlich schneller ist. Das kann ich deshalb mit Bestimmtheit sagen, da ich auch an Lösungen arbeite, die von TWebBrowser und JavaScript unabhängig sind. Dort ist die Darstellung locker um den Faktor 10 schneller.

In Sachen Plattformunabhängigkeit tut sich ja bei Delphi auch einiges. FireMonkey ist trotz seines schlechten Rufs und der unbestreitbaren Bugs ein Framework, das enormes Potential aufweist. Dank seiner vektororientierten Darstellung eignet es sich logischerweise hervorragend, vektorielle Daten - wie zum Beispiel geografische Informationen - darzustellen. Bei den kachelbasierenden (JavaScript-) Playern ist man dagegen darauf angewiesen, vom Server die vorgerenderten Tiles zu erhalten.

Ich wünsche Dir natürlich viel Erfolg bei der Umstellung von Delphi nach JavaScript und ebenfalls ein frohes Osterfest!

Viele Grüße
Thomas Nitzschke

alibaba 25. Mär 2013 15:12

AW: Google Maps über COM (Component Object Model)
 
:? UUPS, wollte Dir nicht zu nahe treten, ist halt meine Meinung,

denn Sinn Deines Frameworks und der Komponenten verstehe ich sehr wohl und habe die
grösste Hochachtung vor Deiner Arbeit, hab sehr viel davon gelernt.

Meine Anregung wäre gewesen statt der Google JS Api die JS Api von Leaflet zu nehmen
damit wäre man nicht von Google abhängig und kann dann mit dem gleichen Code in Delphi
auch andere Maps (Lizenzkosten) verwenden.

Delphi ist und bleibt auch für mich die beste IDE (zumindest bis Delphi 7) ;-)
Und zu Windows schweig ich.
lg
Albert

Thom 25. Mär 2013 20:31

AW: Google Maps über COM (Component Object Model)
 
Ich muß mich entschuldigen - ich hatte Deine Vorschläge falsch verstanden. :pale:

Wegen der Nutzung anderer Player, die die Daten des OpenStreetMap Projektes nutzen, kamen schon mehrere Anfragen. Mit der im Framework verwendeten Delphi-to-JavaScript-Bridge ließe sich das auch ohne Probleme bewerkstelligen - es wäre nur eine Frage des zeitlichen Aufwandes.

Ein paar Überlegungen meinerseits dazu:

Player, die OpenStreetMap-Daten verwenden, gibt es etliche:
Auf der eines Seite gibt es die reinen JavaScript Lösungen, die einerseits weitestgehend plattformunabhängig nutzbar sind, andererseits aber immer eine JavaScript-Engine und damit in der Regel einen Browser benötigen. Genannt seien da als Beispiele CloudMade, OpenMapQuest, Leaflet und OpenCycleMap.

Darauf aufbauend gibt es die Gruppe von Komponenten, die diese JavaScript-Player in Browser-Komponenten für Delphi zur Verfügung stellen:
So hat zum Beispiel TMS seit einiger Zeit WebOSMaps im Angebot, mit dessen Hilfe OpenLayers in einer auf TWebBrowser basierenden Komponente in Delphi-Anwendungen genutzt werden kann. Zum Preis-Leistungs-Verhältnis: :wall:

ECMap bietet in der Delphi-Komponente neben Google Maps auch Google Earth, Bing Maps, CloudMade, OpenMapQuest und Leaflet an und setzt neben TWebBrowser auch Chromium Embedded an. Dieses Paket ist sehr umfangreich und hat dadurch auch einen entsprechenden Preis.

Auf der anderen Seite gibt es dann die Komponenten, die ohne JavaScript auskommen:
Die Firma THB Componentware aus Österreich bietet einen Komponente namens THBImage an, die Vektor- und Rasterdaten aus dem OpenStreetMap Projekt darstellen kann. Dazu gibt es eine Online-Demo, für die man ein ActiveX installieren muß. Beim Download des ActiveX-Controls schlägt aber sofort mein Virenscanner Alarm und entfernt den Download wieder von der Platte. Der Hersteller bekommt es offenbar noch nicht einmal hin, sein Plugin zu signieren. Wirklich sehr vertrauenserregend... :stupid:

StelifeMap ist eine Komponente, die Rasterdaten (also auch wieder Kartenkacheln) ohne Browser-Komponente in Delphi darstellen kann. Der Preis von momentan 20,48€ + MwSt. für die Komponente ohne Quelltext liest sich ganz fair. Wie gut die Komponente selbst ist, kann ich nicht sagen, da ich noch nicht zum Testen gekommen bin. (*)

Trotz aller Freiheit der OpenStreetMap Daten sollte man einige Dinge nicht vergessen:
In dichtbesiedelten Gebieten - vor allen Dingen in Mitteleuropa - ist der Qualität der Karten teilweise erheblich besser, als bei Google Maps. Das ändert sich schlagartig, wenn man "den Rest der Welt" betrachtet. Das ist auch logisch und verständlich: Schließlich haben viele Menschen zum Beispiel in Südamerika oder Afrika andere Sorgen, als mit einem GPS-Gerät durch die Gegend zu laufen. Trotzdem wächst natürlich jeden Tag die Datenmenge enorm. Dadurch ist es schon eine sehr anspruchsvolle Aufgabe, selbst eine Datenbank mit den OpenStreetMap-Daten aufzusetzen. Ich habe von vielen Projekten gelesen, die schon daran gescheitert sind.

Die Dienste, die Google Maps bietet, sind (momentan) unerreichbar. So werden zum Beispiel Routenanfragen innerhalb von einigen zehntel Sekunden beantwortet. Über OpenStreetMap dauert das bei längeren Strecken (ca. 500 km) auch mal 10 Sekunden und länger und die Länge der Route weicht dann unter Umständen um 1/5 von der Google Maps Route ab. Nicht umsonst ist gute Wegfindungssoftware (damit meine ich nicht nur für Straßen und Wege, sondern zum Beispiel auch für Spiele) extrem teuer.

Höhendaten sind in OpenStreetMap nicht flächendeckend verfügbar. Luftbilder - nun ja...

Der Download von OpenStreetMap Kacheln zwecks Offline-Nutzung ist zwar meistens erlaubt, wird aber nur in einem angemessenen Umfang geduldet, da hier Bandbreite und Serverkapazitäten arg strapaziert werden. Das kostet viel Geld, was wiederum irgendwo herkommen muß - und das ist bei OpenSource-Projekten nicht ganz so einfach. Und die Bereitschaft zu spenden ist leider eine recht unterentwickelte Eigenschaft. Geiz ist eben geil, auch wenn dadurch so manches tolle Projekt den Bach heruntergeht. Aber das ist schon wieder ein anderes Thema.

Das sind nur einige Beispiele. Damit will ich auf keinen Fall OpenStreetMap schlecht machen. Ein kommerzieller Anwender muß sich aber natürlich sehr genau überlegen, auf welche Daten er Wert legt und wie genau diese sein müssen. Und da werden schnell 10000 $ für eine Google Maps Lizenz zum Schnäppchen.

Damit stellt sich unterm Strich bezüglich OpenStreetMap immer die Frage: Verwende ich eine fertige Lösung (mit/ohne JavaScript mit allen ihren tollen Features und Bugs) oder baue ich selbst eine Infrastruktur, die als Ausgangsbasis die OpenStreetMap-Vektordaten verwendet.
Der erste Weg ist bequem und relativ schnell umsetzbar - der zweite ist wesentlich flexibler, aber auch unvergleichlich aufwendiger.

Ich hoffe, ich habe Dich nicht zu sehr gelangweilt - frei nach dem Motto des Forums: Hier erhalten Sie Antworten auf Fragen, die Sie nie gestellt haben... :-D

Bezüglich Delphi stimme ich Dir zu. :thumb:
Und obwohl die neueren IDE's den einen oder anderen Bug haben - ich kann damit wirklich schön und komfortabel programmieren. So kann ich zum Beispiel wunderbar 64-Bit-ISAPI-DLL's erstellen und den Hauptspeicher des Servers mit 10 GB vollschreiben... :-D
Hast Du schon mal XE3 getestet?

Betreffs Windows: Jaaa... :-D

P.S.: Die Verarbeitung und Nutzung der OpenStreetMap-Vektordaten ist unabhängig vom Framework in Arbeit. Insofern mache ich eigentlich genau das, was Du vorgeschlagen hast - nur eben nicht mit einem vorhandenen JavaScript-Player. :thumb:

(*) P.P.S.:
Ich hatte gerade die Komponente getestet.
Völlig unbrauchbarer Zoom: Man landet an der verkehrten Stelle. Ein gezielter Zoom auf eine bestimmte Stelle ist unmöglich. Der Schieberregler im Zoom-Steuerelement ist ohne Funktion (man verschiebt einfach die darunterliegende Karte).
Die sichtbaren Kartenkacheln werden immer komplett geladen, bevor die Karte verschoben werden kann. Das führt zu erheblichen Rucklern.
Wird die Karte nach Norden oder Süden verschoben, taucht sie oben bzw. unten wieder auf. Bewegt man sich dagegen nach Westen oder Osten, verschwindet die Karte aus dem Sichtbereich. Der Entwickler hat da wohl irgend etwas mißverstanden.
Von den Bugs und der mangelnden Qualität mal abgesehen, begeht der Anbieter auch einen klaren Lizenzverstoß: In der Demo erfolgt keinerlei Hinweis auf OpenStreetMap - dagegen steht an allen möglichen Stellen auf der Karte ein Copyrighthinweis auf Stelife. :evil:
Fazit: Auch hier Finger weg davon!

BBoy 27. Mär 2013 09:37

AW: Google Maps über COM (Component Object Model)
 
Wie kann man mit der Maus auf der Karte ein Rectangle ziehen?
Momentan setze ich mit einem Klick das linke obere Eck und mit dem nächsten das rechte untere Eck. Und zeichne dann das Rechteck mit Script.Google.Maps.Rectangle(RectangleOptions);
Mir wäre aber ein aufziehen mit der Maus lieber...

Und wie kann ich am einfachsten Entfernungen zwischen 2 Punkten messen? (die ich mir der maus setzte).
Oder die Strecke einer Polylinie die ich auf der Karte zeichne.
Also einfach mit Lat und Lng punkten ohne geocoder.

Thom 27. Mär 2013 11:54

AW: Google Maps über COM (Component Object Model)
 
Für das interaktive Zeichnen eignet sich die Drawing-Bibliothek (diese wird ab Version 2.1 des Frameworks unterstützt; dort ist auch eine Demo dazu enthalten) und für Abstands- und Längenberechnungen kann man die Geometry-Bibliothek verwenden (ab Version 2.0).

BBoy 29. Mär 2013 06:12

AW: Google Maps über COM (Component Object Model)
 
2.1 gibt es aber noch nicht, nur 2.0 oder? 2.1 ist dann die Version die in ein paar Wochen fertig sein soll?

GPRSNerd 29. Mär 2013 08:57

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

Zitat von BBoy (Beitrag 1209299)
2.1 gibt es aber noch nicht, nur 2.0 oder? 2.1 ist dann die Version die in ein paar Wochen fertig sein soll?

2.0 ist die Open Source Version, die du dir hier runterladen kannst. 2.1 war für diejenigen gedacht, die Thomas durch eine Spende unterstützt haben. Demnächst kommt dann die 3.0...

swaters 11. Apr 2013 19:27

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

Zitat von Thom (Beitrag 1202794)
@swaters
Excuse my late answer!
You can directly use the Google Directions API to get an XML response.
If you want to create a GPX file, you can also use a XML component (for example TXMLDocument) and use data from TDirectionsResult.

Thank-you very much Thom. A reply is better late than never. Thanks again.

Thom 24. Apr 2013 00:25

AW: Google Maps über COM (Component Object Model)
 
@swaters:
Thank you!

Das Framework sollte jetzt auch mit Delphi XE4 funktionieren. Die entsprechende inc-Datei wurde im ersten Beitrag hinzugefügt.
Es erscheinen zwar Hinweise, daß einige Funktionen nicht expandiert werden konnten (als Inline-Funktion): Wen das stört, kann die entsprechenden Units im uses-Abschnitt hinzufügen - ansonsten einfach ignorieren.

Peter.Stadler 29. Mai 2013 22:14

AW: Google Maps über COM (Component Object Model)
 
Hallo Thom,
Was ist eigentlich der Unterschied zwischen 2.0 und 2.1?
Wann darf man mit Version 3.0 rechnen, was wird es alles können? Wird es auch mit dem neuen GoogleMaps funktionieren?

Viele Fragen auf einmal!

mfg Peter

Thom 29. Mai 2013 22:53

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

die 2.1 enthält einige Erweiterungen bezüglich der Version 2.0 (so zum Beispiel die Drawing Library). Ich hatte sie bisher als kleines Dankeschön an jene per Email verschickt, die für das Projekt gespendet haben und natürlich an kommerzielle Nutzer.

Die Version 3.0 ist eine starke Überarbeitung der Version 2.x, bei der vor allem Wert auf eine bessere Speicherbenutzung gelegt wird. Das äußert sich nach außen hin in der Umstellung der Objekte auf Interfaces. Geplant ist, alle Objekte und Funktionen des Google Maps APIs zu unterstützen.
Diese Version sollte eigentlich schon vor einigen Monaten fertig sein. Auf Grund der vielen Arbeitsstunden, die ich bisher in das Projekt investiert habe, mußte ich die Arbeit am Framework immer wieder wegen Projekten unterbrechen, die das notwendige Geld dafür einbringen... :roll:
Ich bemühe mich aber, die Sache so schnell wie möglich in einen nutzbaren Zustand zu bringen, auch wenn ich noch kein konkretes Datum nennen kann. Erste Tests mit den verschiedenen Delphiversionen (einschließlich XE4) verliefen bisher ganz zufriedenstellend. :-D

Das "neue" Google Maps habe ich mir bisher aus Zeitgründen noch nicht genauer angeschaut. Die Frage ist hierbei, ob es dafür auch ein API geben wird, wie die Lizenzbedingungen aussehen werden (also ob die Nutzung in Desktopanwendungen erlaubt sein wird) und welche Browser unterstützt werden. Deshalb kann ich dazu leider noch nichts konkretes sagen. Schön wäre es aber natürlich. :-D

Viele Grüße
Thomas

Peter.Stadler 30. Mai 2013 15:33

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

Hier gibt es Info über das neue GoogleMaps.
http://googlegeodevelopers.blogspot....i-for-all.html

Wenn ich es richtig verstanden habe, benutzt es das API 3.0. Das einzige, was man ändern muss, ist:

The new look is available for opt-in today, and is a simple one line code change: google.maps.visualRefresh=true;.


Das müsste doch leicht zu realisieren sein? Wo müsste man das im Framework 2.1 einbauen?

mfg Peter

Thom 30. Mai 2013 15:40

AW: Google Maps über COM (Component Object Model)
 
Das ist aber nur der neue Stil der Steuerelemente - hat nichts mit den neuen vektorbasierenden Karten zu tun.
Ich werd's gleich mal ausprobieren und melde mich dann wieder...

Da bin ich wieder... :stupid:
Delphi-Quellcode:
  Google.Maps.Properties['visualRefresh']:=true;
  [...]
irgendwo bei der Initialisierung der Karte unterbringen - fertig. Und dann über den "fresh new look" freuen... :-D

Peter.Stadler 30. Mai 2013 19:10

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

I habe die Zeile eingefügt, aber es bleibt beim alten GoogleMaps, es gibt keinen stufenlosen Zoom und ich bilde mir ein, dass auch die Map tiles die alten sind.

mfg Peter

Thom 30. Mai 2013 21:23

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

da hast Du vollkommen Recht. Hier geht es allerdings um zwei völlig verschiedene Dinge: Mit diesem Flag kann man lediglich das Aussehen der Steuerelemente etwas "moderner" gestalten. Die Schatten werden zum Beispiel etwas dezenter dargestellt. Siehe Google. Das hat jedoch absolut nichts mit den neuen Karten von Google zu tun. Da kann man nur abwarten, ob diese auch per API ansteuerbar sind oder ob es sich lediglich um eine geschlossene Darstellungsweise wie unter http://maps.google.de handelt.

Beim Zoom hast Du mich allerdings auf einen Fehler im Framework aufmerksam gemacht: Das sanfte Zoomen sollte ab dem IE8 mit entsprechendem Registryeintrag funktionieren. Da muß ich bei Gelegenheit mal nachschauen, wo es klemmt... :gruebel:

Viele Grüße
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 10 von 14   « Erste     8910 1112     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