Làm thế nào để xác định thứ tự lớp trong Openlayers?


28

Tôi có một lớp đánh dấu, hai lớp vector và hai lớp raster. Lớp đánh dấu được bao phủ bởi hai lớp raster.

Có cách nào để di chuyển lớp đánh dấu luôn lên trên không?

Đã chỉnh sửa: Thứ tự các chỉ mục Z hoạt động tốt trong lớp vectơ, nhưng khi tôi thêm một lớp raster WMS khác trên bản đồ với chỉ số Z thấp hơn, lớp raster vẫn bao phủ lớp vectơ.

Đã chỉnh sửa: Bất kỳ ai cũng có thể chỉ ra sự khác biệt của thứ tự kết xuất về mặt "Layer Index" và "Z-Index" của một lớp? Tôi nghĩ rằng chỉ số lớp xử lý theo thứ tự lớp phủ và Zindex xử lý thứ tự tính năng trong một lớp vectơ, phải không?


Tôi nghĩ layerindex và z-index là các thuật ngữ có thể hoán đổi cho nhau trong OpenLayers. Chúng được sử dụng trong cùng một bối cảnh trong tài liệu, ví dụ: dev.openlayers.org/release/OpenLayers-2.11/doc/apidocs/files/ Lỗi
Casey

Xin chào @Casey Tôi đánh giá cao ví dụ của bạn. Tuy nhiên, tôi không nghĩ rằng layerindex và z-index có thể hoán đổi cho nhau. Theo kinh nghiệm của riêng tôi, setZindex không hoạt động nhưng set Index hoạt động. Tôi nhận thấy rằng: 1. ví dụ chỉ mục Z trong openlayer hoạt động cho một tính năng trong lớp vectơ và nó được bật bởi rendererOptions: {zIndexing: true}. 2. Từ ví dụ của bạn cho lớp hình ảnh raster, bạn có thể thấy thứ tự kết xuất lớp dựa trên những gì bạn thấy trên điều khiển bản đồ, phụ thuộc vào chỉ mục lớp (dưới dạng mã câu trả lời của bạn). 3. Chỉ mục lớp được đặt theo thứ tự tôi thêm trên lớp mới (lớp dựa trên là 0 ...)
Đã xem

1. Tôi nghĩ bạn đúng. 2 & 3. Đúng, nhưng bạn có thể ghi đè hành vi mặc định bằng cách gọi phương thức setLayer Index, điều chỉnh chỉ số z của một lớp. Điều này sẽ ảnh hưởng đến thứ tự của các lớp trong điều khiển bản đồ và thứ tự vẽ của các lớp.
Casey

Câu trả lời:


24

Đặt chỉ mục z cho mỗi lớp sẽ giúp: http://www.openlayers.org/dev/examples/ordering.html

EDITED

Ví dụ ban đầu tôi liên kết đến không quá hữu ích. Bạn muốn đặt chỉ mục layerindex / z của các lớp, chứ không phải các nhà sản xuất trong các lớp (như ví dụ đặt hàng đã hiển thị). Tôi đưa ra một ví dụ (dựa trên ví dụ này ) hiển thị lập chỉ mục lớp tùy chỉnh. Lưu ý rằng khi bạn bật Raster Canada, lớp Marker vẫn ở trên cùng.

Đây là mã có liên quan:

map.setLayerIndex(dm_wms, 0); //set the image overlay to the bottom
map.setLayerIndex(markers, 99); //set the marker layer to an arbitrarily high layer index

Tài liệu về mã setLayer Index có tại đây: http://dev.openlayers.org/release/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayer Index


ví dụ liên kết đến một phần mềm độc hại.
Bazeda777

8

Bạn có thể làm điều đó, nếu bạn muốn lớp vectơ của bạn luôn đứng đầu với mã đơn giản ...

var vecLyr = map.getLayersByName('VectorLayer')[0];
map.raiseLayer(vecLyr, map.layers.length);

Có thể dễ dàng!


4

không có cách nào ở trên làm việc cho tôi, nhưng chỉ cần làm điều này bất cứ khi nào tôi thêm một lớp mới làm việc để giữ lớp đánh dấu của tôi ở trên cùng:

myMarkerLayer.setZ Index (1001);


Đây là câu trả lời duy nhất làm việc cho tôi quá. Không ai trong số những người khác làm việc.
Khóa Matthew

3

Bạn có thể nghĩ đến việc thêm một lớp vào bản đồ khi đặt một trang tính mới lên trên các trang hiện có. Nếu trang tính mới không minh bạch, nó sẽ ẩn tất cả những trang bên dưới.

Thật không may, OpenLayers không có phương thức insertLayerAt , vì vậy bạn phải sắp xếp lại các lớp của mình sau khi chèn. Giải pháp sau đó là thêm lớp và sau đó di chuyển nó xuống ngăn xếp đến độ sâu mong muốn hoặc di chuyển cái bạn muốn ở trên cùng trở lại đầu trang.

Bạn có thể làm như sau:

// add your wms as usual
var yourWMSLayer = new ....
map.addLayer(yourWMSlayer);

// you can do it both ways:
// 1. now move the markers to the top of the stack
var yourMarkers = map.getLayersByName("the marker layer name")[0];
map.setLayerIndex(yourMarkers, map.layers.length-1);

// 2. OR you move the WMS down
// this is more succint
map.setLayerIndex(yourWMSLayer, map.layers.length-2);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.