From efd629624c2070061827a607e5cf60c427276b51 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Thu, 25 Apr 2019 19:42:50 +0000 Subject: [PATCH] lazmapviewer: Use E/W and N/S suffixes to GPS coordinates. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6868 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../lazmapviewer/example/gpslistform.pas | 8 ++- components/lazmapviewer/example/main.lfm | 1 + components/lazmapviewer/example/main.pas | 53 +++++++++++-------- components/lazmapviewer/source/mvdlefpc.pas | 2 +- components/lazmapviewer/source/mvengine.pas | 28 ++++++++++ 5 files changed, 64 insertions(+), 28 deletions(-) diff --git a/components/lazmapviewer/example/gpslistform.pas b/components/lazmapviewer/example/gpslistform.pas index cfb9256e3..3e8c7d771 100644 --- a/components/lazmapviewer/example/gpslistform.pas +++ b/components/lazmapviewer/example/gpslistform.pas @@ -46,7 +46,7 @@ implementation {$R *.lfm} uses - mvTypes; + mvTypes, mvEngine; destructor TGPSListViewer.Destroy; begin @@ -55,8 +55,6 @@ begin end; procedure TGPSListViewer.Populate; -const - GPS_FORMAT = '0.00000°'; var i: Integer; item: TListItem; @@ -80,8 +78,8 @@ begin // item.Caption := IntToStr(gpsObj.ID); if gpsObj is TGpsPoint then begin item.SubItems.Add(gpsObj.Name); - item.Subitems.Add(FormatFloat(GPS_FORMAT, TGpsPoint(gpsObj).Lat)); - item.Subitems.Add(FormatFloat(GPS_FORMAT, TGpsPoint(gpsObj).Lon)); + item.Subitems.Add(LatToStr(TGpsPoint(gpsObj).Lat, true)); + item.Subitems.Add(LonToStr(TGpsPoint(gpsObj).Lon, true)); end; end; finally diff --git a/components/lazmapviewer/example/main.lfm b/components/lazmapviewer/example/main.lfm index e88c8e94b..b3a2b9091 100644 --- a/components/lazmapviewer/example/main.lfm +++ b/components/lazmapviewer/example/main.lfm @@ -625,6 +625,7 @@ object MainForm: TMainForm OnZoomChange = MapViewZoomChange OnChange = MapViewChange OnDrawGpsPoint = MapViewDrawGpsPoint + OnMouseLeave = MapViewMouseLeave OnMouseMove = MapViewMouseMove OnMouseUp = MapViewMouseUp end diff --git a/components/lazmapviewer/example/main.pas b/components/lazmapviewer/example/main.pas index f458cb03a..2f4f379a5 100644 --- a/components/lazmapviewer/example/main.pas +++ b/components/lazmapviewer/example/main.pas @@ -67,8 +67,8 @@ type const ALoc: TRealPoint); procedure MapViewChange(Sender: TObject); procedure MapViewDrawGpsPoint(Sender, ACanvas: TObject; APoint: TGpsPoint); - procedure MapViewMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + procedure MapViewMouseLeave(Sender: TObject); + procedure MapViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure MapViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MapViewZoomChange(Sender: TObject); @@ -78,6 +78,7 @@ type private procedure ClearFoundLocations; + procedure UpdateCoords(X, Y: Integer); procedure UpdateDropdownWidth(ACombobox: TCombobox); procedure UpdateLocationHistory(ALocation: String); procedure UpdateViewportSize; @@ -110,10 +111,12 @@ const MAX_LOCATIONS_HISTORY = 50; HOMEDIR = ''; MAP_PROVIDER_FILENAME = 'map-providers.xml'; + USE_DMS = true; var PointFormatSettings: TFormatsettings; + function CalcIniName: String; begin Result := ChangeFileExt(Application.ExeName, '.ini'); @@ -339,32 +342,22 @@ begin end; end; +procedure TMainForm.MapViewMouseLeave(Sender: TObject); +begin + UpdateCoords(MaxInt, MaxInt); +end; + procedure TMainForm.MapViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); const DELTA = 3; var - rPt: TRealPoint; rArea: TRealArea; gpsList: TGpsObjList; L: TStrings; i: Integer; begin - rPt := MapView.Center; - InfoCenterLongitude.Caption := Format('%.6f° = %s', [rPt.Lon, GPSToDMS(rPt.Lon)]); - InfoCenterLatitude.Caption := Format('%.6f° = %s', [rPt.Lat, GPSToDMS(rPt.Lat)]); - { - InfoCenterLongitude.Caption := Format('%.6f°', [rPt.Lon]); - InfoCenterLatitude.Caption := Format('%.6f°', [rPt.Lat]); - } - - rPt := MapView.ScreenToLonLat(Point(X, Y)); - InfoPositionLongitude.Caption := Format('%.6f° = %s', [rPt.Lon, GPSToDMS(rPt.Lon)]); - InfoPositionLatitude.Caption := Format('%.6f° = %s', [rPt.Lat, GPSToDMS(rPt.Lat)]); - { - InfoPositionLongitude.Caption := Format('%.6f°', [rPt.Lon]); - InfoPositionLatitude.Caption := Format('%.6f°', [rPt.Lat]); - } + UpdateCoords(X, Y); rArea.TopLeft := MapView.ScreenToLonLat(Point(X-DELTA, Y-DELTA)); rArea.BottomRight := MapView.ScreenToLonLat(Point(X+DELTA, Y+DELTA)); @@ -376,11 +369,9 @@ begin for i:=0 to gpsList.Count-1 do if gpsList[i] is TGpsPoint then with TGpsPoint(gpsList[i]) do - L.Add(Format('%s' + Lineending + ' (lat=%.6f°=%s, lon=%.6f°=%s°)', [ - Name, Lat, GPSToDMS(Lat), Lon, GPSToDMS(Lon) + L.Add(Format('%s (%s / %s)', [ + Name, LatToStr(Lat, USE_DMS), LonToStr(Lon, USE_DMS) ])); - //L.Add(Format('%s' + Lineending + ' (lat=%.6f°, lon=%.6f°)', [Name, Lat, Lon])); - GPSPointInfo.Caption := L.Text; finally L.Free; @@ -461,6 +452,24 @@ begin end; end; +procedure TMainForm.UpdateCoords(X, Y: Integer); +var + rPt: TRealPoint; +begin + rPt := MapView.Center; + InfoCenterLongitude.Caption := LonToStr(rPt.Lon, USE_DMS); + InfoCenterLatitude.Caption := LatToStr(rPt.Lat, USE_DMS); + + if (X <> MaxInt) and (Y <> MaxInt) then begin + rPt := MapView.ScreenToLonLat(Point(X, Y)); + InfoPositionLongitude.Caption := LonToStr(rPt.Lon, USE_DMS); + InfoPositionLatitude.Caption := LatToStr(rPt.Lat, USE_DMS); + end else begin + InfoPositionLongitude.Caption := '-'; + InfoPositionLatitude.Caption := '-'; + end; +end; + procedure TMainForm.UpdateDropdownWidth(ACombobox: TCombobox); var cnv: TControlCanvas; diff --git a/components/lazmapviewer/source/mvdlefpc.pas b/components/lazmapviewer/source/mvdlefpc.pas index 43347915f..7f80d398d 100644 --- a/components/lazmapviewer/source/mvdlefpc.pas +++ b/components/lazmapviewer/source/mvdlefpc.pas @@ -73,7 +73,7 @@ begin {$IF FPC_FullVersion >= 30000} http.AllowRedirect := true; {$IFEND} - http.AddHeader('User-Agent','Mozilla/5.0 (compatible; fpweb)'); + http.AddHeader('User-Agent', 'Mozilla/5.0 (compatible; fpweb)'); {$IF FPC_FullVersion >= 30101} if UseProxy then begin http.Proxy.Host := FProxyHost; diff --git a/components/lazmapviewer/source/mvengine.pas b/components/lazmapviewer/source/mvengine.pas index 6159cbe5a..bbfb3877f 100644 --- a/components/lazmapviewer/source/mvengine.pas +++ b/components/lazmapviewer/source/mvengine.pas @@ -168,6 +168,9 @@ function CalcGeoDistance(Lat1, Lon1, Lat2, Lon2: double; function GPSToDMS(Angle: Double): string; +function LatToStr(ALatitude: Double; DMS: Boolean): String; +function LonToStr(ALongitude: Double; DMS: Boolean): String; + procedure SplitGps(AValue: Double; out ADegs, AMins, ASecs: Double); @@ -1123,6 +1126,31 @@ begin Result := Format('%.0f° %.0f'' %.1f"', [deg, min, sec]); end; +function LatToStr(ALatitude: Double; DMS: Boolean): String; +begin + if DMS then + Result := GPSToDMS(abs(ALatitude)) + else + Result := Format('%.6f°',[abs(ALatitude)]); + if ALatitude > 0 then + Result := Result + ' N' + else + if ALatitude < 0 then + Result := Result + 'E'; +end; + +function LonToStr(ALongitude: Double; DMS: Boolean): String; +begin + if DMS then + Result := GPSToDMS(abs(ALongitude)) + else + Result := Format('%.6f°', [abs(ALongitude)]); + if ALongitude > 0 then + Result := Result + ' E' + else if ALongitude < 0 then + Result := Result + ' W'; +end; + { Returns the direct distance (air-line) between two geo coordinates If latitude NOT between -90°..+90° and longitude NOT between -180°..+180° the function returns -1.