下に新しいマップを追加する代わりに、既存のマップを上書きするにはどうすればよいですか(OpenLayers)?

ピトラコジュニア

オンとオフを切り替えることができるいくつかのレイヤーを使用してWebマップを作成しようとしています。最初は問題なくマップが描画されますが、レイヤーをオフに切り替えようとすると、既存のマップの下に新しいマップが追加されます(マップを置き換えるのではありません)。

レイヤーをオフに切り替えると、javascriptのrefresh()関数が呼び出されます。この関数は、描画するレイヤーのリストを再構築してから、マップを構築する関数を再度呼び出す必要があります。これで既存のマップが置き換えられることを期待していましたが、代わりに新しいマップが下に追加されます。

...
...
<script type="text/javascript" src="ol.js"></script>        

<script defer="defer" type="text/javascript">

    function onLOAD()
    {
        var my_layers = 'layer_1,     \
                         layer_2,     \
                         layer_3,     \
                         ...'
        init(my_layers);
    }


    function init(my_layers){

        //The bounding box of Lund:lund_address_point
        var extent = [13.1267,55.6770,13.2601,55.7597];

        //Initial view
        var view = new ol.View({
                   center: ol.proj.transform([13.192927, 55.708944], 'EPSG:4326', 'EPSG:3857'),
                   zoom: 13
                   });              

        //The source for the layers
        var wmsSource = new ol.source.ImageWMS({
                        url: 'http://localhost:8080/geoserver/Test/wms',
                        params: {
                                 'LAYERS': my_layers
                                },
                        serverType: 'geoserver'
                        });             
                        
        //OpenStreetMap background and my_layers
        var layers = [
                      new ol.layer.Tile({
                          source: new ol.source.OSM()
                          }),
                      new ol.layer.Image({
                         source: wmsSource
                          })
                      ];
        
        //Bind the map object to our "map" div and add some extra functionality
        var map = new ol.Map({
                  layers: layers,
                  controls: ol.control.defaults({
                            attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
                                 collapsible: false
                          })
                  }).extend([
                        //Extra functionality of the map
                        //Control for displaying coordinates
                        new ol.control.MousePosition({
                             coordinateFormat: ol.coordinate.createStringXY(4),
                             projection: 'EPSG:4326',
                             className: 'custom-mouse-position',
                             target: document.getElementById('location'),
                             undefinedHTML: '&nbsp;'
                        }),
                        //Control for displaying a scale line
                        new ol.control.ScaleLine({
                            target: document.getElementById('scale-line')
                        }),
                        //Control for zooming to a defined extent
                        new ol.control.ZoomToExtent({
                            extent: ol.proj.transform(extent, 'EPSG:4326', 'EPSG:3857')
                        })
                  ]),
                  target: 'map',
                  view: view
        });

    }

    
    function refresh(){
      my_layers='';
      if (layer_1.checked) my_layers = my_layers + "layer_1,";
      if (layer_2.checked) my_layers = my_layers + "layer_2,";
      if (layer_3.checked) my_layers = my_layers + "layer_3,";
      ...  
      if (my_layers.length > 1){
        my_layers = my_layers.substring(0,my_layers.length-1);
      }
      init(my_layers);
    }           
    
</script>
</head>     



<body onload="onLOAD()">

<div>
    <br><input type="checkbox" id="layer_1" value="layer_1" checked="checked" onClick="refresh()">Layer_1
    <br><input type="checkbox" id="layer_2" value="layer_2" checked="checked" onClick="refresh()">Layer_2
    <br><input type="checkbox" id="layer_3" value="layer_3" checked="checked" onClick="refresh()">Layer_3
    ...
    ...
</div>

<br>
<div id="map"></div>
<br>

<div id="wrapper">
    <div id="location"></div>
    <br>
    <div id="scale-line" class="scale-line"></div>
</div>

...
...
MoonE

古いマップをきれいに削除するにはmap.setTarget(null)、前のMapオブジェクトを呼び出す必要があります。

ただし、あなたの場合は、単一のマップのみを作成し、レイヤーの可視性を更新する方がよい場合があります。このようにして、ロードされたタイル、中央、ズームなどのマップ/ビューの状態が記憶されます。

<div>
    <br><input type="checkbox" id="input-osm" value="osm" checked="checked">OSM
    <br><input type="checkbox" id="input-image" value="image" checked="checked">Image
</div>

更新関数からアクセスできるように、init関数の外部でマップ変数とレイヤー変数を宣言します。

var map, layers;

レイヤーをオブジェクトに格納し、宣言されたレイヤー変数に割り当てて、名前でレイヤーを参照し、正しい可視性で初期化できるようにします。

layers = {
    osm: ol.layer.Tile({
        source: new ol.source.OSM(),
        visible: document.getElementById('input-osm').checked,
    }),
    image: new ol.layer.Image({
        source: wmsSource
        visible: document.getElementById('input-image').checked,
    })
};

以前に宣言された変数にすべてのレイヤーを含むマップを割り当てます。

map = new ol.Map({
    layers: Object.values(layers),
    ...

ユーザー入力レイヤーでは、チェックボックスに従って可視性を変更する必要があります。

function refresh(checkbox) {
    layers[checkbox.value].setVisible(checkbox.checked);
}
document.getElementById('input-osm').addEventListener('change', refresh);
document.getElementById('input-image').addEventListener('change', refresh);

幸運を祈ります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  2. 2

    ソートされた検索、ターゲット値未満の数をカウント

  3. 3

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    Reactでclsxを使用する方法

  7. 7

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  8. 8

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  9. 9

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  10. 10

    PowerShellの分割ファイルへのヘッダーの追加

  11. 11

    Chromeウェブアプリのウェブビューの高さの問題

  12. 12

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  13. 13

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  14. 14

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  15. 15

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  16. 16

    MLでのデータ前処理の背後にある直感

  17. 17

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  20. 20

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  21. 21

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

ホットタグ

アーカイブ