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
[gelöst] SELECT Statement mit Berechnung?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1646
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
[gelöst] SELECT Statement mit Berechnung?
Zuletzt geändert von fliegermichl am So 14. Jun 2020, 13:07, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: SELECT Statement mit Berechnung?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: SELECT Statement mit Berechnung?
Hi,
Distanz zwischen 2 Geopunkten kannst du so berechnen:
Das ist aus der "mvEngine.pas" von LazMapViewer
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;
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1646
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: SELECT Statement mit Berechnung?
Super! Genau das hatte ich gesucht.MacWomble hat geschrieben: So 14. Jun 2020, 11:31 Evtl. hilft das weiter:
http://webpiraten.de/index.php/php/umkr ... longitude/
Danke!