Harry B.: opengeodb

Beitrag lesen

Holladiewaldfee,

prinzipiell ist's gar nicht schwer:

Zunächst liest Du aus der Datenbank die Längen- und Breitenangaben für den Ort, um den gesucht werden soll aus. Nehmen wir dann mal an, der ganze Krempel stünde in einem Array $aOrt.

define('EARTHRADIUS', 6372);
$iDistance = 20; # 20km Umkreis

Dann kannst Du folgende Query auf die GeoDB loslassen:

'SELECT geodb_locations.name,
IFNULL((ACOS((SIN(RADIANS('.$aOrt['breite'].'))*SIN(RADIANS(geodb_locations.breite)))

  • (COS(RADIANS('.$aOrt['breite'].'))*COS(RADIANS(geodb_locations.breite)) * COS(RADIANS(geodb_locations.laenge)-RADIANS('.$aOrt['laenge'].'))))* '.EARTHRADIUS.') ,0) AS distance
    FROM geodb_locations
    WHERE
    IFNULL((ACOS((SIN(RADIANS('.$aOrt['breite'].'))*SIN(RADIANS(geodb_locations.breite)))
  • (COS(RADIANS('.$aOrt['breite'].'))*COS(RADIANS(geodb_locations.breite)) * COS(RADIANS(geodb_locations.laenge)-RADIANS('.$aOrt['laenge'].')))) * '.EARTHRADIUS.') ,0) < '.$iDistance.'
    ORDER BY geodb_locations.name ASC';

Ich hoffen daß es die Query tut, das ist eine verkürzte Version aus einem Script von mir. Freilich mußt Du die Query noch erweitern und die so gefundenen Datensätze vergleichen mit einer weiteren Tabelle, in der die PLZs der Beratungsstellen stehen.

Also beispielsweise:

'SELECT geodb_locations.name, tolle_plz_tabelle.irgendwaswichtiges,
IFNULL((ACOS((SIN(RADIANS('.$aOrt['breite'].'))*SIN(RADIANS(geodb_locations.breite)))

  • (COS(RADIANS('.$aOrt['breite'].'))*COS(RADIANS(geodb_locations.breite)) * COS(RADIANS(geodb_locations.laenge)-RADIANS('.$aOrt['laenge'].'))))* '.EARTHRADIUS.') ,0) AS distance
    FROM geodb_locations, tolle_plz_tabelle
    WHERE
    IFNULL((ACOS((SIN(RADIANS('.$aOrt['breite'].'))*SIN(RADIANS(geodb_locations.breite)))
  • (COS(RADIANS('.$aOrt['breite'].'))*COS(RADIANS(geodb_locations.breite)) * COS(RADIANS(geodb_locations.laenge)-RADIANS('.$aOrt['laenge'].')))) * '.EARTHRADIUS.') ,0) < '.$iDistance.'
    AND INSTR(geodb_locations.plz, tolle_plz_tabelle.plz)
    ORDER BY geodb_locations.name ASC';

Bitte beachte, daß Du aufgrund des Formats der GeoDB die Postleitzahlen mit INSTR vergleichen mußt.

Ciao,

Harry
 (zefix, kaum ist man mal ein halbes Jahr weg schon funktioniert alles irgendwie anders ... "um unter diesem Namen posten zu können müssen sie sich authentifizieren" ... ja hab ich doch, sackzement)

--
  Irgendwann kommt die Waldfee - oder auch nicht ... (Projektphase: Keine Ahnung)
  Bis dahin:
  Ski- und Bergtouren in den Tölzer Voralpen und im Karwendel