2012-06-24 30 views
8

Tôi đang cố gắng thiết lập OpenLayers để không hiển thị lớp vectơ ngay trước khi zoom bắt đầu và làm cho nó xuất hiện trở lại sau khi thu phóng kết thúc. Tôi có phần kết thúc thu phóng đã được thiết lập như sau:Trình mở JavaScript trước khi thu phóng trình xử lý sự kiện

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}}); 

function mapEvent(event) { 
    if(event.type == "zoomend") { 
     hide_vector_layer(); 
     } 
} 

Nhưng tôi không thấy bất kỳ loại người nghe sự kiện nào để bắt đầu thu phóng tài liệu. Có một "movestart" bao gồm di chuyển, panning và zoom. Thật không may, tôi không thể sử dụng "movestart" một, bởi vì tôi không muốn lớp biến mất trong một chảo. Bạn sẽ nghĩ rằng sẽ có một "zoomstart", vì có một "zoomend".

Lý do tôi đang cố thực hiện điều này, là vì tôi không thích cách lớp vectơ thu phóng với tốc độ khác khi sử dụng Google Maps làm lớp cơ sở. Có vẻ sai, có vẻ như tất cả các tính năng đều không chính xác, ngay cả khi chúng hạ cánh đúng nơi sau khi quá trình thu phóng hoàn tất.

Mọi đề xuất?

Trả lời

2

Vì mục đích này, bạn nên ghi đè lên các phương thức moveTo và moveByPx của OpenLayers.Map để loại bỏ sự kiện khởi động movestart cho bất kỳ hành động nào trừ thu phóng.

+0

Cảm ơn, điều đó có hiệu quả. – renosis

2

Tôi đã có cùng một vấn đề mà OP đã có, và tôi đã cố gắng giải quyết nó với giải pháp của drnextgis. Nhưng tiếc là nó không hoàn toàn hoạt động :: thuộc tính zoomChanged trong OpenLayers.Map.moveTo đánh giá thành true không chỉ khi mức thu phóng thay đổi mà còn khi bản đồ đã được thay đổi kích thước.

Bản đồ của tôi là 100% cửa sổ trình duyệt của người dùng, vì vậy nếu họ đổi kích thước cửa sổ, sự kiện sẽ được kích hoạt. Điều này là không mong muốn đối với tôi, vì tôi chỉ muốn kích hoạt sự kiện nếu mức thu phóng thực sự thay đổi. Giải pháp của tôi là tạo một sự kiện mới, được gọi là "zoomstart", mà tôi đã chèn ở đầu OpenLayers.Map.moveTo. Dưới đây là các mã:

var getZoom = this.getZoom(); 
if (!!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom) 
    this.events.triggerEvent("zoomstart", zoom); 

Mã này sẽ vượt qua mức zoom mới cho một người biết lắng nghe sự kiện được đăng ký để zoomstart, và trong trường hợp của tôi, tôi xác định restrictedExtent của bản đồ và làm công cụ khác dựa trên mức thu phóng mới.

Hòa bình với các bạn.

8

Đây là cách dễ dàng để thêm sự kiện 'BeforeZoom' vào OpenLayers. Chỉ cần thêm mã bên dưới vào nơi bạn đã tạo đối tượng bản đồ của mình.

map.zoomToProxy = map.zoomTo; 
map.zoomTo = function (zoom,xy){ 
    //Your Before Zoom Actions 

    //If you want zoom to go through call 
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom 
}; 

Làm thế nào các công trình này:

Đối với bất kỳ loại hoạt động phóng to, OpenLayers API cuối cùng gọi hàm gọi zoomTo. Vì vậy, trước khi ghi đè nó, chúng ta sao chép hàm đó thành một hàm mới gọi là 'zoomToProxy'. Chúng tôi ghi đè lên và thêm logic thu phóng có điều kiện của chúng tôi. Nếu chúng tôi muốn phóng to xảy ra, chúng tôi chỉ gọi chức năng proxy mới :)

+0

Cách tiếp cận này hoạt động, nhưng chỉ để an toàn hơn, bạn nên thay thế dòng bên trong hàm thành map.zoomToProxy.áp dụng (điều này, đối số); do đó, nếu họ thêm đối số mới để thu phóngĐể chúng cũng được truyền đi. – Hoffmann

+0

Ah Tôi cũng quên đề cập rằng API OpenLayers gọi zoomTo trước khi thực sự thực hiện thu phóng, vì vậy bạn có thể sử dụng mã trước nhận xét đầu tiên để thực hiện những việc như thể đó là sự kiện 'thu nhỏ'. Bạn có thể ngăn việc phóng to xảy ra chẳng hạn. – Hoffmann

+0

Ngay trên cả hai counts.Thanks! – Shaunak

0

Giải pháp "Shaunak" hoạt động rất tốt đối với tôi. Tôi muốn hạn chế thu phóng dưới 11 để chỉnh sửa mã của mình là

if (zoom > 11) { 
    map.zoomToProxy(zoom, xy); 
} 
+2

Điều này sẽ được đăng dưới dạng * nhận xét * về câu trả lời của Shaunak chứ không phải là câu trả lời riêng. – colllin

1

"movestart" xử lý "zoomstart". Để phát hiện xem có zoomstart không, hãy thử:

map.events.register("movestart",map, function(e) { 
     if(e.zoomChanged) 
     { 
     //zoom start code here 
     } 

    }); 
Các vấn đề liên quan