【问题标题】:retrieving lat/long of location using google.maps.geocoder使用 google.maps.geocoder 检索位置的纬度/经度
【发布时间】:2012-02-07 02:13:47
【问题描述】:

我一直在尝试使用一些 ajax 在我的应用程序中保存场地位置,并在堆栈溢出时偶然发现了以下代码

function getLatLong(address) 
{
    var geocoder = new google.maps.Geocoder();
    var result = "";
    geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            result[lat] = results[0].geometry.location.Pa;
            result[lng] = results[0].geometry.location.Qa;
        } else {
            result = "Unable to find address: " + status;
        }
    });
    return result;
}

我的问题是,当我调用该函数时,它什么也不返回,当我在 chrome 中调试和设置断点时,它首先在返回结果上中断,然后在 result[lat] = results[0].geometry.location.Pa; 上中断。

我知道数组应该声明为数组类型,但即使我只是返回 results[0].geometry.location 对象,也没有返回任何内容

我可以做些什么来返回位置的纬度/经度以便我可以存储在我的数据库中?

【问题讨论】:

标签: javascript jquery google-maps-api-3 geocoding


【解决方案1】:

这不是答案,但不要使用 Pa 和 Qa 总是使用 lng() 和 lat() 函数:

 place.geometry.location
{...}
    Pa: 56.240477
    Qa: -0.902655999999979
    toString: function(){return"("+this.lat()+", "+this.lng()+")"}
    equals: function(a){return!a?k:Cd(this.lat(),a.lat())&&Cd(this.lng(),a.lng())}
    lat: function(){return this[a]}
    lng: function(){return this[a]}
    toUrlValue: function(a){a=Hd(a)?a:6;return $d(this.lat(),a)+","+$d(this.lng(),a)}

【讨论】:

  • 为了让这个答案更加清晰:谷歌地图的地理编码器有时会返回 lat 和 lng 值作为 Pa 和 QA,其他时候是 Sa 和 Ta...唯一有保证的方法是使用 geometry.location .lat() 和 geometry.location.lng()
【解决方案2】:

您面临的问题是您将 geocoder.geocode 函数视为在返回结果之前立即完成。真正发生的是 geocoder.geocode 被触发,然后您会立即返回结果。因为异步结果很可能没有返回,所以你的结果是空的。将地理编码结果视为推动而非拉动。 storeResult 函数(未显示)是保存信息所需的任何代码。因为您将结果与错误字符串组合在一起,所以您必须在 storeResult 函数中处理它。作为替代方案,您可以在结果中显示一个状态,指示成功或失败。

function getLatLong(address) {
var geocoder = new google.maps.Geocoder();
var result = "";
geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
     if (status == google.maps.GeocoderStatus.OK) {
         result[lat] = results[0].geometry.location.Pa;
         result[lng] = results[0].geometry.location.Qa;
     } else {
         result = "Unable to find address: " + status;
     }
     storeResult(result);
    });
}

【讨论】:

  • 感谢 - 我使用 javascript 来验证地址,然后将其发布到服务器并使用 http 请求获取地理代码信息。可能会进一步重构
  • 正如 Lee Smith 所说,不要使用结果的内部字段。我只是使用这些,因为 OP 这样做了。 Google 经常更改内部变量名称,因此您不能依赖它们。使用 API。
  • 查看 Lee Smith 的回答...改用 geometry.location.lat() 和 geometry.location.lng() 函数。
【解决方案3】:

我为此苦苦挣扎,发现以下方法可行。

  1. 循环遍历对象并推入一个新数组:

    var newArray = [];
    
    for (var key in latLng) {
    
       newArray.push(key);
    
    }
    
  2. 使用方括号语法调用带有变量值的对象,点符号中断:

    var lat = latLng[newArray[0]];
    
    var lng = latLng[newArray[1]];
    

【讨论】:

    【解决方案4】:
    function getLatLong(address) 
    {
        var geocoder = new google.maps.Geocoder();
        var result = '';
        geocoder.geocode( { 'address': address }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                // Call the lat/lng functions to return a computed value.
                result[lat] = results[0].geometry.location.lat();
                result[lng] = results[0].geometry.location.lng();
            } else {
                result = 'Unable to find address: ' + status;
            }
        });
        return result;
    }
        
    getLatLong('address'); 
    

    【讨论】:

    • 你能找到更多答案吗?
    • 能否请您对您的代码进行一些解释?
    【解决方案5】:

    在我的例子中,从地点对象获取纬度和经度的最简单解决方案是:

      var latitude=place.geometry.location['k'];
      var longitude=place.geometry.location['A'];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2016-12-10
      • 2015-12-25
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多