LazMapViewer Karte zentrieren (gelöst)

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 318
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

LazMapViewer Karte zentrieren (gelöst)

Beitrag von h-elsner »

Ich mache meine ersten Versuche mit LazMapViewer. Ich habe eine Komponente MapView auf das Formular gelegt, einen Provider ausgewählt und die Karte wird dargestellt. Ich starte mit Zoomfaktor 10.
Zum Zentrieren der Karte habe ich einen TRealPoint, wo nur lat und lon gesetzt sind.
Diesen weise ich MapView.Center zu. Soweit so gut. Bis Zoomstufe10 geht das auch, aber bei höheren Zoomstufen liegt das Zentrum irgendwo, aber nicht auf der Koordinate. Es sieht so aus, als ob das Kartenzentrum nach Süd-Westen weggewandert ist und der eigentliche Punkt gar nicht mehr auf der Karte ist, z.B. bei Zoomstufe 11 zwar noch auf der Karte aber nahe am oberen Rand.
Frage ist das so (vielleicht wegen der Tiles)oder gibt es einen Trick, auch bei höheren Zoomstufen den die eigentliche Position noch ins Bild zu bekommen?
Zuletzt geändert von h-elsner am Mi 6. Mai 2026, 10:52, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5431
Registriert: Fr 8. Apr 2011, 09:01

Re: LazMapViewer Karte zentrieren

Beitrag von wp_xyz »

Zoomst du mit dem Mausrad? Dann musst du ZoomToCursor auf false einstellen, andernfalls ist der Zoom-Fixpunkt die Position des Mauscursors.

In dem beigefügten Test bleibt bei allen Zoom-Einstellungen immer das Brandenburger Tor in Berlin in der Mitte der Karte.
Dateianhänge
center.zip
(2.5 KiB) 7-mal heruntergeladen

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 318
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: LazMapViewer Karte zentrieren

Beitrag von h-elsner »

Danke vielmals, das schaue ich mir heute an.
Ich mache eigentlich beides:
Ich lese aus einem GPS-Modul die Daten im NMEA-Format aus.
Beim Start des Programms setzte ich die Zoomstufe auf 10, übergebe eine Default-Position als TRealPoint an die Karte. Der Punkt liegt da schon nicht so richtig in der Mitte, ist aber wenigstens darauf.
Wenn ich das GPS Modul connecte, dann soll die erste erkannte Koordinate die Karte zentrieren. Von da aus sollen (später) die Punkte jede Sekunde eingetragen werden, aber soweit bin ich noch nicht. Vor dem Connecten verschiebe ich (zum Test) die Karte mit der Maus irgendwo hin und änders die Zoomstufe. Wenn ich dann wieder connect drücke soll wieder zentriert werden, aber da geht es nicht mehr.

Das Projekt ist hier: https://codeberg.org/h-elsner/NMEA_reader

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 318
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: LazMapViewer Karte zentrieren

Beitrag von h-elsner »

Ich hatte das viel zu kompliziert gemacht.
Das Konstrukt war mir nicht klar:

Code: Alles auswählen

MapView1.Center := RealPoint(52.516275, 13.377704); 
Ich hatte es umständlich gemacht:

Code: Alles auswählen

 var
    point: TRealPoint;  
   
    ...
    point.lat:=52.516275;
    point.lon:=13.377704;
    ....
    MapView.Center.lat:=point.lat:
    MapView.Center.lon:=point.lon:
    
 
Irgendwie ging das nicht richtig, kann ich aber jetzt auch nicht mehr nachstellen, komisch.
Aber hauptsächlich funktioniert das jetzt alles und es sieht eleganter aus. Danke.

Edit:
Ach, kann sein, dass ZoomToCursor:=true, das anfängliche Problem war.

sstvmaster
Beiträge: 592
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

Hallo,

habe es auch mal probiert.

Wenn ich mich mit meinem GPS Modul verbinde und dann auf Map klicke, wird die Karte südwestlich von Afrika positioniert.
Habe dann mal geschaut warum. In der NEMA_reader.pas in Zeile 525,526 wurde für position.Lat und Lon nur "0" (null) zurück gegeben.

Habe dann in der NEMA_suff.pas die function CoordinateToFloat folgend umgebaut:

Code: Alles auswählen

function CoordinateToFloat(const c, d: shortstring): double;
var
  FCoordinate: double;
  FCode: integer;
begin
  val(c, FCoordinate, FCode);
  if FCode=0 then begin
    result:=FCoordinate/100;
    //result:=StrToFloatDef(c, 0)/100;
    if (d='S') or (d='W') then
      result:=-result;
  end;
end;
Jetzt springt die Karte auch auf meine Coordinaten.

Grüße Maik
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 592
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

Hi,

habe gerade noch mit der neuen Version vom Git probiert.
Ohne aktiven GPS, startet die Map mit Illertissen. Mit aktiven GPS wird Lat und Lon wieder zu 0°.

Ich bin hier unter Windows mit Laz Stable, als 32bit.

Außerdem fehlt in der "nmea_reader_main.pas" die Unit DateUtils, deshalb wird auch "UniversalTimeToLocal" nicht gefunden.
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 592
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

So jetzt sollte es funktionieren wie es ich mir vorgestellt habe.

In der NMEA_reader_main folgend so abändern:

Code: Alles auswählen

  procedure FillGLL;
  var
    pkt: TRealPoint;
  begin
    FillCharts;
    pkt:=RealPoint(LatStrToDouble(MessageData[1], MessageData[2]),
                   LonStrToDouble(MessageData[3], MessageData[4]));
    if StatusIsActive(MessageData[6]) then begin
      CenterMap(pkt);
      SetPointOnMap(pkt);
    end;
In der NMEA_suff wie folgend + in den uses StrUtils hinzufügen:

Code: Alles auswählen

...
function LatStrToDouble(const Lat: String; NS: shortstring): Double;
function LonStrToDouble(const Lon: String; EW: shortstring): Double;
function NMEAToFloat(const c: shortstring): double;
...

function NMEAToFloat(const c: shortstring): double;
var
  FNMEA: double;
  FCode: integer;
begin
  val(c, FNMEA, FCode);
  if FCode<>0 then
    result := 0
  else
    result := FNMEA;
end;

function LatStrToDouble(const Lat: String; NS: shortstring): Double;
begin
  result := NMEAToFloat(LeftStr(Lat, 2));
  result := result + NMEAToFloat(MidStr(Lat, 3, 8))/60;
  if (NS = 'S') or (NS = 's') then
    result := -result;
end;

function LonStrToDouble(const Lon: String; EW: shortstring): Double;
begin
  result := NMEAToFloat(LeftStr(Lon, 3));
  result := result + NMEAToFloat(MidStr(Lon, 4, 8))/60;
  if (EW = 'W') or (EW = 'w') then
    result := -result;
end;

end.
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 5431
Registriert: Fr 8. Apr 2011, 09:01

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von wp_xyz »

Sollte vielleicht anmerken, dass es eine Menge von solchen String-zu-GPS-Funktionen in der Unit mvGeoMath des LazMapViewer-Package gibt:

Code: Alles auswählen

function LatToStr(ALatitude: Double; DMS: Boolean): String;
function LatToStr(ALatitude: Double; DMS: Boolean; AFormatSettings: TFormatSettings): String;
function LonToStr(ALongitude: Double; DMS: Boolean): String;
function LonToStr(ALongitude: Double; DMS: Boolean; AFormatSettings: TFormatSettings): String;
function TryStrToGps(const AValue: String; out ADeg: Double;
    N:String = ''; E:String = ''; S:String = ''; W:String = ''): Boolean;
function TryStrDMSToDeg(const AValue: String; out ADeg: Double;
    N:String = ''; E:String = ''; S:String = ''; W:String = ''): Boolean;
Siehe auch die erklärenden Kommentare im Code.

sstvmaster
Beiträge: 592
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

Hallo wp,

die habe ich auch gefunden, haben aber nicht funktioniert. Oder ich habe sie falsch benutzt.
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 5431
Registriert: Fr 8. Apr 2011, 09:01

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von wp_xyz »

sstvmaster hat geschrieben: Mi 6. Mai 2026, 17:39 die habe ich auch gefunden, haben aber nicht funktioniert.
Inwiefern? Der MapViewer hat einen Satz von Unit-Tests, in denen diese Konversionsroutinen rauf-und-runter getestet werden.

Was ist dein Input-String?

sstvmaster
Beiträge: 592
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

Wie in h-elsner seinem Git (Zeile 525,526):

https://codeberg.org/h-elsner/NMEA_read ... r_main.pas

Die NMEA-Daten sind:
$GPGLL,5089.12345,N,01312.34567,E,165158.00,A,A*63
Also 5089.12345 N, 01312.34567 E.
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

Antworten