WMS作为Google Maps v3中的单个图块图像

时间:2011-06-21 12:42:12

标签: google-maps-api-3 wms

我正在关注http://www.gisdoctor.com/v3/mapserver.html处的代码,以使用API​​ v3将WMS作为图像叠加在Google地图上。上述链接的js代码如下

"WMSGetTileUrl" : function(tile, zoom) {
    var projection = map.getProjection();
    var zpow = Math.pow(2, zoom);
    var ul = new google.maps.Point(
        tile.x * 256.0 / zpow, 
        (tile.y + 1) * 256.0 / zpow
    );
    var lr = new google.maps.Point(
        (tile.x + 1) * 256.0 / zpow, 
        tile.y * 256.0 / zpow
    );
    var ulw = projection.fromPointToLatLng(ul);
    var lrw = projection.fromPointToLatLng(lr);

    var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();

    return url = "http://url/to/mapserver?" + 
        "version=1.1.1&" + 
        "request=GetMap&" + 
        "Styles=default&" + 
        "SRS=EPSG:4326&" + 
        "Layers=wmsLayers&" + 
        "BBOX=" + bbox + "&" + 
        "width=256&" + 
        "height=256&" + 
        "format=image/png&" + 
        "TRANSPARENT=TRUE";
},

"addWmsLayer" : function() {

    /*
    Creating the WMS layer options. This code creates the Google 
    imagemaptype options for each wms layer. In the options the function 
    that calls the individual wms layer is set 
    */
    var wmsOptions = {
        alt: "MapServer Layers",
        getTileUrl: WMSGetTileUrl,
        isPng: false,
        maxZoom: 17,
        minZoom: 1,
        name: "MapServer Layer",
        tileSize: new google.maps.Size(256, 256)
    };

    /*
    Creating the object to create the ImageMapType that will call the WMS 
    Layer Options. 
    */
    wmsMapType = new google.maps.ImageMapType(wmsOptions);
    map.overlayMapTypes.insertAt(0, wmsMapType);
},

一切正常,但是,当然,WMS返回为256 x 256个图块。没有惊喜,因为这是我要求的。但是,在http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/c22837333f9a1812/d410a2a453025b38的讨论之后,似乎我可能会更好地从mapserver请求一个未经处理的(单个)图像。这会减少我的服务器。在任何情况下,我都想尝试使用单个图像,但我无法正确构建一个图像。

具体来说,我将瓷砖的尺寸改为大的;例如,我尝试了1024 x 1024个瓷砖。我确实获得了更少的图块,但返回的图像与Google地图基础图层边界不匹配。

我想要的是根本不指定瓷砖尺寸。相反,我应该动态地计算出瓷砖尺寸,比如当前地图尺寸大256个像素。这样,无论地图大小如何,都会返回单个图像。此外,无缝平移将在地图边缘额外256px的帮助下实现。

建议?

2 个答案:

答案 0 :(得分:0)

1)它对我有用 - 也有512和1024。您只需在所有适当的位置进行更改(角坐标计算,tileSize设置,WMS参数宽度和高度设置)。如果您只是在代码中的所有位置正确处理,则应该可以设置任何图块。

2)我认为你正试图在错误的地方进行优化。已建立256x256瓷砖是有原因的。请记住,谷歌正在缓存切片,因此对于较大的切片,整个解决方案可能会慢得多。此外,地图将为用户加载更快。

3)瓷砖概念是正确的,应予以保留。接收整个地图之类的东西是行不通的 - 想象一下地图平移。没有尝试重新发明轮子并坚持使用当前的谷歌瓷砖概念 - 它针对此类应用进行了优化。如果您需要将地图作为单个图像接收,则可以使用静态Google地图api

答案 1 :(得分:0)

same question我刚才为别人回答。这很可能是你的预测。 EPSG:4326不是Google地图的正确预测。更改投影意味着您需要更改计算和引用坐标的方式。