Hallo,
ich habe mit der OpenGeoDB eine Umkreissuche realisiert.
Die Umkreissuche funktioniert auch einwandfrei.ohne jetzt im Einzelnen auf deinen Code einzugehen: Wie groß ist "Umkreis" in deinem Fall typischerweise? Ein paar Kilometer? Hundert Kilometer? Wenn die Entfernungen in der Größenordnung liegen, und der Bezugspunkt nicht gerade in der Polarregion liegt, würde ich die Trigonometrie links liegenlassen und die geographischen Koordinaten einfach wie kartesische Koordinaten betrachten. Okay, mit zunehmender geographischer breite wird der Umkreis dann zur Ellipse, aber auch das kann man kompensieren, indem man die x-Koordinate (geographische Länge) mit B=cos(b) skaliert, wobei b die geographische Breite des Bezugspunkts ist, und somit für einen gegebenen Bezugspunkt konstant.
Die Höhe (z-Koordinate) würde ich aus der betrachtung komplett rauslassen.Leider schaffe ich es nicht die Ergebnisse nach der Entfernung zu sortieren.
Wie schon erwähnt, nehme ich mal die polaren Koordinaten und tue so, als wären es kartesische. Seien (l0, b0) die Koordinaten des Bezugspunktes, dann sagt der alte Pythagoras, dass für die Entfernung d zu (lx, bx) gilt:
d² = (lx-l0)² + (bx-b0)²
Betrachtet man jetzt noch die mit der Breite zunehmende Verzerrung der Länge, wie ich oben schon angedeutet habe, dann ergibt sich für die Entfernung:
d² = (cos(b0)*(lx-l0))² + (bx-b0)²
Diesen Term müsstest du als Kriterium für eine ORDER-BY-Klausel in dein SQL-Statement ergänzen, dann sortiert das DBMS die Punkte nach Entfernung. Das Wurzelziehen kann man sich sparen, denn wenn man das Quadrat der Entfernung auf- oder absteigend sortiert, ist damit auch die Entfernung selbst entsprechend sortiert.
So long,
Martin
Hallo Martin,
vielen Dank für deinen ausführlichen Beitrag.
die Sortierung soll je nach ausgewähltem Radius innerhalb von 10, 15 und 30km erfolgen. Alle Ergebnisse liegen vorerst in Deutschland.
Leider fehlen mir die Kenntnisse um deinen Lösungsweg vollständig zu verstehen und in PHP zu realisieren.
Ich werde nach dem ich aktuell JavaScript lerne auf jeden Fall einen PHP Crashkurs machen und mir dann deinen Beitrag nochmals anschauen.
Den Code was mir die sortierten Ergebnisse liefern sollen habe ich ja schon bereits:
<?php
$sql = 'SELECT ' . $Spalten . ',
' . (2 * $this->Erdradius) . ' *
ASIN(
SQRT(
POWER(' . $UrsprungX .' - KoordX, 2)
+ POWER(' . $UrsprungY .' - KoordY, 2)
+ POWER(' . $UrsprungZ .' - KoordZ, 2)
) / ' . (2 * $this->Erdradius) . ' ) AS Entfernung
FROM `' . $this->table . '`
WHERE
POWER(' . $UrsprungX .' - KoordX, 2)
+ POWER(' . $UrsprungY .' - KoordY, 2)
+ POWER(' . $UrsprungZ .' - KoordZ, 2)
<= "' . pow(2 * $this->Erdradius * sin($Radius / (2 * $this->Erdradius)), 2) . '"';
?>
Das Problem ist, dass es bei mir nicht funktionieren will..
Meinst du, dass es am Code liegt?
Liebe Grüße
Fabx