问题是从服务器端转移到客户端的Google地理编码API

时间:2014-07-22 22:33:17

标签: javascript php google-maps-api-3

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

$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个不同的地址请求。所以,我想和客户一起去。

几个小时后我的大脑被擦掉了,因为我对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";

谢谢。

1 个答案:

答案 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&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;
  }

这很简单。现在工作。希望这有助于任何人寻找可能的解决方案,就像我一样。