mySQL y aralığında x km / kilometre mesafedeki zipcodes seçin

0 Cevap php

Note: Although I use a zipcode database with Dutch zipcodes, this question is country independent.

Ben Hollanda'da her posta kodu + onun x ile bir veritabanı var ve y (lat / uzun) koordinat.

$baseZipCode = 1044; aşağıdaki koordinatlarla: Ben örnek posta kodu için var:

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

Şimdi, $range den $baseZipCode ile diğer tüm zipcodes bulmak istiyorum.

Örneğin:

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

Sorun, toprak tamamen yuvarlak olmasıdır. I from a to b hesaplamaları ile öğreticiler bir sürü bulabilirsiniz ama ben gerekenler değil.

Herkes herhangi bir fikir var mı?


UPDATE Thanks to Captaintokyo I found this:

Başka bir posta kodu veya noktadan belli bir mil / kilometre yarıçapındaki bütün zipcodes ve ilgili mesafeleri bulmak ister misiniz? Bu sorunları çözmek için enlem ve boylam koordinatlarını gerektirir. Adres coğrafi kodlama size / boylam bir adresten koordinatları enlem verir.

Öncelikle tüm zipcodes ve bunlara karşılık gelen enlem ve boylam koordinatları bir veritabanı gerekiyor:

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`)
)

Eğer veritabanı var bir kere Yani merkezi bir noktadan belirli bir kilometre yarıçapı içindeki tüm zipcodes bulmak istiyorum. Merkez noktası başka bir posta kodu ise, sadece bu posta kodu enlem ve boylam koordinatlarını veritabanını sorgulamak. Aşağıdaki gibi kod:

// 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( radians( 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";

}

(Yahoo ve Google Hem ücretsiz geocoding hizmetleri sunuyoruz.)

0 Cevap