LazMapViewer Karte zentrieren (gelöst)
- h-elsner
- Lazarusforum e. V.
- Beiträge: 320
- 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)
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?
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.
Re: LazMapViewer Karte zentrieren
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.
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) 9-mal heruntergeladen
- h-elsner
- Lazarusforum e. V.
- Beiträge: 320
- 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
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
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
- h-elsner
- Lazarusforum e. V.
- Beiträge: 320
- 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
Ich hatte das viel zu kompliziert gemacht.
Das Konstrukt war mir nicht klar:
Ich hatte es umständlich gemacht:
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.
Das Konstrukt war mir nicht klar:
Code: Alles auswählen
MapView1.Center := RealPoint(52.516275, 13.377704); 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:
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)
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:
Jetzt springt die Karte auch auf meine Coordinaten.
Grüße Maik
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;
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)
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)
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.
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)
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)
So jetzt sollte es funktionieren wie es ich mir vorgestellt habe.
In der NMEA_reader_main folgend so abändern:
In der NMEA_suff wie folgend + in den uses StrUtils hinzufügen:
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;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)
Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: LazMapViewer Karte zentrieren (gelöst)
Sollte vielleicht anmerken, dass es eine Menge von solchen String-zu-GPS-Funktionen in der Unit mvGeoMath des LazMapViewer-Package gibt:
Siehe auch die erklärenden Kommentare im Code.
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;-
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)
Hallo wp,
die habe ich auch gefunden, haben aber nicht funktioniert. Oder ich habe sie falsch benutzt.
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)
Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: LazMapViewer Karte zentrieren (gelöst)
Inwiefern? Der MapViewer hat einen Satz von Unit-Tests, in denen diese Konversionsroutinen rauf-und-runter getestet werden.sstvmaster hat geschrieben: Mi 6. Mai 2026, 17:39 die habe ich auch gefunden, haben aber nicht funktioniert.
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)
Wie in h-elsner seinem Git (Zeile 525,526):
https://codeberg.org/h-elsner/NMEA_read ... r_main.pas
Die NMEA-Daten sind:
https://codeberg.org/h-elsner/NMEA_read ... r_main.pas
Die NMEA-Daten sind:
Also 5089.12345 N, 01312.34567 E.$GPGLL,5089.12345,N,01312.34567,E,165158.00,A,A*63
LG Maik
Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- h-elsner
- Lazarusforum e. V.
- Beiträge: 320
- 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 (gelöst)
Ich habe heute zum ersten Mal das Programm mit Windows ausprobiert und gleich gemerkt, dass StrToFloat über den Dezimalseperator stolpert. Bei meinem LINUX war das auf Punkt eingestellt, bei Windows aber nicht. Deshalb kommt 0 raus und wir sind im Ozean.
Dies habe ich aber schon abgefangen in dem Commit "Decimal seperator, Time". Ich arbeite halt immer noch daran...
Bei mir geht es (win / LINUX) ohne DateUtils Hauptprogramm weil es im NMEA_stuff.pas drin ist (denke ich mal).
Dies habe ich aber schon abgefangen in dem Commit "Decimal seperator, Time". Ich arbeite halt immer noch daran...
Bei mir geht es (win / LINUX) ohne DateUtils Hauptprogramm weil es im NMEA_stuff.pas drin ist (denke ich mal).
- h-elsner
- Lazarusforum e. V.
- Beiträge: 320
- 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 (gelöst)
Ich frage mich, ob es wirklich notwendig ist, den DefaultFormatSettings.DecimalSeparator zwischenzuspeichern.
In einem anderen Programm hatte ich das im Form.Create einfach für das ganze Programm gesetzt.
DefaultFormatSettings.DecimalSeparator:='.';
Macht man damit etwas kaputt? Greift das ins Betriebssystem in die Umgebungsvariablen ein oder ist das auf das laufende Programm beschränkt?
In einem anderen Programm hatte ich das im Form.Create einfach für das ganze Programm gesetzt.
DefaultFormatSettings.DecimalSeparator:='.';
Macht man damit etwas kaputt? Greift das ins Betriebssystem in die Umgebungsvariablen ein oder ist das auf das laufende Programm beschränkt?