|
bituniverse.com Entwickler Forum
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
tomate
Anmeldedatum: 11.02.2009 Beiträge: 1
|
Verfasst am: Mi 11 Feb, 2009 13:02 Titel: Abstand zwischen zwei PLZ ermitteln... |
|
|
Hallo zusammen,
über die Suchmaschine bin ich auf diese Seite gekommen:
www.bituniverse.com
Gibt es dazu ein Tutorial oder weitere Informationen
zum Einlesen, wie man solche eine PLZ-Umkreissuche
realisiert?
Viele Grüße!
Detlef
|
|
| Nach oben |
|
 |
Simon W. Anti-verdenglischungs-Abgeordneter
Anmeldedatum: 05.11.2007 Beiträge: 283 Wohnort: Aachen
|
Verfasst am: Mi 11 Feb, 2009 13:29 Titel: |
|
|
Man benötigt eigentlich nur eine Liste mit Postleitzahlen und deren Koordinaten.
|
|
| Nach oben |
|
 |
Mannes
Anmeldedatum: 05.11.2007 Beiträge: 24 Wohnort: Gießen
|
Verfasst am: Do 12 Feb, 2009 20:13 Titel: |
|
|
Mit den Daten von geodb (findest bei google) kannst du es mal mit folgendem Beispiel probieren...
| Php: |
<?php
$plz = "52070";
$km = 50;
echo "<h2>PLZ/Orte im Umkreis von $km km von $plz</h2>";
// Detailinfos zum gew?ten Ort
$qry = "SELECT distinct(zip_code_b.loc_id), zip_code_b.text_val AS zip_code_b, coord_a.lon * PI( ) /180 AS lon_a,
coord_a.lat * PI( ) /180 AS lat_a,
coord_b.lon * PI( ) /180 AS lon_b,
coord_b.lat * PI( ) /180 AS lat_b ,
acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) +
cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) *
cos( coord_b.lon * PI( ) /180 - coord_a.lon * PI( ) /180 ) )*
6380 as Entfernung
FROM geodb_textdata AS zip_code_a
JOIN geodb_coordinates coord_a ON coord_a.loc_id = zip_code_a.loc_id
JOIN geodb_textdata AS zip_code_b ON zip_code_b.text_type =500300000
JOIN geodb_coordinates coord_b ON coord_b.loc_id = zip_code_b.loc_id
WHERE zip_code_a.text_type =500300000
AND zip_code_a.text_val = '$plz'
AND zip_code_b.text_val>9999
AND acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) +
cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) *
cos( coord_b.lon * PI( ) /180 - coord_a.lon * PI( ) /180 ) ) *
6380 < $km";
$r = $mydb->unbuffered_query($qry);
while ($info=$mydb->fetch_array($r)) {
#print_r($info);
$zips[]=$info[zip_code_b];
echo $info[zip_code_b ]. " -> ";
$qry = "SELECT text_val FROM geodb_textdata WHERE loc_id=$info[loc_id] AND text_type=500100000 LIMIT 0,1;";
$s = $mydb->unbuffered_query($qry);
while ($i=$mydb->fetch_array($s)) {
echo $i[text_val ]. " -> ";
#echo "<br>";
}
}
?>
|
Die mysql-Aufrufe musste natürlich umschreiben, weil die Teil der von mir verwendeten Klasse sind. Aber ih denke das bekommste hin 
Den sql selber hab ich selber mal über google gefunden vor ein paar Jahren.
|
|
| Nach oben |
|
 |
Slava Administrator
Anmeldedatum: 16.01.2007 Beiträge: 282 Wohnort: Köln
|
Verfasst am: Sa 28 Feb, 2009 12:03 Titel: |
|
|
| Php: |
<?php
//berechnet abstand zwischen 2 punkten
function abstand($lang1,$breit1,$lang2,$breit2){
return acos(sin($breit2*M_PI/ 180)* sin($breit1*M_PI/ 180)+ cos($breit2*M_PI/ 180)* cos($breit1*M_PI/ 180)* cos(($lang2 - $lang1)*M_PI/ 180)) * 6378;
}
//bereitet ein array mit sql vor
//ich suche nicht in radius, sondern erst in einem quadrat, um
//die indexierte spalten in tabelle zu nutzen.
function kmsuche($lenge,$breit,$kmrad){
$breitegrad_prokm=1/abstand($lenge,$breit,$lenge,$breit+1);
$lengegrad_prokm=1/abstand($lenge,$breit,$lenge-1,$breit);
$quadrat['lang1']=$lenge-($lengegrad_prokm *$kmrad);
$quadrat['lang2']=$lenge+($lengegrad_prokm *$kmrad);
$quadrat['breit1']=$breit-($breitegrad_prokm *$kmrad);
$quadrat['breit2']=$breit+($breitegrad_prokm *$kmrad);
$quadrat['where']="lang between ".$quadrat['lang1']." and ".$quadrat['lang2']." and breit between ".$quadrat['breit1']." and ".$quadrat['breit2'];
return $quadrat;
}
...........
//und so geben wir alle staedte und abstände aus
$bituniverse = mysql_pconnect($hostname_bituniverse, $username_bituniverse, $password_bituniverse)
//lang,breit,ort von einerm bestimmten postleitzahl abholen
$std1= mysql_query("select lang,breit,ort from ort_plz where plz='{$_POST['plz']}' ");
//zusatzt fuer die performante neue sql bilden (lang und breit müssen natürlich
//in tabelle indexiert sein.
$zusatz=kmsuche($std1erg1['lang'],$std1erg1['breit'],$_POST['radius']);
erst mal stat radius, quadrat mit allen ergebnissen holen.
$orte= mysql_query("select ort, plz, lang, breit from ort_plz where ". $zusatz['where']. " order by ort,plz ");
//ausgabe
echo "Suchergebnis für {$_POST['plz']} ". $std1erg1['ort']. " in Radius von ". $_POST['radius']. " km<br>";
$ortin="";
echo " <table border='1'><tr><th>Ort</th><th>PLZ</th><th>Länge</th><th>Breite</th><th>Abstand</th></tr>";
//echter abstand mit php testen.
$abstand_aus=abstand($std1erg1['lang'],$std1erg1['breit'],$erg['lang'],$erg['breit']);
//da ich nicht in radius, sondern in quadrat gesucht habe
//muessen die ecken abgeschniten werden, daher noch mal nausselectieren
if($abstand_aus<=$_POST['radius']){
echo "<tr><td>". ($erg['ort']== $ortin? '-': $erg['ort']). "</td><td>". $erg['plz']. "</td><td>". $erg['lang']. "</td><td>". $erg['breit']. "</td><td>km ". round($abstand_aus, 1). "</td></tr>";
$ortin=$erg['ort'];
}
}
?>
|
|
|
| Nach oben |
|
 |
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB2.de
|