2011-06-21 8 views
0

API v3を使用してGoogleマップに画像としてWMSをオーバーレイするコードはhttp://www.gisdoctor.com/v3/mapserver.htmlです。Googleマップv3の単一のタイル画像としてのWMS

"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); 
}, 

を次のように上記のリンクでjsのコードがあるすべてはもちろん、WMSは、256×256のタイルとして返され、正常に動作しますが、。それは私が要求したものなので、驚きはありません。しかし、http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/c22837333f9a1812/d410a2a453025b38での議論に続いて、私はmapserverから離散した(単一の)イメージを要求するほうが良いかもしれないようです。これは私のサーバーには負担が少なくなります。いずれにしても、私は単一のイメージを試してみたいと思いますが、正しくイメージを作成することはできません。

具体的には、タイルのサイズを大きく変更しました。たとえば、1024 x 1024のタイルを試しました。タイル数は少なくなりましたが、返された画像はGoogle Mapsの基本レイヤーの境界と一致しませんでした。

タイルサイズを一切指定しないことをお勧めします。代わりに、現在のマップサイズより256ピクセル大きくなるように、タイルサイズを動的に把握する必要があります。そうすることで、地図のサイズに関係なく、1つの画像が返されます。また、シームレスなパンは、地図の端に沿って余分な256ピクセルの助けを借りて実装されます。

提案?

+0

解決方法を見つけましたか? Weather Undergroundの人々は、このアプローチをマッピングに使用しています:http://www.wunderground.com/wundermap/たぶんそのうちの1人がこれを見てジャンプします:) – malonso

答えて

0

1)それは私のために働きます - 512と1024もあります。あなたは、すべての適切な場所(コーナー座標計算、tileSize設定、WMSパラメータ幅&高さ設定)で変更を行うだけです。タイルの設定は、コード内のすべての場所で正しく処理すれば可能です。

2)私はあなたが間違った場所で最適化しようとしていると思います。 256x256のタイルが理由で確立されています。 Googleがタイルをキャッシュしていることを忘れないでください。大きなタイルを使用すると、ソリューション全体がはるかに遅くなる可能性があります。また、マップはユーザーのためにより速く読み込まれます。

3)タイルのコンセプトは正しいものであり、保存する必要があります。地図全体を受け取るようなことはうまくいかず、地図のパンを想像してみてください。ホイールを再開発して現在のGoogleタイルのコンセプトに固執しようとしないでください。このタイプのアプリケーションに最適化されています。地図を単一の画像として受信する必要がある場合は、の静的なGoogleマップapiを使用できます。

0

これを参照してくださいsame question私はちょうど誰か他の人に答えました。それはあなたの予測である可能性が高いです。 EPSG:4326はGoogleマップの正しい投影法ではありません。投影を変更すると、座標の計算方法と参照方法を変更する必要があります。

関連する問題