3

私はOpenLayersを初めて使用し、ユーザーがパンして外側にズームできる量を制限する方法を見つけようとしています。このアプリケーションでは、ユーザーが地図内のローカルエリアを選択し、そのエリアを使用するように指示するボタンをクリックします。その範囲外にパンしたり、ズームアウトしたりできないようにする必要があります。ボタンがクリックされると、map.GetExtent()を使用してmaxRestrictedExtentとmaxExtentの両方を現在のエクステントに設定しています。また、map.getResolution()を呼び出して、maxResolutionを現在の解像度に設定しています。パンは完全に機能しますが、ズームは機能しません。ユーザーは、指定された解像度を超えてもズームアウトできます。

エクステントが変更されるたびに、現在のエクステントと解像度を出力するコードを追加しました。6番目のエクステントの変更で、上記の3つのマッププロパティを設定し、設定を印刷します。これにより、全世界のビューから、テストに十分なローカライズされた領域にズームインできます。6番目の範囲の変更で、マウスホイールでズームアウトし、選択された範囲と解像度を確認します。マウスホイールを1回クリックしてズームアウトすると、次の印刷出力は、解像度がmap.maxResolutionの設定よりも実際に大きいことを明確に示しており、表示可能領域が選択した領域よりも大きいことがわかります。maxExtentの設定など、さまざまなことを試しましたが、ズーム可能な最大範囲が制限される原因は何もないようです。必要に応じて、もう一度全世界ビューにズームアウトできます。

以下に、ナビゲーションコントロールとOSMレイヤーを使用してマップをインスタンス化し、マップのmoveendイベントに登録して、説明したことを実行するコールバック関数を作成し、最後に最大範囲までズームする、私が作成したテストコードを示します。 。

選択した最大範囲までズームアウトする機能を制限するために、私が別の方法で何をすべきかについて誰かが考えていますか?手動で範囲を最大範囲内に戻す必要がないことを望んでいますが、その場合は、少なくともそれが役立つことを知っています。

PS-残念ながら、スタイルの直前からスタイルの直前まで、およびファイナルの直後からHTMLとして処理されているため、html全体が表示されません。本当に欠けているのは、本体のonloadイベントでinit()を呼び出すことだけです。

<style type="text/css">    
    html, body {
        width: 100%;
        height: 100%;
        margin: 0;         
    }
    #map {
        width: 100%;
        height: 100%;
        margin: 0;         
    } 
</style>

<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">

var map;
var num;

function init(){
    map = new OpenLayers.Map('map', { controls: [] });       
    map.addControl(new OpenLayers.Control.Navigation());       
    map.addLayer(new OpenLayers.Layer.OSM());

    map.events.register("moveend", this, function (e) {
        if (num == 5)
        {
            map.maxExtent = map.getExtent();
            map.restrictedExtent = map.maxExtent;
            map.maxResolution = map.getResolution();
            console.log(num++ + ": Setting maxExtent/restrictedExtent: " + map.maxExtent + "; resolution: " + map.maxResolution);
        }
        else
        {
            console.log(num++ + ": Changed to extent: " + map.getExtent() + "; resolution: " + map.getResolution());
        }
    });

    num = 0;
    map.zoomToMaxExtent();
}
</script>

4

2 に答える 2

0

これが私の答えです。何度も検索し、投稿し、電子メールを送った後、簡単な答えを教えてくれた人を見つけました. 私はすでに「moveend」イベントに登録しており、すべてのエクステントの動きをキャプチャして、何が起こっているのかを調べることができました。答えは、クラスでプライベート int 変数 (maxZoomLevel) を宣言することでした。これは、開始するワールド ビューを描画しているため、マップが最初に描画されたときにゼロの値を持ち、現在のズーム レベルに設定されます。ユーザーがボタンをクリックした時点で getZoom() を実行し、作業する現在の領域を選択します。したがって、「moveend」イベントの登録は次のようになります。

    map.events.register("moveend", this, function (e) {
        if (map.getZoom() < maxZoomLevel)
        {
            map.zoomTo(maxZoomLevel);
        }
    });

ワールド ビューは 0 で、一番下のビューは 19 であるため、現在のビューが最大値 (選択したズーム レベル) よりも小さい場合は、最大値にズームします。

これはうまくいきます。マウスをスクロールして、選択した最大ズームレベルを超えてズームアウトしているときに少しちらつきますが、それを超えてズームアウトしなくなりました。また、この方法では、マップ レイヤーに解像度配列を追加したり、マップに最大/最小解像度を設定したりする必要はありませんでした。(ちらつきが消えればいいのに…うーん!)

于 2013-03-25T20:50:32.390 に答える
0

私はまさにあなたがやりたいことをやったところです、そしてそれは私のために働いています.

マップを作成するとき、最小/最大解像度を指定しています

  map = new OpenLayers.Map('map_element', {
    minResolution: 0.02197265625,
    maxResolution: 0.00274658203125
});

レイヤーを追加するときは、serverResolutions のリストも指定します。

    var tilecache_disk_layer = new OpenLayers.Layer.TileCache("TileCache Layer",
        ["http://" + tilecache_host + "/tilecache/"],
        "basic",
        {
         serverResolutions: [0.703125, 0.3515625, 0.17578125, 0.087890625, 
                        0.0439453125, 0.02197265625, 0.010986328125, 
                        0.0054931640625, 0.00274658203125, 0.001373291015625, 
                        0.0006866455078125, 0.00034332275390625, 0.000171661376953125, 
                        0.0000858306884765625, 0.00004291534423828125, 0.000021457672119140625]
        },
        {wrapDateLine: 'true'},
        {isBaseLayer: true}
    );

次の JavaScript は、サーバーにリクエストを送信してマップ パラメータを取得します。

  if (site_coords == undefined) {
    coordinates = sendHttpRequest("http://" + tile_host + "/ManagerApp/mapView?position=true");
    mapParameters = coordinates.split(",");       
    map.setCenter(new OpenLayers.LonLat(mapParameters[0], mapParameters[1]));
    map.minResolution = mapParameters[2];
    map.maxResolution = mapParameters[3];
    zoom_level = mapParameters[4];
    map.restrictedExtent = new OpenLayers.Bounds(mapParameters[5], mapParameters[6], mapParameters[7], mapParameters[8])
}
于 2013-03-22T15:28:10.967 に答える