Umkreissuche funktioniert, es soll aber nur der nächste Ort ausgegeben werden!

RageNo1

Erfahrenes Mitglied
Hallo Leute,
ich bastel gerade an einer Umkreissuche.
Ich habe viele Beiträge dazu gelesen und habe es auch soweit hinbekommen dass alle Orte ausgegeben werden welche unter Entfernung XX zur Postleitzahl fallen.

Vorab zur Info:
Ich habe eine Datenbank PLZ mit den Längen und Breitenangeben.
Dazu kommt dann die Datenbank mit verschiedenen Orten, diese Orte haben ebenfalls Längen- und Breitenangaben.

Zunächst wird per GET die PLZ übergeben und diese wird in PLZ gesucht.
Dann folgen Berechnungen. Mit den Werten wird dann in der Datenbank Orte alles ausgegeben was innerhalb 50 km liegt ($entfernung).

PHP:
...
$connect2 = mysql_query("SELECT * FROM plz WHERE plz = '".$_GET[plz]."'");
$showplz = mysql_fetch_array($connect2);

$ursprungsbreite = $showplz[lat];
$ursprungslaenge = $showplz[lon];

$entfernung = '50';

$alpha = 180*$entfernung/(6378137/1000*3.14159);

$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;

$connectb = mysql_query("SELECT * FROM orte WHERE (lat >= '".$geo1."') AND (lat <= '".$geo2."') AND (lon >= '".$geo3."') AND (lon <= '".$geo4."')");
while($showb = mysql_fetch_array($connectb)) {

echo $showb[name].'<br />'.$showb[strasse].' &bull; '.$showb[plz].' '.$showb[stadt].'<br />'.$showb[tel].'<br /><br />';

}

Zum Problem:
Es werden korrekte Orte ausgegeben.
Nur leider bekomme ich es nicht hin in die Abfrage zu integrieren dass der nächt gelegene Ort ausgegeben wird. Die Ort werden zufällig ausgegeben.

Wie müsste man jetzt die Abfrage umstellen damit die nächsten Orte als erstes ausgegeben werden? (ORDER BY ... oder sowas!?)

Gruß Ragey
 
hänge ein ORDER BY spalte_für_entfernung an. Es wird dann automatisch aufsteigend sortiert.
btw: Bei Assoziativen Arrays müssen Anführungszeichen in die eckigen Klammern, sofern es keine Konstante sind...
PHP:
$_GET['plz']
$ursprungsbreite = $showplz['lat']; 
$ursprungslaenge = $showplz['lon'];
 
Ok vielen Dank!
Noch eine andere Sache die mich verwirrt.
Wenn ich etwas abfrage mit einer PLZ funktioniert es gut.
Mit manchen PLZ wird aber gar nichts ausgegeben obwohl die koordinaten in der Tabelle PLZ und Orte gleich sind!?

Wie kann es sein dass hier z.b. bei manchen PLZ gar nichts angezeigt wird, selbst wenn ich sage Umkreis 100km!? Bei anderen gehts problemlos.
 
Wie kann es sein dass hier z.b. bei manchen PLZ gar nichts angezeigt wird, selbst wenn ich sage Umkreis 100km!? Bei anderen gehts problemlos.

Wie speicherst du den die PLZs? Manche haben da ein kleines Problem mit der führenden '0'. Oder bei welchen PLZs tritt das Problem den auf? Und warum machst du die Berechnung den nicht über SQL?

Achja für so etwas gibts BETWEEN.
SQL:
SELECT `spalte1`,`spalte2` ,`spalte3` 
FROM `orte`
WHERE `lat` BETWEEN ".$geo2." AND ".$geo1." 
    AND `lon` BETWEEN ".$geo4." AND ".$geo3."
 
Zuletzt bearbeitet von einem Moderator:
Hier nochmal das Script mit Änderung der Abfrage, danke für den Tipp!

PHP:
...
$connect2 = mysql_query("SELECT * FROM plz WHERE plz = '".$_GET['plz']."'");
$showplz = mysql_fetch_array($connect2);

$ursprungsbreite = $showplz['lat'];
$ursprungslaenge = $showplz['lon'];

$entfernung = '50';

$alpha = 180*$entfernung/(6378.137*3.14159);

$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;

$connectb = mysql_query("SELECT * FROM orte WHERE lat BETWEEN '".$geo1."' AND '".$geo2."' AND lon BETWEEN '".$geo3."' AND '".$geo4."'");

$a = $ursprungsbreite/180*3.14159;
$b = $ursprungslaenge/180*3.14159;
$z = 1;

while($showb = mysql_fetch_array($connectb)) {

$c = $showb['lat'];
$d = $showb['lon'];
$c = $c/180*3.14159;
$d = $d/180*3.14159;

$e = sin($a)*sin($c);
$f = cos($a)*cos($c)*cos($d-$b);
$g = acos($e + $f);
$h = $g * 6378.137;
$ausgabe = sprintf("%01.2f", $h);
if($ausgabe > $entfernung) {
        continue;
    }
$ausgabe = str_replace(".", ",", $ausgabe);

echo $showb['name'].'<br />'.$showb['strasse'].' &bull; '.$showb['plz'].' '.$showb['stadt'].'<br />'.$showb['tel'].'<br />Entfernung zu '.$_GET['plz'].' sind '.$ausgabe.' Kilometer<br /><br />';
$z++;
}

Ziel ist es ja dass nur der nächstgelegene Ort ausgegeben wird.
Die Sortierung bekomme ich nicht wirklich hin.

Die Tabellenstruktur sieht wie folgt aus:

PLZ --> id,plz,lon,lat,ort
ORTE --> id,name,plz,stadt,strasse,lon,lat

Das Problem tritt z.b. bei der PLZ 97070 auf obwohl die PLZ korrekt ist und die Koordinaten auch (9.93274931164582 / 49.7965442960769) und diesen Ort gibt es in der Tabelle ORTE.
Dennoch wirds nicht ausgegeben.
 
Fehler gefunden!
PHP:
SELECT * FROM orte WHERE lat BETWEEN 49.3473 AND 50.2457 AND lon BETWEEN 9.4835 AND 10.3819
Ohne die ' gehts problemlos :)

--------------
Ich habe mal ein paar Werte gekürzt, auch die in der Datenbank zu Testzwecken.

lat = 49.7965
lon = 9.9327

PHP:
SELECT * FROM orte WHERE lat BETWEEN '49.3473' AND '50.2457' AND lon BETWEEN '9.4835' AND '10.3819'

lat und lon liegen doch ganz klar dazwischen, dennoch sagt man mir: keine Datensätze :(

Jetzt verstehe ich die Welt nicht mehr?
Hat jemand eine Erklärung dafür?

Zumal es mit anderen Abfragen problemlos geht, z.b: mit dem hier:
PHP:
SELECT * FROM orte WHERE lat BETWEEN '50.9366' AND '51.8350' AND lon BETWEEN '6.4127' AND '7.3111'
(lat = 51.3858 lon = 6.8619)
 
Zuletzt bearbeitet:
PHP:
$connect2 = mysql_query("SELECT * FROM plz WHERE plz = '".$_GET['plz']."'");
$showplz = mysql_fetch_array($connect2);

$ursprungsbreite = $showplz['lat'];
$ursprungslaenge = $showplz['lon'];

$entfernung = '10';

$alpha = 180*$entfernung/(6378.137*3.14159); 

$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;

$connectb = mysql_query("SELECT * FROM orte WHERE lat BETWEEN ".$geo1." AND ".$geo2." AND lon BETWEEN ".$geo3." AND ".$geo4."");

$a = $ursprungsbreite/180*3.14159;
$b = $ursprungslaenge/180*3.14159;
$z = 1;

while($showb = mysql_fetch_array($connectb)) {

$c = $showb['lat'];
$d = $showb['lon'];
$c = $c/180*3.14159;
$d = $d/180*3.14159;

$e = sin($a)*sin($c);
$f = cos($a)*cos($c)*cos($d-$b);
$g = acos($e + $f);
$h = $g * 6378.137;
$ausgabe = sprintf("%01.2f", $h);
if($ausgabe > $entfernung) {
        continue;
    }
$ausgabe = str_replace(".", ",", $ausgabe);

echo $showb['name'].'<br />'.$showb['strasse'].' &bull; '.$showb['plz'].' '.$showb['stadt'].'<br />'.$showb['tel'].'<br />Entfernung zu '.$_GET['plz'].' sind '.$ausgabe.' Kilometer<br /><br />';
$z++;
}
Jetzt muss nur noch das Problem gelöst werden dass der nächstgelegene Ort angezeigt wird aus Tabelle Orte.

Sortierung nach Entfernung abwärts.
Nur eine Ausgabe (LIMIT 1).

Ich hoffe da kann mir nochmal jemand auf die Sprünge helfen.
Danke Euch!
 
Ich habe es nun selbst hinbekommen mit folgender Abfrage:
PHP:
$connectbrand = mysql_query("SELECT ort, lat, lon,
( acos( (sin(".$a.")*sin(lat/180*3.14159)) + (cos(".$a.")*cos(lat/180*3.14159)*cos((lon/180*3.14159)-".$b.")) ) * 6378.137 ) AS entf
FROM orte WHERE lat BETWEEN ".$geo1." AND ".$geo2." AND lon BETWEEN ".$geo3." AND ".$geo4." ORDER BY entf ASC");
 
Zurück