Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Entfernung mittels einer Stored Procedure (https://www.delphipraxis.net/188255-entfernung-mittels-einer-stored-procedure.html)

Dumpfbacke 13. Feb 2016 14:21

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

Entfernung mittels einer Stored Procedure
 
Hallo Leute,
ich hab ein Problem bei dem ich nicht weiß wie ich es lösen kann. Ich habe eine Datenbank mit Koordinaten zu Standorten. Die Daten sind als Standort, Rechtswert und Hochwert hinterlegt. Nun möchte ich ein Standort übergeben und dann alle Standorte zurückhaben welche im Umkreis von z.B. 5 Km (Luftline) liegen. Die Berehnung ist einfach da man ja aus den Koordinaten ein rechtwinkliges Dreieck bilden kann und so die Entfernung berechnen kann.
Kann ich so etwas irgendwie in einer Stored Procedure für Firebird lösen ?

Tanja

mkinzler 13. Feb 2016 14:43

AW: Entfernung mittesl einer Stored Procedure
 
http://www.synaptica.info/2016/01/22...-wgs84-points/

Dumpfbacke 15. Feb 2016 05:29

AW: Entfernung mittesl einer Stored Procedure
 
Zitat:

Zitat von mkinzler (Beitrag 1330266)

Danke für den Link das bringt mich schon mal ein wenig weiter. Mein Problem ist nur wie kann ich die Datensätze auswählen welche in der gewünschten Entfernung liegen ? Ein größer oder kleiner Rechtswert / Hochwert geht ja nicht.

Tanja

Lemmy 15. Feb 2016 05:44

AW: Entfernung mittels einer Stored Procedure
 
Guten Morgen,

das kommt darauf an....

Wenn es eine überschaubare Menge an Standorten sind, dann würde ich die bei Bedarf holen und im Client bearbeiten. Wenn es zu viele sind oder die sich oft ändern, dann würde ich in einer StoredProcedure erst mal alle die Standorte selektieren, bei denen die Differenz beim Rechts- und Hochwert kleiner oder gleich der Umkreissuche ist. Für diese Punkte kannst Du dann wiederum genau berechnen ob dieser wirklich im Suchradius liegt.

Was ich jetzt nicht verstehe: Du sprichst explizit von Rechts- und Hochwert, die so im GK- oder UMTS-Systemen Verwendung finden, der Link von MKinzler zeigt die Berechnung mit geografischen Koordinaten - das ist ein "winzig" kleiner Unterschied....

Dumpfbacke 15. Feb 2016 05:54

AW: Entfernung mittels einer Stored Procedure
 
Das es dort ein Unterschied gibt ist mir bewusst. Mir war bis jetzt noch nicht bewusst das ich ein einer Stored Procedure auch mit Variablen rechnen kann.

Zitat:

Zitat von Lemmy (Beitrag 1330351)
Guten Morgen,

dann würde ich in einer StoredProcedure erst mal alle die Standorte selektieren, bei denen die Differenz beim Rechts- und Hochwert kleiner oder gleich der Umkreissuche ist. Für diese Punkte kannst Du dann wiederum genau berechnen ob dieser wirklich im Suchradius liegt.

Wie kann ich das denn machen ? Die beiden werte sind doch von einander abhängig. Wenn der Rechtswert kleiner ist kann der HOchwert größer sein und es liegt doch noch im Radius.

Lemmy 15. Feb 2016 06:23

AW: Entfernung mittels einer Stored Procedure
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1330352)
Wie kann ich das denn machen ? Die beiden werte sind doch von einander abhängig. Wenn der Rechtswert kleiner ist kann der HOchwert größer sein und es liegt doch noch im Radius.

???? Bitte nochmal nachdenken...

Du suchst im Umkreis vom 5 km. Somit suchst Du alle Punkte, die einen maximale (absolute!) Differenz von 5 km von deinem Standort haben. Somit ergeben sich folgende Fälle:

dR=5, dH=0 -> ergibt 5 km Entfernung
dR=5, dH=5 -> ergibt 5 km Entfernung
dR=5, dH=4 -> ergibt 6,4 km
dR=6, dh=0 -> ergibt 6 km (weniger als 0 geht halt nun mal nicht - um negative Differenzen brauchen wir uns nicht gesondert zu kümmern)
....

Du schneidest aus deiner Punktwolke also ein Quadrat um deinen Suchstandort aus mit einer Seitenlänge 5km [edit] ist natürlich falsch, das Quadrat hat 10km Seitenlänge[/edit], das den Suchkreis einschließt. Du führst hier also erst eine Grobselektion, dann eine Feinselektion aus.

Nachtrag: Wobei sich die Ausführung immer auf ein kartesisches Koordinatensystem - in einem geografischen System ist das vermutlich etwas komplexer, so weit reicht meine Denkmaschine heute morgen aber noch nicht....

Neutral General 15. Feb 2016 07:09

AW: Entfernung mittels einer Stored Procedure
 
Hallo,

Ist doch ganz einfach:
Code:
SELECT
  *
FROM standort
LEFT JOIN sp_get_entfernung(standort.lon, standort.lat, :mittelpunkt_lon, :mittelpunkt_lat)
WHERE sp_get_entfernung.entfernung <= 5000
Das ist natürlich Pseudocode aber sollte wenn man Felder/Tabellennamen anpasst so passen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz