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: 5429
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) 6-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: 589
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: 589
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)

Antworten