繁体   English   中英

从服务器端到客户端的Google Geocoding API问题

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

我有一个正在运行的商店定位器脚本。 用户输入其地址,然后对其地址进行地理编码,然后将经纬度传递给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多个不同的地址请求。 所以,我想和客户端一起去。

几个小时后,我完全不熟悉Google 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-> 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;
  }

就那么简单。 现在工作。 希望这可以帮助任何人像我一样寻找可能的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM