Google地图在页面上没有完全加载显示?

21

我在我的页面上有一个谷歌地图和一个搜索面板,这个搜索面板是我自己构建的,可以随意显示和隐藏。它覆盖了地图的一侧,大约200像素。问题是,当我调整地图大小时,或者其他情况下,面板重叠的区域未被渲染,也就是说地图在那里没有渲染出来。

请查看此链接

在框中输入OMDB,这是一个机场的ICAO代码,然后按回车键。

结果会显示出来,你会看到面板。现在点击全屏链接,然后点击机场选项卡以使面板消失 - 你会发现部分地图根本没有渲染出来...我必须拖动地图,只有部分区域才能渲染。我该如何解决?

值得注意的是,我已经在Windows XP上运行了Google Chrome、Firefox和IE8。是否有一种方法可以强制完全渲染地图?这是一个相当不稳定的问题,可能与我的代码有关,也可能是主机问题。还是谷歌不喜欢我? :(

编辑:看到侧边栏上的大丑补丁了吗?它是地图应该被渲染的区域,但没有渲染出来。无论缩放和平移多少次都无法清除它 :(

13个回答

18

我无法复现您所遇到的问题,但它看起来与我之前在谷歌地图中见过的另一个问题类似。

似乎您可能正在遭遇谷歌地图确定哪些瓦片在视图中的方式。它仅在第一次将地图加载到div中时计算一次,并且如果div增大,则绘制的地图不足。幸运的是,这很容易处理。每当容器可能已调整大小时,在地图实例上使用checkResize()方法,剪辑区域将从容器的当前大小重新计算。


尝试在Internet Explorer中运行 - 在Firefox中有时会发生这种情况,但有时不会。 - Ali
3
请注意,这适用于旧版的Google Maps API,但不适用于v3。Phidah的答案对我在v3版本中有效,同时使用map.setCenter和map.setZoom重新定位并重新调整地图缩放。 - Sean Fahey
3
在至少API v3中,checkResize方法不存在。请改用google.maps.event.trigger(map, 'resize');。 - G. Ghez
这个问题困扰了我的地图几年。@G.Ghez的解决方案完美无缺。谢谢! - Stephen K. Karanja

15

是的,你必须提供容器 DIV 的实际像素高度和宽度。这实际上在 Google API 中有详细说明。

可以使用类似以下的内容:

<div id="map_canvas" style="width:500px;height:500px;"></div>

代替

<div id="map_canvas"></div>

你就可以轻松完成了!


3
我刚被这个东西咬了!百分比大小不起作用,指定像素大小可以。 - Simon
只要在地图上放置一个调整大小事件处理程序,一切都应该能正常运行。我在响应式网站中大量使用它,几乎完美无缺。但是,请尽量避免除窗口调整大小之外的其他情况下调整地图的大小,因为这会非常消耗资源。 - Johnride

12

据我所见,这在OS X 10.6.2的Google Chrome上运行良好。

http://i33.tinypic.com/sfe3ah.png

唯一的问题是哥本哈根机场与你的应用程序所暗示的位置相距甚远,而LAX位于海洋中央;-)

编辑:
我看到了你的截图,我觉得似乎Google Maps没有渲染被搜索和搜索结果窗格覆盖的地图部分,之后在隐藏搜索窗格时未正确触发渲染。

我没有能在Google Maps API中找到一个体面的渲染触发器,但我认为你应该尝试像编程式缩放和移动地图中心到其他地方再返回,以便也许强制重新渲染地图。

或者你可以手动触发一些你认为可能会引起地图重新渲染的事件,例如google.maps.event.trigger(map, 'resize')

我知道这些建议感觉就像是通过可怕的黑客方式使其工作,以及我非常不确定它是否会奏效,但这是我的最佳猜测;-)


地点都乱七八糟的 :-S 需要解决一下。有时候当你想浏览它时,右侧会出现一个巨大的未渲染区域,搜索面板也会出现问题,非常不稳定。 - Ali
@phidah - 你没听说吗?加利福尼亚掉进了海里,所以洛杉矶国际机场的位置现在是正确的。 :-p - JasCav
啊来吧:( 这里有人有任何想法吗? - Ali
对我来说很好用(FF3.5,Windows 7)。只是机场坐标有问题,正如原回答中指出的那样。 - Pekka
很抱歉,但我仍然无法在Mac上的Chrome中找到错误。 - phidah

4
在Google Maps V3中,您需要的一点魔力在这里有记录: https://developers.google.com/maps/documentation/javascript/reference#Map 在事件下面。
开发人员应该在地图上触发此事件当div大小改变时:google.maps.event.trigger(map, 'resize')。
诀窍是知道何时调用它,这将根据您的代码情况而异。如果您使用Bootstrap 3 Modals,这将非常有效。
$("#modal-map")
    .modal()
    .on("shown.bs.modal", function() {
        google.maps.event.trigger(gmap, 'resize');
    });

其中gmap是您创建的google.maps.Map对象。


批准,这是在v3中的正确做法。 - G. Ghez

4

当我尝试在对话框中加载谷歌地图时,我遇到了相同的问题。好像谷歌地图没有正确渲染。因此,我找到了下面的解决方案,这可能会解决你的问题。

在初始化对话框后,我触发了谷歌地图的重新调整大小事件,请检查下面的代码片段。

google.maps.event.trigger(map, 'resize', function () {
    // your callback content
});

例子:

我通过ajax调用加载地图,然后初始化对话框,并最后触发了google地图的resize事件。

$.ajax({
    url:"map.php",
    type:"POST",
    success:function(data){
        $("#inlineEditForm").html(data);

        $('#inlineEditPopUp').dialog('open');
        google.maps.event.trigger(map, 'resize', function () {
            // your callback content
        });
    }
});

3
如果您正在使用jQuery插件goMap,那么应该使用以下代码:
google.maps.event.trigger($.goMap.map, 'resize');

尽管你应该将其包装在一个事件中,以便在地图显示时运行。下面是我代码中的实现方式:
$(document).on('click', '#mapClicker', 'initmap', function() {
   setTimeout(function() {
         google.maps.event.trigger($.goMap.map, 'resize');
      $.goMap.fitBounds();
   }, 100)
});

1

我知道这个问题有点老了,但是我刚刚遇到了一个类似的问题。不过,在我的情况下,我正在设置地图从中加载(为了实现全屏效果),而这个在一个


0
我遇到了同样的问题,尝试了很多方法,直到我意识到我在影响我应用程序中所有的div元素的CSS中设置了overflow属性为hidden。尽管谷歌地图在包含地图的div元素中设置了相同的属性和值,但只有在我关闭了我的div元素中的该属性后,地图才正确渲染。请确保您的CSS中没有对div元素进行任何设置。

0
我曾经遇到过这个问题,而我发现唯一的解决方法(在我的情况下)是在元素之后内联触发调整大小。我不知道为什么,但我找到了一个帖子,其中有人也有这个解决方案。(抱歉没有参考资料。)我的设置略有不同;它来自于一个被jQueryMobile注入的页面,所以延迟实例化可能与我的问题有关。希望这能帮助到某些人。
<div id="my-map"></div>
<script type="text/javascript">
  $('#my-map').height($("#my-map-container").height());
  $('#my-map').width($("#my-map-container").width());
  google.maps.event.trigger($('#my-map'), 'resize');
</script>

0
我曾经遇到过同样的问题,通过将包含div的宽度从"%"更改为"px"(例如width="700px"而不是"80%"),我简单地解决了这个问题。我猜谷歌可以更好地进行尺寸计算...虽然我不能保证这一点,但它确实帮助了我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接