gpt4 book ai didi

php - 查找邮政编码 10 英里半径范围内的城镇。谷歌地图 API

转载 作者:IT王子 更新时间:2023-10-29 00:07:00 31 4
gpt4 key购买 nike

我最近开始研究 Google Maps API 以尝试在我的网站中使用一些新功能。我目前正在使用此代码:

<?php

$postcode = $_REQUEST['postcode'];

$url = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.$postcode.'&sensor=false';
$parsedXML = simplexml_load_file($url);

if($parsedXML->status != "OK") {
echo "There has been a problem: " . $parsedXML->status;
}

$myAddress = array();
foreach($parsedXML->result->address_component as $component) {
if(is_array($component->type)) $type = (string)$component->type[0];
else $type = (string)$component->type;

$myAddress[$type] = (string)$component->long_name;
}
header('Content-Type: application/json');
echo json_encode($myAddress);


?>

它仅使用我定义的邮政编码并搜索 Google 数据库,然后返回城镇、县等。

如果可能,我不仅希望显示最近的城镇,而且还希望显示 5-10 英里半径范围内的任何城镇。有人可以告诉我如何去做吗?

感谢您的帮助

最佳答案

更新:我在 http://www.mullie.eu/geographic-searches/ 上写了一篇关于这个特定主题的更详细的博文。

--

使用 Google Maps API 遍历所有可用的城镇以获取它们的纬度和经度。将这些保存在某处(数据库)。 - 请注意,Google 不会接受大量调用,因此请限制您的调用。

然后在抓取城镇时,可以使用类似下面的代码抓取一定范围内的城市:

public static function getNearby($lat, $lng, $type = 'cities', $limit = 50, $distance = 50, $unit = 'km')
{
// radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius'
if ($unit == 'km') $radius = 6371.009; // in kilometers
elseif ($unit == 'mi') $radius = 3958.761; // in miles

// latitude boundaries
$maxLat = (float) $lat + rad2deg($distance / $radius);
$minLat = (float) $lat - rad2deg($distance / $radius);

// longitude boundaries (longitude gets smaller when latitude increases)
$maxLng = (float) $lng + rad2deg($distance / $radius / cos(deg2rad((float) $lat)));
$minLng = (float) $lng - rad2deg($distance / $radius / cos(deg2rad((float) $lat)));

// get results ordered by distance (approx)
$nearby = (array) FrontendDB::getDB()->retrieve('SELECT *
FROM table
WHERE lat > ? AND lat < ? AND lng > ? AND lng < ?
ORDER BY ABS(lat - ?) + ABS(lng - ?) ASC
LIMIT ?;',
array($minLat, $maxLat, $minLng, $maxLng, (float) $lat, (float) $lng, (int) $limit));

return $nearby;
}

关于上述代码的注意事项:

  • 使用自己的数据库包装器,所以转换为mysql_query,PDO,...
  • 这并不准确。我们无法在数据库中进行精确的球形计算,因此我们采用了上下纬度和经度限制。这基本上意味着一个位置比你的距离稍微远一点(例如在遥远的东北方,刚好在实际半径之外(实际上几乎是一个圆),但仍在最大纬度和经度内(因为我们比较它到数据库中的平方限制)。这只会粗略但准确地 100% 准确地选择您半径范围内的城市。

我将尝试说明这一点:

_________________
| / \ |
| Y / \ |
| / \ |
|( X )|
| \ / |
| \ / |
|______\_/______|

上面的圆(有点)是你想要在其中找到位置的实际半径,基于位置 X。这很难直接从你的数据库中完成,所以我们实际上从数据库中获取的是周围的正方形.如您所见,位置(如 Y)可能落在这些最大和最小边界内,尽管它们实际上并不在请求的半径范围内。这些可以稍后通过 PHP 过滤掉。

要解决最后一个问题,您可以循环所有结果并计算您的根位置和找到的接近匹配项之间的确切距离,以计算它们是否确实在您的半径范围内。为此,您可以使用此代码:

public static function getDistance($lat1, $lng1, $lat2, $lng2, $unit = 'km')
{
// radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius'
if ($unit == 'km') $radius = 6371.009; // in kilometers
elseif ($unit == 'mi') $radius = 3958.761; // in miles

// convert degrees to radians
$lat1 = deg2rad((float) $lat1);
$lng1 = deg2rad((float) $lng1);
$lat2 = deg2rad((float) $lat2);
$lng2 = deg2rad((float) $lng2);

// great circle distance formula
return $radius * acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($lng1 - $lng2));
}

这将计算位置 X 和位置 Y 之间的(准)精确距离,然后您可以准确过滤掉那些距离足够近以通过粗略的 db-fetch,但又不够近以实际位于您的范围内的城市边界。

关于php - 查找邮政编码 10 英里半径范围内的城镇。谷歌地图 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8135243/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com