Openlayers TMS地图瓷砖位置不好

时间:2016-05-28 07:05:36

标签: openlayers tms

我从Google贴图网址获取png地图(http://mt {0123} .google.com / vt / lyrs = m& hl = fr& x =!x& y =!y& z =!z )使用bigmap2(http://bigmap.osmz.ru/)与缩放和边界框坐标,我使用以下命令准备该地图并获取图块:

对于此示例,边界框为-11.250000,36.597889,16.875000,52.482780,png尺寸为1280 x 1024。

gdalinfo map.png

gdal_translate -of VRT -a_srs EPSG:4326 -gcp 0 0 -11.250000 52.482780 -gcp 1280 0 16.875000 52.482780 -gcp 1280 1024 16.875000 36.597889 map.png map.vrt

gdalwarp -of VRT -s_srs EPSG:4326 -t_srs EPSG:3857 map.vrt map2.vrt

python gdal2tiles-multiprocess.py --zoom = 4 map2.vrt

我也试过使用debian包中的“standard”gdal2tiles.py。

这将生成一个文件夹,其中包含包含切片的子文件夹和使用openlayers的网页查看器。

在该页面上,主图层来自openstreetmap,我的TMS图层显示为叠加层。

对于“小”地图,我没有问题但是对于欧洲或世界TMS层位置较差的大区域,层向上移动(参见附件),而OSM层是好的。

以下是我使用的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
      <head>
        <title>map2.vrt</title>
        <meta http-equiv='imagetoolbar' content='no'/>
        <style type="text/css"> v\:* {behavior:url(#default#VML);}
            html, body { overflow: hidden; padding: 0; height: 100%; width: 100%; font-family: 'Lucida Grande',Geneva,Arial,Verdana,sans-serif; }
            body { margin: 10px; background: #fff; }
            h1 { margin: 0; padding: 6px; border:0; font-size: 20pt; }
            #header { height: 43px; padding: 0; background-color: #eee; border: 1px solid #888; }
            #subheader { height: 12px; text-align: right; font-size: 10px; color: #555;}
            #map { height: 95%; border: 1px solid #888; }
        </style>
        <script src="http://www.openlayers.org/api/2.7/OpenLayers.js" type="text/javascript"></script>
        <script type="text/javascript">
            var map;
            var mapBounds = new OpenLayers.Bounds( -11.25, 36.5978889026, 16.874999903, 52.48278);
            var mapMinZoom = 5;
            var mapMaxZoom = 7;

            // avoid pink tiles
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
            OpenLayers.Util.onImageLoadErrorColor = "transparent";

            function init(){
            var options = {
                controls: [],
                numZoomLevels: 7,
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326"),
                units: "m",
                maxResolution: 156543.0339,
                maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34)
                };
            map = new OpenLayers.Map('map', options);


            // create OSM/OAM layer
            var osm = new OpenLayers.Layer.TMS( "OpenStreetMap",
                "http://tile.openstreetmap.org/",
                { type: 'png', getURL: osm_getTileURL, displayOutsideMaxExtent: true, attribution: '<a href="http://www.openstreetmap.org/">OpenStreetMap</a>'} );
            var oam = new OpenLayers.Layer.TMS( "OpenAerialMap",
                "http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/",
                { type: 'png', getURL: osm_getTileURL } );

            // create TMS Overlay layer
            var tmsoverlay = new OpenLayers.Layer.TMS( "TMS Overlay", "",
                {   // url: '', serviceVersion: '.', layername: '.',
                    type: 'png', getURL: overlay_getTileURL, 
                    isBaseLayer: false
                });
            if (OpenLayers.Util.alphaHack() == false) { tmsoverlay.setOpacity(0.7); }

            map.addLayers([osm, tmsoverlay]);

            var switcherControl = new OpenLayers.Control.LayerSwitcher();
            map.addControl(switcherControl);
            switcherControl.maximizeControl();

            map.zoomToExtent( mapBounds.transform(map.displayProjection, map.projection ) );

            map.addControl(new OpenLayers.Control.PanZoomBar());
            map.addControl(new OpenLayers.Control.MousePosition());
            map.addControl(new OpenLayers.Control.MouseDefaults());
            map.addControl(new OpenLayers.Control.KeyboardDefaults());
        }

        function osm_getTileURL(bounds) {
            var res = this.map.getResolution();
            var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
            var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
            var z = this.map.getZoom();
            var limit = Math.pow(2, z);

            if (y < 0 || y >= limit) {
                return "http://www.maptiler.org/img/none.png";
            } else {
                x = ((x % limit) + limit) % limit;
                return this.url + z + "/" + x + "/" + y + "." + this.type;
            }
        }

        function overlay_getTileURL(bounds) {
            var res = this.map.getResolution();
            var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
            var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
            var z = this.map.getZoom();

            if (mapBounds.intersectsBounds( bounds ) && z >= mapMinZoom && z <= mapMaxZoom ) {
               //console.log( this.url + z + "/" + x + "/" + y + "." + this.type);
               return this.url + z + "/" + x + "/" + y + "." + this.type;
            } else {
               return "http://www.maptiler.org/img/none.png";
            }
        }       

       function getWindowHeight() {
            if (self.innerHeight) return self.innerHeight;
            if (document.documentElement && document.documentElement.clientHeight)
                return document.documentElement.clientHeight;
            if (document.body) return document.body.clientHeight;
                return 0;
        }

        function getWindowWidth() {
            if (self.innerWidth) return self.innerWidth;
            if (document.documentElement && document.documentElement.clientWidth)
                return document.documentElement.clientWidth;
            if (document.body) return document.body.clientWidth;
                return 0;
        }

        function resize() {  
            var map = document.getElementById("map");  
            var header = document.getElementById("header");  
            var subheader = document.getElementById("subheader");  
            map.style.height = (getWindowHeight()-80) + "px";
            map.style.width = (getWindowWidth()-20) + "px";
            header.style.width = (getWindowWidth()-20) + "px";
            subheader.style.width = (getWindowWidth()-20) + "px";
            if (map.updateSize) { map.updateSize(); };
        } 

        onresize=function(){ resize(); };

        </script>
      </head>
      <body onload="init()">
        <div id="header"><h1>map2.vrt</h1></div>
        <div id="subheader">Generated by <a href="http://www.maptiler.org/">MapTiler</a>/<a href="http://www.klokan.cz/projects/gdal2tiles/">GDAL2Tiles</a>, Copyright &copy; 2008 <a href="http://www.klokan.cz/">Klokan Petr Pridal</a>,  <a href="http://www.gdal.org/">GDAL</a> &amp; <a href="http://www.osgeo.org/">OSGeo</a> <a href="http://code.google.com/soc/">GSoC</a>
        <!-- PLEASE, LET THIS NOTE ABOUT AUTHOR AND PROJECT SOMEWHERE ON YOUR WEBSITE, OR AT LEAST IN THE COMMENT IN HTML. THANK YOU -->
        </div>
        <div id="map"></div>
        <script type="text/javascript" >resize()</script>
      </body>
    </html>

我读了很多关于openlayers但是找不到帮助我的东西。

我不明白为什么,对于一些地图它可以工作,而不是为其他地方而我用同样的方式制作瓷砖。

我是初学者,谢谢你的帮助。

enter image description here

0 个答案:

没有答案