1

http://www.gisdoctor.com/v3/mapserver.htmlのコードに従って、API v3 を使用して Google マップに WMS を画像としてオーバーレイします。上記のリンクの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での議論に従うと、未加工の (単一の) 画像をリクエストしたほうがよいようですマップサーバーから。これにより、サーバーへの負担が軽減されます。いずれにせよ、単一の画像で実験したいのですが、画像のリクエストを適切に作成できません。

具体的には、タイルのサイズを大きなものに変更しました。たとえば、1024 x 1024 のタイルを試しました。タイルの数は減りましたが、返された画像は Google マップのベース レイヤーの境界と一致しませんでした。

私が望むのは、タイルのサイズをまったく指定しないことです。代わりに、現在のマップ サイズよりも 256 ピクセル大きいタイル サイズを動的に計算する必要があります。そうすれば、マップのサイズに関係なく、単一の画像が返されます。また、マップの端に沿って余分な 256 ピクセルを使用して、シームレスなパンが実装されます。

提案?

4

2 に答える 2

0

私が他の誰かのために答えたばかりのこの同じ質問を参照してください。それはあなたの投影である可能性があります。EPSG:4326 は、Google マップの正しい投影法ではありません。投影法を変更すると、座標の計算方法と参照方法を変更する必要があります。

于 2014-05-27T05:10:54.583 に答える
0

1)それは私にとってはうまくいきます-512と1024でも。すべての適切な場所 (コーナー座標の計算、タイル サイズの設定、WMS パラメータの幅と高さの設定) を変更するだけです。コード内のすべての場所で正しく処理すれば、任意のタイル設定が可能になるはずです。

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

3) タイルの概念は正しいものであり、維持する必要があります。マップ全体を受信するようなことは機能しません。マップのパンを想像してみてください。車輪を再発明しようとせず、現在の Google タイルのコンセプトに固執しないでください。このタイプのアプリケーション用に最適化されています。マップを単一の画像として受け取る必要がある場合は、静的な Google マップ APIを使用できます。

于 2011-11-30T17:20:00.090 に答える