mySQL Postleitzahlen innerhalb von x km / Meilen innerhalb des Bereichs von y @ auswähl

Hinweis: Obwohl ich eine Postleitzahlendatenbank mit niederländischen Postleitzahlen verwende, ist diese Frage landesunabhängig.

Ich habe eine Datenbank mit jeder Postleitzahl in den Niederlanden + ihren x- und y-Koordinaten (Lat / Long).

Ich habe zum Beispiel die Postleitzahl:$baseZipCode = 1044; mit folgenden Koordinaten:

x coordinate = 4,808855
y coordinate = 52,406332

Jetzt möchte ich alle anderen Postleitzahlen mit @ find$range von$baseZipCode.

Beispielsweise

SELECT
  zipcode
FROM
  zipcodes
WHERE
  ????? // Need help here

Das Problem ist, dass die Erde nicht ganz rund ist. Ich finde viele Tutorials mitfrom a to b Berechnungen, aber das ist nicht was ich brauche.

Hat jemand eine Idee?

AKTUALISIERE Dank Captaintokyo habe ich folgendes gefunden:

Möchten Sie alle Postleitzahlen und die entsprechenden Entfernungen innerhalb eines bestimmten Radius von einer anderen Postleitzahl oder einem anderen Punkt finden? Für die Lösung dieses Problems sind Breiten- und Längenkoordinaten erforderlich. Durch Geokodierung der Adresse erhalten Sie Breiten- / Längengradkoordinaten von einer Adresse.

Zunächst benötigen Sie eine Datenbank mit allen Postleitzahlen und den dazugehörigen Breiten- und Längengradkoordinaten:

CREATE TABLE `zipcodes` (
  `zipcode` varchar(5) NOT NULL DEFAULT '',
  `city` varchar(100) NOT NULL DEFAULT '',
  `state` char(2) NOT NULL DEFAULT '',
  `latitude` varchar(20) NOT NULL DEFAULT '',
  `longitude` varchar(20) NOT NULL DEFAULT '',
  KEY `zipcode` (`zipcode`),
  KEY `state` (`state`)
)

So sobald Sie die Datenbank haben, möchten Sie alle Postleitzahlen innerhalb eines bestimmten Meilenradius von einem zentralen Punkt finden. Wenn der Mittelpunkt eine andere Postleitzahl ist, fragen Sie einfach die Datenbank nach den Breiten- und Längengradkoordinaten dieser Postleitzahl ab. Dann lautet der Code wie folgt:

// ITITIAL POINT

$coords = array('latitude' => "32.8", 'longitude' => "-117.17");

//RADIUS

$radius = 30;

// SQL FOR KILOMETERS

$sql = "SELECT zipcode, ( 6371 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radi,ans( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";

// SQL FOR MILES

$sql = "SELECT zipcode, ( 3959 * acos( cos( radians( {$coords['latitude']} ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians( {$coords['longitude']} ) ) + sin( radians( {$coords['latitude']} ) ) * sin( radians( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";

// OUTPUT THE ZIPCODES AND DISTANCES

$query = mysql_query($sql);

while($row = mysql_fetch_assoc($query)){

    echo "{$row['zipcode']} ({$row['distance']})<br>\n";

}

(Sowohl Yahoo als auch Google bieten kostenlose Geokodierungsdienste an.)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage