bituniverse.com Foren-Übersicht bituniverse.com
Entwickler Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Abstand zwischen zwei PLZ ermitteln...

 
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> PHP allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
tomate



Anmeldedatum: 11.02.2009
Beiträge: 1

BeitragVerfasst am: Mi 11 Feb, 2009 13:02    Titel: Abstand zwischen zwei PLZ ermitteln... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 283
Wohnort: Aachen

BeitragVerfasst am: Mi 11 Feb, 2009 13:29    Titel: Antworten mit Zitat

Man benötigt eigentlich nur eine Liste mit Postleitzahlen und deren Koordinaten.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mannes



Anmeldedatum: 05.11.2007
Beiträge: 24
Wohnort: Gießen

BeitragVerfasst am: Do 12 Feb, 2009 20:13    Titel: Antworten mit Zitat

Mit den Daten von geodb (findest bei google) kannst du es mal mit folgendem Beispiel probieren...

Php:
  1. <?php
  2.  
  3. $plz = "52070";
  4. $km = 50;
  5.  
  6. echo "<h2>PLZ/Orte im Umkreis von $km km von $plz</h2>";
  7.  
  8. // Detailinfos zum gew?ten Ort
  9.  
  10. $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,
  11. coord_a.lat * PI( ) /180 AS lat_a,
  12. coord_b.lon * PI( ) /180 AS lon_b,
  13. coord_b.lat * PI( ) /180 AS lat_b ,
  14. acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) +
  15. cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) *
  16. cos( coord_b.lon * PI( ) /180 - coord_a.lon * PI( ) /180 ) )*
  17. 6380 as Entfernung
  18. FROM geodb_textdata AS zip_code_a  
  19. JOIN geodb_coordinates coord_a ON coord_a.loc_id = zip_code_a.loc_id
  20. JOIN geodb_textdata AS zip_code_b ON zip_code_b.text_type =500300000  
  21. JOIN geodb_coordinates coord_b ON coord_b.loc_id = zip_code_b.loc_id  
  22. WHERE zip_code_a.text_type =500300000  
  23. AND zip_code_a.text_val = '$plz'
  24. AND zip_code_b.text_val>9999
  25. AND acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) +
  26. cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) *
  27. cos( coord_b.lon * PI( ) /180 - coord_a.lon * PI( ) /180 ) ) *
  28. 6380 < $km";
  29. $r = $mydb->unbuffered_query($qry);
  30. $zips=array();
  31. while ($info=$mydb->fetch_array($r)) {
  32.   #print_r($info);
  33.   $zips[]=$info[zip_code_b];
  34.   echo $info[zip_code_b]." -> ";
  35.   $qry = "SELECT text_val FROM geodb_textdata WHERE loc_id=$info[loc_id] AND text_type=500100000 LIMIT 0,1;"
  36.   $s = $mydb->unbuffered_query($qry);
  37.   while ($i=$mydb->fetch_array($s)) {
  38.     echo $i[text_val]." -> ";
  39.     echo $info[Entfernung];
  40.     #echo "<br>";
  41.   }
  42.   echo "<br>";
  43. }
  44.  
  45. ?>

Die mysql-Aufrufe musste natürlich umschreiben, weil die Teil der von mir verwendeten Klasse sind. Aber ih denke das bekommste hin Wink

Den sql selber hab ich selber mal über google gefunden vor ein paar Jahren.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Slava
Administrator


Anmeldedatum: 16.01.2007
Beiträge: 282
Wohnort: Köln

BeitragVerfasst am: Sa 28 Feb, 2009 12:03    Titel: Antworten mit Zitat

Php:
  1. <?php
  2.  
  3. //berechnet abstand zwischen 2 punkten
  4. function abstand($lang1,$breit1,$lang2,$breit2){
  5. 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;
  6. }
  7.  
  8. //bereitet ein array mit sql vor
  9. //ich suche nicht in radius, sondern erst in einem quadrat, um
  10. //die indexierte spalten in tabelle zu nutzen.
  11. function kmsuche($lenge,$breit,$kmrad){
  12.  
  13.     $breitegrad_prokm=1/abstand($lenge,$breit,$lenge,$breit+1);
  14.     $lengegrad_prokm=1/abstand($lenge,$breit,$lenge-1,$breit);
  15.     $quadrat['lang1']=$lenge-($lengegrad_prokm *$kmrad);
  16.     $quadrat['lang2']=$lenge+($lengegrad_prokm *$kmrad);
  17.     $quadrat['breit1']=$breit-($breitegrad_prokm *$kmrad);
  18.     $quadrat['breit2']=$breit+($breitegrad_prokm *$kmrad);
  19.     $quadrat['where']="lang between ".$quadrat['lang1']." and ".$quadrat['lang2']." and breit between ".$quadrat['breit1']." and ".$quadrat['breit2'];
  20.     return  $quadrat;
  21. }
  22. ...........
  23. //und so geben wir alle staedte und abstände aus
  24. $bituniverse = mysql_pconnect($hostname_bituniverse, $username_bituniverse, $password_bituniverse)
  25.                                                    or die(mysql_error());
  26. mysql_select_db($database_bituniverse, $bituniverse);
  27. //lang,breit,ort von einerm bestimmten postleitzahl abholen
  28. $std1=mysql_query("select lang,breit,ort from ort_plz where plz='{$_POST['plz']}' ");
  29. $std1erg1=mysql_fetch_array($std1);
  30. //zusatzt fuer die performante neue sql bilden (lang und breit müssen natürlich
  31. //in tabelle indexiert sein.
  32. $zusatz=kmsuche($std1erg1['lang'],$std1erg1['breit'],$_POST['radius']);
  33. erst mal stat radius, quadrat mit allen ergebnissen holen.
  34. $orte=mysql_query("select ort, plz, lang, breit from ort_plz where ".$zusatz['where']." order by ort,plz ");
  35.  
  36. //ausgabe
  37. echo "Suchergebnis für {$_POST['plz']} ".$std1erg1['ort']." in Radius von ".$_POST['radius']." km<br>";
  38. $ortin="";
  39.  
  40. echo " <table border='1'><tr><th>Ort</th><th>PLZ</th><th>Länge</th><th>Breite</th><th>Abstand</th></tr>";
  41. while($erg=mysql_fetch_array($orte)){
  42.  
  43. //echter abstand mit php testen.
  44. $abstand_aus=abstand($std1erg1['lang'],$std1erg1['breit'],$erg['lang'],$erg['breit']);
  45. //da ich nicht in radius, sondern in quadrat gesucht habe
  46. //muessen die ecken abgeschniten werden, daher noch mal nausselectieren
  47. if($abstand_aus<=$_POST['radius']){
  48. 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>";
  49. $ortin=$erg['ort'];
  50. }
  51. }
  52. echo "</table>";
  53.  
  54. ?>

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> PHP allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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
Powered by WebRing.