我正在运行商店定位器脚本。用户输入他们的地址,然后对其进行地理编码,然后将lat / lng传递给MySQL查询,该查询选择地址x-miles内的位置。今天虽然我遇到了以下地理编码服务器端请求的第一个问题:
$apiURL = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=$address,$city,$state,$zipcode®ion=$country&key=$key");
$output= json_decode($apiURL);
$lat_lon->lat = $output->results[0]->geometry->location->lat;
$lat_lon->lon = $output->results[0]->geometry->location->lng;
问题是我超过了我的2500个请求限制。因此,我阅读了客户端请求作为克服这一点的方法。我还读到了关于缓存结果的内容,但老实说我相信一天内我会收到超过2500个不同的地址请求。所以,我想和客户一起去。
几个小时后我的大脑被擦掉了,因为我对Maps API完全不熟悉。我想出了以下javascript:
function GetLocation() {
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': <? echo $_POST['zipcode'] ?>}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
lat = results[0].geometry.location.lat();
lng = results[0].geometry.location.lng();
}
});
};
我的第一个问题是,我是否正确编码,是服务器端代码的直接替代品,即lat和lng将从服务器端请求返回其等价物($ lat_lon-&gt; lat和$ lat_lon - &GT; LNG)
我的第二个问题是,我如何将lat和lng变量传递给MySQL查询,该查询位于另一个用PHP编码的文件中?使用服务器端编码,地理编码功能与数据库查询在同一个php文件中,因此引用$ lat_lon-&gt;很简单。但是我之前从未做过这种类型的编码,而且我在网上拖网的时间也没有结果。我被打败了。
请问有人可以解释一下吗?
我不知道它是否有任何区别,但查询字符串是:
$query = "SELECT *,(((acos(sin(($lat*$pi/180)) * sin((lat*$pi/180)) + cos(($lat*$pi/180)) * cos((lat*$pi/180)) * cos((($lon - lon)*$pi/180))))*180/$pi)*60*1.423) as distance FROM locations HAVING distance <= $radius AND $category_search AND (expiration_date >= NOW() || expiration_date = '0000-00-00 00:00:00') ORDER BY distance ASC $results_limit";
谢谢。
答案 0 :(得分:0)
在我的搜索表单页面上,我有自动完成功能,他改为:
function fillInAddress() {
var place = autocomplete.getPlace();
// HE ADDED THE NEXT 5 LINES TO THE FUNCTION
var lat = place.geometry.location.lat();
var lng = place.geometry.location.lng();
$(".storelocator_body form").find("input.geometry").remove();
$(".storelocator_body form").append("<input type='hidden' class='geomtery' name='lat' value='" + lat + "'>");
$(".storelocator_body form").append("<input type='hidden' class='geomtery' name='lng' value='" + lng + "'>");
for (var component in componentForm) {
document.getElementById(component).value = '';
document.getElementById(component).disabled = false;
}
if (place.address_components != undefined && place.address_components != null) {
for (var i = 0; i < place.address_components.length; i++) {
var addressType = place.address_components[i].types[0];
if (componentForm[addressType]) {
var val = place.address_components[i][componentForm[addressType]];
document.getElementById(addressType).value = val;
}
}
}
}
然后在php文件中,我有原始服务器端地理编码,他将其更改为:
if (isset($_POST['lat']) && isset($_POST['lng'])) {
$lat_lon->lat = $_POST['lat'];
$lat_lon->lon = $_POST['lng'];
} else {
//THESE NEXT 4 LINES ARE THE ORIGINAL CODE, WHICH HE SUBSEQUENTLY ADDED TO
$apiURL = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=$address,$city,$state,$zipcode®ion=$country&key=$key");
$output= json_decode($apiURL);
$lat_lon->lat = $output->results[0]->geometry->location->lat;
$lat_lon->lon = $output->results[0]->geometry->location->lng;
}
这很简单。现在工作。希望这有助于任何人寻找可能的解决方案,就像我一样。