【问题标题】:How to reproject layers (using GeoServer and OpenLayers) in order to overlay on the google maps如何重新投影图层(使用 GeoServer 和 OpenLayers)以覆盖在谷歌地图上
【发布时间】:2013-01-16 19:39:00
【问题描述】:

我正在使用 OpenLayers 编写代码。在这段代码中,我想以不同的缩放级别显示不同的图层。直到这里,一切正常。当我尝试将谷歌地图添加为基础层时,我的问题就开始了。我的图层的投影系统与 Google 图层不一致,因此应重新投影。我尝试使用 Proj4js.transform 方法,但没有成功。我的图层位于 EPSG:3006(瑞典),Google 图层位于 EPSG:900913。以下代码导致投影层向右移动。这意味着重新投影没有正常工作。 请让我知道我的代码有什么问题。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>OpenLayers map preview</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <!-- Import OL CSS, auto import does not work with our minified OL.js build -->
    <link rel="stylesheet" type="text/css" href="http://gisl.nateko.lu.se:8088/geoserver/openlayers/theme/default/style.css">
    <!-- add here more css definition libraries-->

         <!-- Basic CSS definitions -->
    <style type="text/css">
        body {
            font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
            font-size: small;
        }
        /* Toolbar styles */
        #toolbar {
            position: relative;
            padding-bottom: 0.5em;
            display: none;
        }
        /* The map and the location bar */
        #map {
            clear: both;
            position: relative;
            width: 337px;
            height: 512px;
            border: 2px solid black;
        }            
        #wrapper {
            width: 337px;
            height: 50px;                           
        }            
        #location {
            float: right;
            font-family: Arial, Verdana, sans-serif; 
            font-size: 12px; 
            color: #483D8B;
            background-color: white;
        }            
        #scale {
            float:left;
            font-family: Arial, Verdana, sans-serif; 
            font-size: 12px; 
            color: #483D8B;
            background-color: white;
        }
        #nodelist{
            font-family: Arial, Verdana, sans-serif; 
            font-size: 14px; 
            color: #000000;
            font-style: normal;
            background-color: white;
        }
    </style>
    <!-- Import OpenLayers, reduced, wms read only version -->
    <script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script>      
    <!-- add here more js libraries -->




    <script src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>
    <script src ='proj4js/lib/proj4js-combined.js'></script>
    <script src ='proj4js/lib/deprecated.js'></script>

    <script defer="defer" type="text/javascript">
        var map;
        var untiled;
        var tiled;
        var pureCoverage = false;
        // pink tile avoidance
        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;


        // make OL compute scale according to WMS spec
        OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;



        function init(){



            format = 'image/png';


            var options = {
                controls: [],
                projection: new OpenLayers.Projection('EPSG:900916'),
                displayProjection: new OpenLayers.Projection('EPSG:4326'),
                maxExtent: new OpenLayers.Bounds(           
                -20037508, -20037508,20037508, 20037508.34),
                //modify parameter
                maxResolution: 5000,
                //modify parameter
                //setting zoom levels
                numZoomLevels:15,
                units: 'm',

            };
            map = new OpenLayers.Map('map', options);
            // setup tiled layer

                var gphy = new OpenLayers.Layer.Google(
                "Google Physical",
                {type: google.maps.MapTypeId.TERRAIN, numZoomLevels: 15, sphericalMercator:true}
                // used to be {type: G_PHYSICAL_MAP}
                );
                var gmap = new OpenLayers.Layer.Google(
                    "Google Streets", // the default
                    {numZoomLevels: 15, sphericalMercator:true}
                    // default type, no change needed here
                );
                var ghyb = new OpenLayers.Layer.Google(
                    "Google Hybrid",
                    {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 15, sphericalMercator:true}
                    // used to be {type: G_HYBRID_MAP, numZoomLevels: 20}
                );
                var gsat = new OpenLayers.Layer.Google(
                    "Google Satellite",
                    {type: google.maps.MapTypeId.SATELLITE, 
                    numZoomLevels: 15, 
                    sphericalMercator:true

                    }
                    // used to be {type: G_SATELLITE_MAP, numZoomLevels: 22}
                );

            //add controls here
                map.addControl(new OpenLayers.Control.LayerSwitcher());
                map.addControl(new OpenLayers.Control.LayerSwitcher());
                map.addControl(new OpenLayers.Control.PanZoomBar());
                zf= new OpenLayers.Control.ZoomToMaxExtent({title:"Zoom to max extent"});
                // create a panel to locate the zoom extent button & add the panel to the map
                // use the code to create the button from ZoomToMaxExtent.js
                var panel= new OpenLayers.Control.Panel({defaultControl:zf});       
                panel.addControls([zf]);
                map.addControl(panel);
                map.addControl(new OpenLayers.Control.Navigation());
                map.addControl(new OpenLayers.Control.Scale($('scale')));
            //end add controls


            layer2 = new OpenLayers.Layer.WMS( 
                "Gr2LundKom:districts","http://gisl.nateko.lu.se:8080/geoserver/wms", 
                {
                    projection: map.displayProjection,
                    height: '600',
                    width: '800',
                    layers: 'Gr2LundKom:districts',
                    styles: '',
                    srs:'EPSG:3006',
                    format: format,
                    tiled: 'true',
                    transparent: 'true',

                }, 
                {
                    buffer: 0,
                    displayOutsideMaxExtent: true,
                    isBaseLayer: false,
                    reproject: true
                });
                Proj4js.defs["EPSG:3006"] = "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs";
                Proj4js.defs["EPSG:4326"] = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
                var src = new OpenLayers.Projection('EPSG:3006');
                var dst =  new OpenLayers.Projection('EPSG:4326');
                Proj4js.transform(src, dst, layer2); 
                layer2.projection=dst;                  

            layer3 = new OpenLayers.Layer.WMS( 
                "Gr2LundKom:public_buildings,other_buildings,roads_all,Public_Libraries",
                "http://gisl.nateko.lu.se:8080/geoserver/wms",
                {
                    projection: map.displayProjection,
                    height: '600',
                    width: '800',
                    layers: "Gr2LundKom:public_buildings,other_buildings,roads_all,Public_Libraries",
                    transparent: "true", 
                    styles: '',
                    srs:'EPSG:3006',
                    format: format,
                    tiled: 'true',
                    transparent: 'true'
                }, 
                {
                    buffer: 0,
                    displayOutsideMaxExtent: true,
                    isBaseLayer: false,
                    reproject: true                     
                });
                Proj4js.transform(src, dst, layer3);
                layer3.projection=dst;                  

            map.addLayers([gsat,gphy,gmap,ghyb,layer2]);
            //map.setCenter(new OpenLayers.LonLat(1335967.698, 6179172.362), 22);
            map.zoomToExtent(new OpenLayers.Bounds(         
                -20037508, -20037508,20037508, 20037508.34));

            // change the dislapy layers with the chandge of scale
            map.events.register('zoomend', this, function (event) {
            var zLevel = map.getZoom();     
                if( zLevel == 1 || zLevel == 2 || zLevel == 3  )
                {
                    layer3.setVisibility(false);
                    layer2.setVisibility(true);
                }
                if( zLevel == 4 || zLevel == 5 || zLevel == 6)
                {
                    layer2.setVisibility(false);
                    layer3.setVisibility(true);
                    map.addLayers([gsat,gphy,gmap,ghyb,layer3]);
                }

                });

        }









    </script>
    </head>     
<body onload="init()">
    Map viewer using Geoserver and MapLayers
    <br><br>


        <div id="map">
        </div>
        <br>
        <div id="wrapper">
            <div id="location">location</div>
            <br>
            <div id="scale">
            </div>
        </div>

        <br>
        <div id="nodelist" >
            --> Click on the map to get feature info
        </div>
 </body>

【问题讨论】:

    标签: javascript openlayers reprojection-error


    【解决方案1】:

    好吧,我知道这是一种解决方法,但我看到您使用 geoserver,因此您可以将 geoserver 中的图层转换为 google mercator(您应该使用代码 EPSG:3857,因为我记得 EPSG:900916 不起作用为了我)。我也在这个问题上苦苦挣扎,这是唯一对我有帮助的事情。 然而,这个问题只有在你使用 wms、wfs 层时才会出现,你可以轻松地进行转换。

    而且我认为你不应该尝试在 EPSG:4326 中可视化所有内容,而是在 google mercator 中可视化。

    我希望这会有所帮助。

    【讨论】:

    • 主要问题是我的参考系统不是普通的SRS,所以首先我应该把它转换成你提到的投影系统或大地测量系统之一。但怎么可能呢?我应该使用 Proj4js 库还是 GeoServer 自己做!!!!当我尝试使用 layer2.transform(src, dst) 时,它返回错误“对象没有变换方法”......
    • 好的,我是这样做的:转到geoserver管理控制台,然后到图层并单击您的图层(例如地区),然后在“Native SRS”输入EPSG:3006(我假设你已经这样做了),但在“声明的 SRS”类型 EPSG:3857 并在 SRS 处理选择强制声明。之后重新计算坐标,它就准备好了。还有一件事:在您的 openlayers 文件中,您必须使用 EPSG:3857 而不是 EPSG:900916(无论如何它是同一个系统)
    【解决方案2】:

    我想你这里有一个错字,应该是 EPSG:900913 而不是 EPSG:900916,因为它是 google 用数字 (900913) 的表示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多