Delphi-PRAXiS
Seite 21 von 55   « Erste     11192021 222331     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)

DelphiFan2008 10. Mär 2012 13:58

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

habe meine "Karte" mit einer Skalierung versehen. Momantan bestimme ich die Entfernung mit einer externen Funktion nach der Methode Orthodrome. GPSGetDistance( ) mit folgendem Quelltext.
Delphi-Quellcode:
procedure TForm1.MapZoomAndSized(Sender: TObject);
var
     t          : TLatLngBounds;
     x,y : Integer;
     fLat1,fLng1,
     fLat2,fLng2 : Double;
begin
  t := Map.GetBounds;

  fLat1 := t.GetNorthEast.Lat;
  fLng1 := t.GetNorthEast.Lng;
  fLat2 := t.GetSouthWest.Lat;
  fLng2 := t.GetSouthWest.Lng;

  x := Round( GPSGetDistance( 0.0,0.0,fLng1,fLng2 ) );
  y := Round( GPSGetDistance( fLat1,fLat2,0.0,0.0 ) );

  RUx.RightVal := x; // Steuerelement Ruler/Skala in x-Richtung
  RUy.RightVal := y; // Steuerelement Ruler/Skala in y-Richtung
end;
Verknüpft ist MapZoomAndSized() mit Map.OnZoomChanged und Map.OnBoundsChanged

Kann ich die Entfernung (Kartenausschnitt-Breite/Höhe) auch über GoogleMap direkt bestimmen?

Gruß DelphiFan2008

Thom 10. Mär 2012 21:00

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

die Lineale sehen ja super aus! :thumb:

Ja, die Breite und Höhe der angezeigten Karte läßt sich auch mit Hilfe des Google Maps API's berechnen. Dazu muß lediglich die Geometrie-Bibliothek eingebunden werden:
Delphi-Quellcode:
  LoadAPI(InitMap,[libGeometry]);
  //oder
  LoadAPIAsync(InitMap,[libGeometry]);
Die Berechnung selbst erfolgt dann über die Funktion ComputeDistanceBetween des Spherical-Objektes:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Width, Height: Double;
  NorthWest: {$IFDEF USE_INTERFACES}ILatLng{$ELSE}TLatLng{$ENDIF};
begin
  with Script do
  begin
    with Maps[0].Bounds do
    begin
      NorthWest:=New(Google.Maps.LatLng(NorthEast.Lat,SouthWest.Lng));
      Width:=Google.Maps.Geometry.Spherical.ComputeDistanceBetween(NorthWest,NorthEast);
      Height:=Google.Maps.Geometry.Spherical.ComputeDistanceBetween(NorthWest,SouthWest);
    end;
  end;
  ShowMessage(Format('Width: %f km, Height: %f km',[Width/1000,Height/1000]));
end;
Code:
NW---------NE
|          |
|          |
|          |
|          |
|          |
SW---------*

NW - NorthWest
NE - NorthEast
SW - SouthWest
Bei dieser Gelegenheit möchte ich einmal einen kleinen Ausblick auf die kommende Version des Frameworks geben:
Eine wichtige Erweiterung - neben vielen anderen Neuerungen - wird die Verwendung von Interfaces sein (siehe obiges Beispiel), so daß eine compilerunterstützte, automatische Freigabe nicht mehr benötigter Objekte zur Verfügung stehen wird. Bisher sollte (mußte aber nicht) das Objekt NorthWest im eigenen Quelltext freigegeben werden. Das wird nach der Umstellung auf Interfaces nicht mehr notwendig sein. 8-)

ReM 27. Mär 2012 20:50

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
I hope you understand english...
I have two groups of markers (red and blue). First group visible permanent. How can I change markers in second group? Remove all, change chosen, change all.

mkinzler 27. Mär 2012 21:00

AW: Google Maps über COM (Component Object Model)
 
Use different layers for the groups/background.

Thom 27. Mär 2012 22:04

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

use a list for the second group:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  [...]
  private
    FGroup2: TList;
  [...]
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FGroup2:=TList.Create;
end;

procedure TForm1.CreateMarkersFromGroup2;
var
  n: Integer;
  Marker: TMarker;
begin
  with Script do
  begin
    for n:=0 to ... do
    begin
      Marker:=New(Google.Maps.Marker(...));
      FGroup2.Add(Marker);
    end;
  end;
end;

procedure TForm1.HideGroup2;
var
  n: Integer;
begin
  for n:=0 to FGroup2.Count-1 do
    TMarker(FGroup2[n]).SetMap(nil);
end;
Another possibility is to store the markers individually:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  [...]
  private
    FMarker1,
    FMarker2,
    FMarker3,
    ...: TMarker;
  [...]
  end;

procedure TForm1.HideMarker1;
begin
  FMarker1.SetMap(nil);
end;

@mkinzler:

Diese Lösung würde mich interessieren. Soweit mir bekannt ist, rendert Google Maps alle Marker in einen gemeinsamen Layer (DIV-Element) (außer bei KML-Dateien, wobei dann aber keine "echten" Marker erstellt werden).
Wie steuerst Du die Zuordnung eines Markers zu einem bestimmten Layer bzw. "Background"?

ReM 28. Mär 2012 16:25

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

I get error E2251 Ambiguous overloaded call to 'SetMap'
on line
TMarker(FGroup2[n]).SetMap(nil);

Delphi 2009.

Thom 28. Mär 2012 18:49

AW: Google Maps über COM (Component Object Model)
 
Yes, sorry! Make a type cast:
Delphi-Quellcode:
TMarker(FGroup2[n]).SetMap(TMap(nil));
//...

ReM 29. Mär 2012 19:54

AW: Google Maps über COM (Component Object Model)
 
Thanks Thom. All works OK.
One more question:
how I can know, that the marker is outside of the visible map?

Thom 29. Mär 2012 20:12

AW: Google Maps über COM (Component Object Model)
 
This is nice!
Delphi-Quellcode:
  if Map.GetBounds.Contains(Marker.GetPosition)
    then ShowMessage('Marker is visible');

DelphiFan2008 9. Apr 2012 09:44

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

ich experimentiere gerade mit "Direction Draggable" und habe ein paar Fragen zu Erweiterungen, welche in der Web-Applikation Motoplaner verwendet wird
- wie kann ich Positions-Marker wieder löschen, vgl. Klick auf Marker -> Dialog
- wie kann ich das Aussehen des Positions-Marker verändern -> verschiebbarer Positions-Marker Bsp. Rund mit Plus
- wie kann ich den Maus-Cursor verändern Bsp. auf freier Karte Fadenkreuz
- wie kann ich die aktuelle Position des Positions-Marker LAT/LNG evntl. HÖHE ermitteln
- wie kann ich am einfachsten die Route bzw. Punkte aus GoogleMap in Delphi speichern und wieder aus Delphi in GoogleMap übertragen
- wie kann ich die aktuelle Länge der gesamten Route und von ersten Punkt zum verschiebbaren Positions-Marker ermitteln
und last but not least
- wie kann ich eine Liste (Track) aus der Route erzeugen Bsp. alle 100m entlang der Route LAT/LNG und evntl. HÖHE ermitteln und als Liste abspeichern

Viele Fragen, vielleicht für die einfache Antworten :lol:

Gruß DelphiFan2008


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
Seite 21 von 55   « Erste     11192021 222331     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