我有一个商店定位器脚本正在运行。用户输入他们的地址,然后对其进行地理编码,然后将lat/lng传递给MySQL查询,该查询选择该地址x英里内的位置。今天,虽然我遇到了以下地理代码服务器端请求的第一个问题:
$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个不同的地址请求。所以,我想用客户端。
几个小时后,我的大脑被清空了,因为我对地图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->lat和$lat_lon->lng)返回它们的等量?
我的第二个问题是,在地球上我如何传递lat和lng变量到MySQL查询,这是在另一个文件,在PHP编码?对于服务器端编码,地理编码函数位于与数据库查询相同的php文件中,因此引用$lat_lon->很简单。然而,我以前从来没有做过这种类型的编码,我在网上搜索了几个小时,结果一无所获。我击败。
有谁能给点光吗?
我不知道它是否有任何区别,但查询字符串是:
$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";
谢谢。
好的,所以我找了一个地图编码器来为我工作,因为这是我的联盟,看到他所做的,我很高兴我没有自己做。
在我的搜索表单页面,我有自动完成功能,他改为:
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;
}
就是这么简单。现在工作。