注意:虽然我使用带有荷兰邮政编码的邮政编码数据库,但这个问题与国家无关。
我有一个数据库,其中包含荷兰的每个邮政编码 + 它的 x 和 y 坐标(纬度/经度)。
我有例如邮政编码:$baseZipCode = 1044;
具有以下坐标:
x coordinate = 4,808855
y coordinate = 52,406332
现在,我想使用$range
from查找所有其他邮政编码$baseZipCode
。
例如:
SELECT
zipcode
FROM
zipcodes
WHERE
????? // Need help here
问题是地球不是完全圆的。我找到了很多关于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";
}
(雅虎和谷歌都提供免费的地理编码服务。)