Linuchs: mySQL: Nachbarorte finden

Beitrag lesen

Moin,

der Berechnung von Entfernungen liegt eine - für mich - komplizierte Formel zugrunde.

Bisher habe ich in einem ersten SELECT die geo_breite und geo_laenge des zentralen Ortes aus der DB geholt und mit PHP umgesetzt:

$rad_lat1    = deg2rad( $row_zentrum['geo_breite'] );
$rad_lon1    = deg2rad( $row_zentrum['geo_laenge'] );

Die 10 Nachbarorte dann mit einem zweiten SELECT geholt:

SELECT
...
,ROUND( 6366.19773095 * ACOS( SIN(".$rad_lat1.") *SIN(RADIANS(ort1.geo_breite)) +COS(".$rad_lat1.") *COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_laenge) -".$rad_lon1." ))) dist_km
...
GROUP BY  ...
ORDER BY dist_km
LIMIT 0,10

Nun brauche ich für Ajax-Vorschlagswerte ein schnelleres Verfahren. Da mySQL auch RADIANS() kennt, möchte ich das künftig mit nur einem SELECT erledigen.

Der zentrale Ort ist im SQL ort1, die gesuchten Nachbarn sind ort2. Nun müsste die Formel in etwa so aussehen:

,ROUND( 6366.19773095 * ACOS( SIN(RADIANS(ort1.geo_breite)) *SIN(RADIANS(ort1.geo_breite)) +COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_laenge) -RADIANS(ort1.geo_laenge) ))) dist_km

Ich werde das Gefühl nicht los, dass das Konstrukt ACOS( SIN(RADIANS(ort1.geo_breite)) doppelt oder dreifach gemoppelt ist.

Ich habe für ort1 geo_laenge und geo_breite, möchte die Orte ort2 im Umkreis von 20 km finden, die auch geo_laenge und geo_breite haben. Geht das nicht einfacher?

Linuchs