2013-03-22 134 views
3

我是OpenLayers的新手,並且試圖找出如何限制用戶可以平移和向外縮放的量。對於此應用程序,用戶在地圖中選擇一個本地區域,然後單擊一個按鈕說明使用該區域,我們希望它們不能在該範圍外移動或縮小。單擊按鈕時,我使用map.GetExtent()將maxRestrictedExtent和maxExtent設置爲當前範圍。我也通過調用map.getResolution()將maxResolution設置爲當前分辨率。平移完美運行,但縮放不能。用戶仍然能夠縮小通過給定的分辨率。OpenLayer Map限制平移和縮放

我已經添加了代碼,每當範圍發生變化時,都會打印出當前的範圍和分辨率。在第6個區域更改中,我設置了上面列出的三個地圖屬性並打印出設置。這使我可以從完整的世界視圖放大到足夠的本地化區域進行測試。在第6次更改範圍時,我用鼠標滾輪縮小並查看選定的範圍和分辨率。在單擊鼠標滾輪縮小圖像時,下一個打印輸出清楚地顯示分辨率確實比map.maxResolution設置大,我可以看到可視區域大於所選區域。我已經嘗試了很多東西,包括設置maxExtent,但似乎沒有任何東西導致最大可縮放範圍受到限制。如果我喜歡的話,我可以再一次放大到全屏視圖。

下面您可以看到我已經編寫的測試代碼,該代碼通過導航控件和OSM圖層實例化地圖,然後註冊地圖的moveend事件,創建一個回調函數,完成我所描述的操作,最後最大程度地放大。

有沒有人有一個想法,我應該做什麼不同,以限制縮小到最大程度上選擇的能力?我希望我不必手動將範圍手動調整回最大範圍內,但如果是這種情況,至少知道這將有所幫助。

P.S. - 不幸的是,整個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> 

回答

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]) 
} 
+0

我可以看到有很多東西要學。新的地理以及。根據您的最小/最大分辨率,我可以看到您將您的分鐘設置爲比您的最大分辨率更大的數字。這有點令人困惑,因爲當我第一次帶着控制檯運行我的頁面時,我得到了19567.87923828125的分辨率,當我最終達到第六個範圍的改變時,我約在4.x左右。地圖似乎告訴我,我越接近分辨率越低。 – bmahf 2013-03-22 16:07:08

+0

剛剛談到一位地理學同事說,分辨率通常以米/像素爲單位來衡量,這意味着當我非常接近時,我將一個像素中顯示的米數少一些,甚至小於1,而且非常小遠非如此,我將在一個像素中顯示更多數量的米,這是我所看到的。所以我不明白爲什麼minResolution會被設置爲比maxResolution更大的數字。 – bmahf 2013-03-22 16:19:05

+0

分辨率是以像素爲單位的地圖單位的寬度/高度 - 例如,如果將150英里劃分爲 乘以512像素,則分辨率爲0.29296875。如果您使用的是平鋪緩存服務器,則需要指定緩存平鋪的分辨率(以及設置 serverResolutions屬性,該屬性指定在服務器上將分片緩存爲 的分辨率)。否則,您通常只需定義numZoomLevels即可指定 您想要的縮放級別。 – 2013-03-22 17:15:59

0

所以這裏是我的答案。經過多次搜索,發佈和發送電子郵件後,我發現有人告訴我一個簡單的答案。我已經註冊了「移動」事件,捕捉所有程度的動作,以便我可以看看發生了什麼。答案是隻在類中聲明一個私有的int變量(maxZoomLevel),當地圖第一次繪製時它的值爲零,因爲我正在繪製世界視圖來開始,然後設置爲當前的縮放級別當用戶點擊按鈕時,getZoom()會選擇當前要使用的區域。那麼接下來的「moveend」事件的記錄是這樣的:

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

由於世界觀是0,和地面大部分的觀點是19,那麼如果當前視圖是小於最大(所選擇的縮放級別),我們只是放大到最大。

This works great。當我滾動鼠標縮小圖像時,我閃爍了一下,通過了最大選擇的縮放級別,但不再縮小通過它。此外,這種方法並不要求我在地圖圖層中添加分辨率數組,或者在地圖上設置最大/最小分辨率。 (希望我可以擺脫閃爍......嗯!)