注意:尽管我将邮政编码数据库与荷兰邮政编码一起使用,但是此问题与国家/地区无关。
我有一个数据库,其中包含荷兰的每个邮政编码及其x和y坐标(纬度/经度)。
例如,我的邮政编码:$baseZipCode = 1044;具有以下坐标:
$baseZipCode = 1044;
x coordinate = 4,808855 y coordinate = 52,406332
现在,我想使用$rangefrom查找其他所有邮政编码$baseZipCode。
$range
$baseZipCode
例如:
SELECT zipcode FROM zipcodes WHERE ????? // Need help here
问题在于地球并不完全是圆形的。我发现很多关于from a to b计算的教程,但这不是我所需要的。
from a to b
有人有什么主意吗?
更新 感谢Captaintokyo,我发现了这一点:
是否要查找所有邮政编码和距另一个邮政编码或点的一定英里/公里半径内的对应距离?这个问题需要经纬度坐标来解决。对地址进行地理编码可为您提供地址的纬度/经度坐标。
首先,您将需要一个包含所有邮政编码及其对应的纬度和经度坐标的数据库:
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`) )
因此,一旦有了数据库,您便要查找中心点一定英里半径内的所有邮政编码。如果中心点是另一个邮政编码,只需在数据库中查询该邮政编码的纬度和经度坐标即可。然后代码如下:
// 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和Google均提供免费的地理编码服务。)
您想做这样的事情:
SELECT zipcode FROM zipcodes WHERE DistanceFormula(lat, long, 4.808855, 52.406332) < $range
如果您的邮政编码表很大,可能会很慢。您可能还想查看MySQL的地理空间扩展。