谷歌地理编码API,从服务器端转移到客户端,问题

Google Geocoding API, moving from server-side to client-side, issues

本文关键字:转移 客户端 问题 服务器端 编码 API 谷歌      更新时间:2023-09-26

我有一个商店定位器脚本正在运行。用户输入他们的地址,然后对其进行地理编码,然后将lat/lng传递给MySQL查询,该查询选择该地址x英里内的位置。今天,虽然我遇到了以下地理代码服务器端请求的第一个问题:

$apiURL = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=$address,$city,$state,$zipcode&region=$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&region=$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;
  }

就是这么简单。现在工作。