2

マップ範囲をマップの初期範囲に制限し、ユーザーが一定範囲以上にパンできないように制限したいと考えています。

私は以下を試しましたが、何も変わっていません:

map = new Map( "map" , {
        basemap: "gray",    
        center: [-85.416, 49.000],
        zoom : 6,
        logo: false,
        sliderStyle: "small"
    });


    dojo.connect(map, "onExtentChange", function (){
    var initExtent = map.extent;
    var extent = map.extent.getCenter();
    if(initExtent.contains(extent)){}
    else{map.setExtent(initExtent)}
    });
4

3 に答える 3

2

サイモンの答えをいくらか肉付けして、例を挙げてください。理想的には、 と同じスコープで 2 つの変数が必要ですmap

initExtent有効な範囲の境界を保存し、

validExtentパン中に見つかった最後の有効な範囲を保存して、そこに戻ることができるようにします。

この例では、新しいdojo.onイベント構文も使用しました。ドキュメントの推奨に従って、これに移行することをお勧めします。ESRI は古いスタイルをいつか廃止すると思います。

var map;
var validExtent;
var initExtent;

[...]

    require(['dojo/on'], function(on) {
        on(map, 'pan', function(evt) {
            if ( !initExtent.contains(evt.extent) ) {
                console.log('Outside bounds!');
            } else {
                console.log('Updated extent');
                validExtent = evt.extent;
            }
        });

        on(map, 'pan-end', function(evt) {
            if ( !initExtent.contains(evt.extent) ) {
                map.setExtent(validExtent);
            }
        });
    });

ズーム イベントで同じことを行うか、extent-changeすべてをトラップする場合に使用できます。君による。

于 2014-03-19T00:40:57.510 に答える
1

エクステント変更関数は、初期エクステント変数をマップの現在のエクステントに設定し、そのエクステントに現在のエクステントの中心点が含まれているかどうかを確認しているようです-もちろん常にそうです。

代わりに、マップ変数の同じスコープで initExtent を宣言します。次に、ロード時イベントを変更して、ローカル変数ではなく、このグローバル スコープ変数を設定します。エクステント変更関数では、initExtent の値を更新しないでください。initExtent に現在のエクステント全体が含まれていることを確認してください。

または、現在のエクステントの各境界を initExtent の各境界と比較することもできます。たとえば、initExtent.xmin < map.extent.xmin であり、ある場合は、超過した境界を initExtent 値に設定する新しいエクステントを作成します。

唯一の問題は、これらの手法では initExtent を一時的に超えることができますが、エクステント変更関数が起動して追いつくと、エクステントが元に戻ることです。

于 2014-03-18T23:08:39.070 に答える
0

この質問への回答として、最初にこのソリューションを gis.stackexchange に投稿しました: https://gis.stackexchange.com/a/199366

その投稿のコードサンプルは次のとおりです。

//This function limits the extent of the map to prevent users from scrolling 
//far away from the initial extent.
function limitMapExtent(map) {
    var initialExtent = map.extent;
    map.on('extent-change', function(event) {
        //If the map has moved to the point where it's center is 
        //outside the initial boundaries, then move it back to the 
        //edge where it moved out
        var currentCenter = map.extent.getCenter();
        if (!initialExtent.contains(currentCenter) && 
            event.delta.x !== 0 && event.delta.y !== 0) {

            var newCenter = map.extent.getCenter();

            //check each side of the initial extent and if the 
            //current center is outside that extent, 
            //set the new center to be on the edge that it went out on
            if (currentCenter.x < initialExtent.xmin) {
                newCenter.x = initialExtent.xmin;
            }
            if (currentCenter.x > initialExtent.xmax) {
                newCenter.x = initialExtent.xmax;
            }
            if (currentCenter.y < initialExtent.ymin) {
                newCenter.y = initialExtent.ymin;
            }
            if (currentCenter.y > initialExtent.ymax) {
                newCenter.y = initialExtent.ymax;
            }
            map.centerAt(newCenter);
        }
    });
}

そして、これが動作するjsFiddleの例です: http://jsfiddle.net/sirhcybe/aL1p24xy/

于 2016-06-21T20:33:03.147 に答える