【问题标题】:How can google.maps.geometry be undefined?google.maps.geometry 怎么可能是未定义的?
【发布时间】:2026-02-02 16:40:01
【问题描述】:

我正在使用 Google Maps Javascript API v3 和 RequireJS 编写一个 JavaScript 应用程序。我为 gmaps 编写了一个小包装器,以使依赖关系正确:

define('gmaps', ['goog!maps,3.9,packages:[geometry],language:de,other_params:sensor=false&channel=...&client=...'],
function(){
    return window.google.maps;
}); 

这在大多数情况下都可以正常工作,即使在使用优化器缩小代码之后也是如此。但是,有时我会在以 gmaps 为依赖项并尝试计算距离的模块中显示 gmaps.geometry is undefined 错误:

define(['gmaps'], function(gmaps) {
    return {
        ...
        calcDistance: function(target) {
            var position = this.getPosition();
            var distance = gmaps.geometry.spherical.computeDistanceBetween(
                new gmaps.LatLng(position.latitude, position.longitude),
                new gmaps.LatLng(target.latitude, target.longitude)
            );
            return (distance / 1000).toFixed(2);
        }
    }
});

只有当我尝试在页面之后立即执行 calcDistance 并且所需数据已加载且仅有时才会发生这种情况。我想这是 gmaps 异步加载的一些问题,但我并不完全理解。如何定义 gmaps 但未定义 gmaps.geometry?有没有办法解决这个问题?

【问题讨论】:

    标签: javascript google-maps-api-3 asynchronous requirejs


    【解决方案1】:

    您似乎没有加载正确的库。只需在库 url 中附加 &libraries=geometry

    检查这个 google.maps.geometry.spherical error

    【讨论】:

    • 我有两个页面都将“?libraries=geometry”附加到 URL...其中一个有效,另一个总是抛出此错误。引发错误的那个缺少“&sensor=”。我添加了它并开始工作。 (我认为 sensor= 已经贬值了!)
    【解决方案2】:

    packages:[geometry] 似乎不像我想象的那样工作,所以根本没有加载几何。 Google 似乎在某些时候会在内部加载几何图形,因此我的距离计算代码在大多数情况下都有效。我通过将 gmaps 模块的定义调用更改为:

    define('gmaps', ['goog!maps,3.9,language:de,other_params:libraries=geometry&sensor=false&channel=...&client=...'],
    function(){
        return window.google.maps;
    });
    

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但在我的情况下,我发现几何库在初始化时不可用。我不知道为什么。但它在一段时间后变得明确。所以我使用等待函数解决了这个问题。

      setTimeout(waitForGeometryLibraries, 250);  
      
      function waitForGeometryLibraries(){
          if(typeof google.maps.geometry !== "undefined"){
           // code using geometry library
          }
          else{
              setTimeout(waitForGeometryLibraries, 250);
          }
      }
      

      【讨论】: