OpenLayersで2つの異なるプロジェクション(Spherical MercatorおよびWGS84)のベースレイヤーを使用する


9

2つの異なるプロジェクションを持つベースレイヤーを追加するにはどうすればよいですか?

異なるプロジェクション(EPSG:4326)のオーバーレイヤーを追加しましたが、さまざまなプロジェクションのベースレイヤーを追加する必要があります

  1. グーグルマップ
  2. EPSG:4326プロジェクションのベクターレイヤー

Googleマップですべてが正常に表示されますが、ベースレイヤーをEPSG:4326レイヤーに切り替えると、すべてが白になります。

window.onload = function init(){
                var lon = 84;
                var lat = 28;
                var zoom = 8;
                var url = "http://10.6.7.6/geoserver/wms";

                var mapControls = [
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher({'ascending':false}),                       
                    new OpenLayers.Control.ScaleLine(),
                    new OpenLayers.Control.MousePosition(),
                    new OpenLayers.Control.OverviewMap(),
                    new OpenLayers.Control.KeyboardDefaults()
                ];

                var map = new OpenLayers.Map(
                'map', 
                {       
                    numZoomLevels: 21,
                    projection: new OpenLayers.Projection("EPSG:900913"),
                    displayProjection: new OpenLayers.Projection("EPSG:4326"),
                    controls: mapControls 
                });


                var dsb = new OpenLayers.Layer.WMS( 
                "Nepal Border",
                url,                
                {layers: 'GisData:IR'}                        
            );  

                var gmap_gs = new OpenLayers.Layer.Google(
                "Google Streets",// the default 
                {'sphericalMercator': true}                 

            );




                var dG = new OpenLayers.Layer.WMS( 
                "2G Down Sites",
                url, 
                {layers: 'GisData:dG', transparent: "true",format: "image/png"},
                {
                    isBaseLayer: false,
                    buffer: 0
                });


                map.addLayers([dsb, dG,gmap_gs]);
                var proj = new OpenLayers.Projection("EPSG:4326");
                var point = new OpenLayers.LonLat(lon,lat);

                point.transform(proj, map.getProjectionObject());

                map.setCenter(point, zoom);

            }

回答:


5

私は最近これを調査しており、これは上位の検索結果の1つです。研究と実験にパンくずリストを追加すると思いました。

長短:

Open Layersの2.Xラインはこれをサポートしていません。マップ。中心、解像度、範囲などのプロパティは、マップのINITIALベースレイヤーによって設定されます。別のベースレイヤーに変更してもこれらのプロパティは調整されないため、結果は不明です。多くの場合、変更するベースレイヤーには無効な中心点/境界を取得するため、白いタイルが表示されます。しかし、それが常に結果となるわけではありません(たとえば、4326から900913に切り替えると、0degN、0degEに近いポイントに移動します)。

しかし、希望は失われません。

短期:

いくつかのパッチは、マップおよび多くのレイヤーに対してパッチを適用しようとするオープンレイヤーに対して作成されました([1]を参照)。これは6(6 !!!)年以上前に提出されたバグ[2]によるものです。独自のバージョンのOLをホストし、手動でパッチを適用する必要があります(パッチは最新バージョンに完全には適用されないため、手動で編集する必要があります)。非常に厄介で、すべてを処理するわけではありませんが、全体として、足の投影が異なる複数のベースレイヤーが必要な人がいます。

長期:

これは、OpenLayers 3.0が解決を望んでいることの1つです[3]。

一例は、ベースレイヤー/オーバーレイの二分法です。多くの場合、地図の解像度、maxExtentなどを設定する方法と場所を知ることは困難です。マップとレイヤー間の投影処理、および投影とmaxExtentやcenterのようなプロパティ間の相互作用は、せいぜい複雑です。

2.XのMapオブジェクトはベースレイヤーに過度に依存していたため、今後は変更されます。そのため、2013年の後半まで延期できる場合は、使用できる既製のソリューションがある可能性があります。

[1] http://trac.osgeo.org/openlayers/attachment/ticket/1249/NEW.Reproject.patch
[2] http://trac.osgeo.org/openlayers/ticket/1249
[3] http:/ /openlayers.org/blog/2012/11/14/why-are-we-building-openlayers-3/


1

ここにあなたの質問として何かがあります、OpenLayersでベースレイヤーを再投影する方法は? 変換に関する情報が表示されたら、球形メルカトルラスターイメージの作成をご覧ください

最初の投稿から簡単に要約すると:

  1. OpenLayersは(WFSのような)ベクターレイヤーを変換できます。
  2. ラスターレイヤーはOpenLayersでは変換できません。
  3. 優れたWMSであれば、再投影を実行できます。
  4. そのwkidはサポートされていないため、ArcGIS Serverは900913でレイヤーを提供できません。一方、3857、...!

そして2番目のリンクから:

球形メルカトル図法が非常に重要である理由の1つは、それがGoogleマップなどの商業レイヤーの上に画像データを正しくオーバーレイできる唯一の図法であることです。ラスタ画像を使用する場合、ブラウザでは、「シック」GISクライアントの場合と同じ方法で画像を再投影することはできません。代わりに、すべての画像が同じ投影法である必要があります。球状メルカトル投影タイルを作成する方法は、画像の生成に使用しているソフトウェアによって異なります。

重要なことはここにあります:

using raster images, in the browser, it is not possible to reproject the images
in the same way it might be in a thick GIS client.

そして、データセットを変換するために、私の答えはこれについてここで助けることができます

お役に立てば幸いです...


私は、オーバーレイには機能するが、2つの異なるベースレイヤーには機能しないproj4jsを使用してコードを追加しましたか?
金華城

1

900913への参照を含まないWMSレイヤーを設定します(データが4326にあると想定)。次に、レイヤーをOpenLayersに追加するときに、マップの投影を900913に設定していることを確認してください(または、最初にGoogleマップを追加していることを確認してください)。次に、WMSレイヤーを追加すると、OpenLayersがマッププロジェクション(900913)のデータをリクエストし、GeoServerが4326から900913にその場で再投影します。


コードを追加しました。これらのレイヤーを切り替えるときに問題があります。最初にWGS 4326を含むレイヤーをベースレイヤーとしてロードし、ズームレベルを維持すると、Googleレイヤーに切り替えてマップを少しパンした後、問題はありません。
金華城

map.addLayers([dsb、dG、gmap_gs]);を変更します。to map.addLayers([gmap_gs、dsb、dG]);
イアンタートン

最初の読み込み時にグーグルマップを表示しますが、それでもレイヤーを切り替えることができません。切り替え中のエラー
金華城

0

OpenLayersがベースレイヤーからマップの投影を設定するため、これは一般的に不可能です。

考えられる回避策の1つは、GeoServerのようなカスケードWMSを使用して、ベースレイヤーの1つを別のプロジェクションに再投影することです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.