【问题标题】:OpenLayers: Adding more than one Google layer leads to white screen after map resizeOpenLayers:添加多个 Google 图层会导致地图调整大小后出现白屏
【发布时间】:2011-05-21 15:45:41
【问题描述】:

在尝试创建可动态填充整个页面的 OpenLayers 地图时,我遇到了问题。在我最小化然后最大化浏览器窗口后,地图变为空白。实际上,它可以在任何窗口调整大小后发生,但每次都最小化/最大化会起作用。我使用的是 Firefox 4,但在所有其他浏览器中都会出现同样的错误。

经过一些实验后,我发现只有在地图上添加多个 Google 图层时才会发生这种情况。仅 GoogleStreets 就可以完美运行; GoogleStreets + GoogleHybrid(或任何其他组合)会导致白屏。

有趣的是,如果我在调整窗口大小之前在图层之间切换,一切正常。

我在这里做错了吗?检查下面我的代码(它可以在任何本地机器上运行,所有库都来自 CDN)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Mappa Mundi</title>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>

        <link rel="stylesheet" href="http://openlayers.org/api/theme/default/style.css" type="text/css"/>
        <link rel="stylesheet" href="http://openlayers.org/api/theme/default/google.css" type="text/css"/>

        <script src="http://maps.google.com/maps/api/js?v=3.3&amp;sensor=false" type="text/javascript"></script>

        <script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script>

        <style type="text/css">
            body {
                font-size: 0.75em; font-family: Verdana;
                margin: 0; padding: 0;
            }

            .b-map-openlayers {
                width: 100%;
                height: 100%;
            }
        </style>
    </head>

    <body>

        <div id="map-openlayers" class="b-map-openlayers"></div>


        <script type="text/javascript">
        /*<![CDATA[*/

            MapTest = function(cfg) 
            {
                var self = this;
                var i;

                self.$mapContainer = $('#'+cfg.containerId);

                self.updateContainerSize();

                // Creating map
                self.map = new OpenLayers.Map(cfg.containerId, {
                        controls:[]
                });

                // Handle window resize event
                $(window).bind('resize', self, self.updateMapSize );

                var gmap = new OpenLayers.Layer.Google("Google: Streets", {
                        numZoomLevels: 20,
                        sphericalMercator: true
                });

                var ghyb = new OpenLayers.Layer.Google("Google Hybrid", {
                        type: google.maps.MapTypeId.HYBRID,
                        numZoomLevels: 20,
                        sphericalMercator: true
                });

                // !!! This is the source of the problem. Remove ghyb - and everything's fine
                self.map.addLayers([gmap, ghyb]);

                self.map.setCenter( new OpenLayers.LonLat(0, 0), 5 );

                self.map.addControl(new OpenLayers.Control.LayerSwitcher({roundedCornerColor: '#3f3f3f'}));
                self.map.addControl(new OpenLayers.Control.DragPan());
                self.map.addControl(new OpenLayers.Control.PanZoomBar());
                self.map.addControl(new OpenLayers.Control.Navigation());
            };

            MapTest.prototype =
            {
                updateContainerSize: function()
                {
                    var self = this;

                    var mapHeight = $(window).height();
                    var mapWidth = $(window).width();

                    self.$mapContainer.height(mapHeight);
                    self.$mapContainer.width(mapWidth);
                },

                updateMapSize: function(event)
                {
                    var self = event.data;

                    self.updateContainerSize();
                    self.map.updateSize();
                }
            };

            $(document).ready(function() {
                var mapTest = new MapTest({
                        containerId: 'map-openlayers'
                });
            });

        /*]]>*/
        </script>
    </body>
</html>

【问题讨论】:

    标签: google-maps openlayers


    【解决方案1】:

    在 Chrome 11.x 和 Chrome 13.x 中,它都按预期工作。

    在 FireFox 4 中确实没有显示图像。我收到一条消息'Helaas hebben we hier geen beelden van ',意思是Unfortunately we don't have any imagery of this

    OpenLayers 有 2 个全屏示例:

    1. http://openlayers.org/dev/examples/fullScreen.html
    2. http://openlayers.org/dev/examples/fullScreen2.html

    也许您可以将这些作为起点,然后添加 Google 图层,看看是否有什么不同。

    或者,您可以尝试从 Google Maps V3 示例开始,然后将其设为全屏。它可以让你在 4 个谷歌地图基础层之间切换,类似于你想要做的。

    目前我没有时间亲自尝试这些事情,但我希望这可以帮助您找到解决问题的方法。

    【讨论】:

    • 感谢您抽出宝贵时间,Wouter。我设法使我的示例工作。
    • 对不起。不小心按了 Enter。 :) 这就是我所做的:我已将 OpenLayers.js 的链接从 openlayers.org/api/OpenLayers.js 更改为 openlayers.org/dev/OpenLayers.js 。 IE。我已经从稳定版切换到开发版。显然,这是一个错误(我只是在 bugtracker 中没有找到它),并且它已在开发 OpenLayers 中修复。我想我将不得不切换到它......再次感谢你。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多