Opengeodb Beispiele

Naja MySQL muss bei einer Umkreissuche für jeden einzelnen Datensatz die Entfernung berechnen und kann dabei nicht auf Indizies zurückgreifen. Das macht das ganze schon recht langsam.
Bauchschmerzen deshalb, da ich selbst schon mal eine Umkreissuche realisieren durfte. Ich empfehle für diesen Zweck den Apache Solr, dort ist die Umkreissuche ab Version 3.1 nativ enthalten und ab Version 4 gibt er auch die Entfernung zurück. Leider braucht er einen Java-Servlet-Container und somit ist seine Verwendung doch recht eingeschränkt.

Gruß Kyôya Stefan
 
Zuletzt bearbeitet:
@Beide:
Stimmt, nur MySQL Trion.-und Wuzel- und alle Berechnungen zu überlassen
ist langsam.
Aber man muss ja nicht alles SQL-mäßig machen.
Hab verschiedene Kombinationsstufen mit PHP ausprobiert
und auf akzeptable Ergebisse gekommen.

Nessus, was brauchst du denn genau?
Entfernung oder Umkreissuche?
 
Also Umkreissuche.

Natürlich nur Beispiel,
Im Realen noch SQL-Injections etc. verhindern usw.
(Falls die Daten aus HTML-Forms kommen)...

PHP:
<?php
$username='db-user'; //Anpassen
$password='db-pw'; //Anpassen
$database='db-con'; //Anpassen

//Beispiel fuer den Ausgangsort
//Woher die Daten kommen ist natuerlich egal (Form, GET/POST etc.)
$startortname='Klagenfurt';
$startortplz='9020'; //Klagenfurt hat mehrere PLZs, deshalb festgelegt
$startortstaat='AT'; //DE, AT, CH

//Orte in ... km Umkreis (Luftlinie) finden
$radius = 40;



//Beispiel zum DB-Verbindung herstellen und Ausgeben zutreffenden aller Orte



mysql_connect(localhost,$username,$password) or die('CON!');
mysql_select_db($database) or die('SELDB!');

//Startort-Position ermitteln
$query='select lat,lon from orte where plz='.$startortplz.' and staat='.$startortstaat.' and name='.$startortname;
$res=mysql_query($query);

//TODO: Eventuell noch ueberpruefen, ob die Query ueberhaupt ein Ergebnis hat

$row=mysql_fetch_array($res);
$lat = $row[0];
$lon = $row[1];


$query='select staat,plz,name,lat,lon from orte where ('.$radius.'/111.3)>=abs(lat-'.$lat.') order by 1,2,3';
$res=mysql_query($query);

while($row=mysql_fetch_array($res))
{
  $x = sqrt
  (
   (111.3*cos(($lat+$row[3])/2*0.01745)*($lon-$row[4]))*
   (111.3*cos(($lat+$row[3])/2*0.01745)*($lon-$row[4]))
   +
   (111.3*($lat-$row[3]))*
   (111.3*($lat-$row[3]))
  );

  if($radius>= $x)
  {
    //Das mit allen zutreffenden Orten machen
    //Hier einfache Ausgabe von Staat, PLZ, Ortsname, und Entfernung in km
    echo $row[0].' '.$row[1].' '.$row[2].', '.((int)$x).'km<br>';
  }
}

mysql_close();
?>
 
Och...jetzt hab ich die Umkreissuche so schön da... :D

"Suche" bei Entfernungen ist nur etwas verwirrend.
Also du brauchst die Entfernung zwischen zwei Orten, fertig?
 
Als fauler Programmierer, der ich ja bin,
änder ich die Umkreissuche einfach etwas ab :D

PHP:
<?php
$username='db-user'; //Anpassen
$password='db-pw'; //Anpassen
$database='db-con'; //Anpassen

//Ort 1
//Woher die Daten kommen ist natuerlich egal (Form, GET/POST etc.)
$startortname='Klagenfurt';
$startortplz='9020'; //Klagenfurt hat mehrere PLZs, deshalb festgelegt
$startortstaat='AT'; //DE, AT, CH

//Ort 2
$zielortname='Wien';
$zielortplz='1010';
$zielortstaat='AT';


//Beispiel zum DB-Verbindung herstellen und Ausgebe der Entfernung



mysql_connect(localhost,$username,$password) or die('CON!');
mysql_select_db($database) or die('SELDB!');

//Startort-Position ermitteln
$resstart=mysql_query('select lat,lon from orte where plz='.$startortplz.' and staat='.$startortstaat.' and name='.$startortname);
$resziel=mysql_query('select lat,lon from orte where plz='.$zielortplz.' and staat='.$zielortstaat.' and name='.$zielortname);

//TODO: Eventuell noch ueberpruefen, ob die Querys ueberhaupt ein Ergebnis haben

$rowstart=mysql_fetch_array($resstart);
$rowziel=mysql_fetch_array($resziel);

$entfern = sqrt
  (
   (111.3*cos(($rowstart[0]+$rowziel[0])/2*0.01745)*($rowstart[1]-$rowziel[1]))*
   (111.3*cos(($rowstart[0]+$rowziel[0])/2*0.01745)*($rowstart[1]-$rowziel[1]))
   +
   (111.3*($rowstart[0]-$rowziel[0]))*
   (111.3*($rowstart[0]-$rowziel[0]))
  );
 
echo ((int)$entfern).'km<br>';

mysql_close();
?>

Ungetestet.
 
Zurück