mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 25.04.2024 07:19 Benutzername: Passwort: Auto-Login

Thema: Postleitzahl Suche vom 13.11.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Postleitzahl Suche
Seite: Zurück  1, 2, 3, 4, 5, 6
Autor Nachricht
pixelpapst303

Dabei seit: 06.07.2006
Ort: hamburg
Alter: 50
Geschlecht: Männlich
Verfasst Do 15.11.2007 16:52
Titel

Antworten mit Zitat Zum Seitenanfang

choise hat geschrieben:

was is unterschied zwischen natsort sort und asort ? ^^


kurz und knapp:
sort: wandelt beim sortieren der werte ein assoziatives in ein numerisches array
asort: macht das nicht *zwinker*
natsort: sortiert "menschlicher". normalerweise käme hans10 bei sort und asort noch vor hans2. natsort ließe hans10 spädda kommen... Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
choise
Threadersteller

Dabei seit: 01.02.2007
Ort: Würzburg
Alter: 35
Geschlecht: Männlich
Verfasst So 18.11.2007 17:50
Titel

Antworten mit Zitat Zum Seitenanfang

So Leute,...auf Grund von n paar PM's
schreib ich euch mal die Ergebnisse zusammen.

Es ging ja darum, eine Umkreissuche anhand von Postleitzahlen zu erstellen.
Meine Ausgangspostleitzahl ist 97450.
Leider kann ich jetzt nicht einfach alle im Bereich von 9 suchen und hoffen,
alle in der Nähe zu erwischen, da in Deutschland oftmals auch 20km entfernt
eine völlig andere PLZ gibt.

Gelöst hab ich es so.
Ich hab mir eine MySQL Datenbank angelegt, die alle Längen Und Breitengrad Angaben
einer Postleitzahl enthalten. Diese werde ich euch noch hochladen.

Also,.. ich hab ein meinem Suchformular ein Eingabefeld, ein Dropdown Menü und einen
Submit button:

Code:

<form name="suche" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
   <input type="text" name="plz" size="15" maxlength="5"/><br />
   <select name="umkreis">
      <option value="10"> 10 km </option>
      <option value="30"> 30 km </option>
      <option value="50"> 50 km </option>
      <option value="100"> 100 km </option>
   </select><br />
   <input type="submit" name="Submit" value="Suchen" />
</form>



beim submit untersucht man nun einfach ob strlen(von plz) 5 ist usw,
connected dann mit der Datenbank und sucht nach dieser PLZ.
Falls es diese gibt,.. geht das script weiter,.. ansonsten irgendeine Fehlerausgabe.

Code:

if (isset($_POST["plz"]) && strlen($_POST["plz"]) == 5)
{
   $plz = $_POST["plz"];
   $db = mysql_connect("localhost", "root", "");
   mysql_select_db("daten");
   $suchanfrage = mysql_query("SELECT * FROM `infos` WHERE `postleitzahl` =$plz"); //Alle Daten für den Ort holen
   if (mysql_num_rows($suchanfrage) == 0 || mysql_num_rows($suchanfrage) > 1)
   {
      echo "Es ist ein Fehler aufgetreten, bitte versuchen sie es nocheinmal";
   }
   else
   {
      $zelle = mysql_fetch_assoc($suchanfrage);

      echo $zelle["postleitzahl"] . " ";
      echo $zelle["ort"] . "<br />";
      $coord_lang = $zelle["grad_lang"];
      $coord_breit = $zelle["grad_breit"];
      mysql_close($db);


So, nun hat man ja auch die Längen und Breitenangaben dieses Ortes.
Um es mir einfacher zu machen, habe ich nicht in einem Kreis gesucht, sondern in einem Viereck.
Ich nehme einfach die Angaben und addiere und subtrahiere die Strecke in der gesucht werden soll.




Alle Breiche die nun ausserhalb des roten Kreises liegen, aber innerhalb des Rechtecks, sind zwar
hier nun auch enthalten, sind aber weiter weg als der suchradius, zu diesem Problem später.

Da unsere Längen und Breitengrade in Längen un Breiten Minuten vorliegen, müssen wir ersteinmal
unseren Suchradius von KM in dieses System umrechnen.
Das ist für Längen und Breitengrade unterschriedlich, da es 360 Längen und 180 Breitengrade gibt.

Meine Rechungen ergaben ca:

0.00899321608946 Grad pro Kilometer Länge
0.0044966080347 Grad pro Kilometer Breite

Wer wissen will wie, ich hab keine Ahnung mehr, da ich mein gescribbl in der Arbeit liegen habe.
Irgendein Dreisatz mit Erdumfang usw.
Hier ging ich allerdings davon aus, dass die Erde eine Kugel ist, obwohl sie wohl ehr einer
Ellipse ähnelt.

Nun zum PHP Teil meiner Aussage:

Code:

$GradProKm_lang = 0.00899321608946;
$GradProKm_breit = 0.00449660803473;
            
$suchradius = $_POST["umkreis"] / 100 * 120;
$min_lang = $coord_lang - ($GradProKm_lang * $suchradius);
$max_lang = $coord_lang + ($GradProKm_lang * $suchradius);
$min_breit = $coord_breit - ($GradProKm_breit * $suchradius);
$max_breit = $coord_breit + ($GradProKm_breit * $suchradius);


hier hab ich zusätzlich noch den Radius um 20% erhöht, um die ungenauigkeiten auszubügeln.
Es ist zwar viel,.. weniger ist auch noch genau genug,.. allerdings läuft mein script noch
recht schnell.

So,...
nun schnappt man sich erneut aus der MySQL Datenbank alle Daten von den Orten, die in diesem Umkreis sind.

Code:

$db = mysql_connect("localhost", "root", "");
mysql_select_db("daten");
            
$suchstring = ("SELECT * FROM `infos` WHERE `grad_lang` >=$min_lang AND `grad_lang` <=$max_lang ");
$suchstring .= ("AND `grad_breit` >=$min_breit AND `grad_breit` <=$max_breit");
$suchanfrage = mysql_query($suchstring);


Okey,...
Um nun alle Orte noch zu Filtern, die ausserhalb des Suchradius sich befinden, berechne ich für jeden
Ort die Strecke.

Um die Entfernung in Km zweier Orte anhand von Geodaten zu ermitteln, gibt es folgende Formel:

arcosinus[sin(breiteA) * sin(breiteB) + (cos(breiteA) * cos(breiteB)) * cos(längeB - längeA) *Erdradius];

alles klar ?! ,... // ne mir auch nich...

Um die Geodaten (Längen-Breitengrade) verwenden zu können, in dieser Rechnung, müssen diese erst umgerechnet
werden.

Grad / 180 * PI

Fragt mich nicht warum,... aber so ist es... liegt daran., dass wir ja wieder auf KM kommen müssen.

Also der Code:

Code:

while($neuezelle = mysql_fetch_assoc($suchanfrage))
{
   $start_breit = $coord_breit / 180 * 3.14159265;
   $start_lang = $coord_lang / 180 * 3.14159265;
   $erg_breit = $neuezelle["grad_breit"] / 180 * 3.14159265;
   $erg_lang = $neuezelle["grad_lang"] / 180 * 3.14159265;

      // nun haben wir die BreiteA LängeA BreiteB und LängeB für die Formel.
      // diese werden nun eingesetzt:
   
   $sin = sin($start_breit) * sin($erg_breit);
   $cos_a = cos($start_breit) * cos($erg_breit);
   $cos_b = cos($erg_lang - $start_lang);
   $ergebnis = round(acos($sin + ($cos_a * $cos_b)) * 6371);

      // nun gleichen wir noch ab und geben aus:

   if ($neuezelle["postleitzahl"] != $_POST["plz"] && $ergebnis <= $_POST["umkreis"])
   {
      echo $neuezelle["postleitzahl"] . " " . $neuezelle["ort"] . "&nbsp;&nbsp;(ca. " . $ergebnis . " km Luftlinie)<br />";
   }
}


Nun haben wir alle Orte ausgegeben, die sich im Umkreis befinden...
SO, das wars von mir.
Allerdings hab ich bei meinem Script nicht diese Orte ausgegeben,
sondern habe die Orte + PLZ in einem Array gespeichert und noch mit einer 2ten Tabelle verglichen, in der
sich Händler befinden, um somit zu ermitteln ob sich Händler in der Nähe befinden...
Am ende noch die Orte in der GoogleMaps API eingetragen und in nem Fenster einen Anker zur Addy unten gesetzt.

Sieht dann am Ende bei mir so aus:

Klick.

Das sollte allerdings reichen, den rest kann ja jeder selbst.


Zuletzt bearbeitet von choise am Mo 30.06.2008 16:40, insgesamt 11-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
 
Neues Thema eröffnen   Neue Antwort erstellen Seite: Zurück  1, 2, 3, 4, 5, 6
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.