[gelöst] SELECT Statement mit Berechnung?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 659
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

[gelöst] SELECT Statement mit Berechnung?

Beitrag von fliegermichl »

Hallo zusammen,

ich habe eine Datenbank in der alle Orte von Deutschland mit PLZ und den geographischen Koordinaten enthalten sind.
Jetzt bräuchte ich eine Funktion um alle Orte in einem bestimmten Umkreis zu einem anzugebenden Ort zu ermitteln.

Eine Möglichkeit wäre, eine Tabelle mit den Entfernungen eines jeden Ortes zu jedem anderen anzulegen.

Gibt es eine elegante Möglichkeit, diese Entfernungsberechnung in einem SELECT Statement unterzubringen?

LG Michael
Zuletzt geändert von fliegermichl am So 14. Jun 2020, 13:07, insgesamt 1-mal geändert.

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: SELECT Statement mit Berechnung?

Beitrag von MacWomble »

Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

sstvmaster
Beiträge: 354
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: SELECT Statement mit Berechnung?

Beitrag von sstvmaster »

Hi,

Distanz zwischen 2 Geopunkten kannst du so berechnen:

Code: Alles auswählen

...
const
  EARTH_RADIUS = 6378137;
...
type
  TDistanceUnits = (duMeters, duKilometers, duMiles);
...

{ 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.
 Usage: CalcGeoDistance(51.53323, -2.90130, 51.29442, -2.27275, duKilometers);
}
function CalcGeoDistance(Lat1, Lon1, Lat2, Lon2: double;
  AUnits: TDistanceUnits = duKilometers): double;
const
  EPS = 1E-12;
var
  d_radians: double; // distance in radians
  lat1r, lon1r, lat2r, lon2r: double;
  arg: Double;
begin
  // Validate
  if (Lat1 < -90.0) or (Lat1 > 90.0) then exit(NaN);
//  if (Lon1 < -180.0) or (Lon1 > 180.0) then exit(NaN);
  if (Lat2 < -90.0) or (Lat2 > 90.0) then exit(NaN);
//  if (Lon2 < -180.0) or (Lon2 > 180.0) then exit(NaN);

  // Turn lat and lon into radian measures
  lat1r := (PI / 180.0) * Lat1;
  lon1r := (PI / 180.0) * Lon1;
  lat2r := (PI / 180.0) * Lat2;
  lon2r := (PI / 180.0) * Lon2;

  // calc
  arg := sin(lat1r) * sin(lat2r) + cos(lat1r) * cos(lat2r) * cos(lon1r - lon2r);
  if (arg < -1) or (arg > +1) then
    exit(NaN);
  if SameValue(abs(Lon1-Lon2), 360, EPS) and SameValue(abs(arg), 1.0, EPS) then
    d_radians := PI * 2.0
  else
    d_radians := arccos(arg);
  Result := EARTH_RADIUS * d_radians;

  case AUnits of
    duMeters: ;
    duKilometers: Result := Result * 1E-3;
    duMiles: Result := Result * 0.62137E-3;
  end;
end;
Das ist aus der "mvEngine.pas" von LazMapViewer
LG Maik

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 659
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: SELECT Statement mit Berechnung?

Beitrag von fliegermichl »

MacWomble hat geschrieben:
So 14. Jun 2020, 11:31
Evtl. hilft das weiter:

http://webpiraten.de/index.php/php/umkr ... longitude/
Super! Genau das hatte ich gesucht.
Danke!

Antworten