Hơn

Kết xuất Vectơ Openlayers

Kết xuất Vectơ Openlayers


Tôi vừa thêm một vài lớp vectơ được WFS hỗ trợ vào bản đồ và hiệu suất đã giảm. Trong khi gỡ lỗi điều này, tôi đã nhận thấy rằng các lớp mở đang xem xét mọi tính năng trong các lớp hiển thị khi kết xuất.

Nếu tôi phóng to ngay để chỉ có một vài đối tượng địa lý từ một vài lớp và sau đó nói xoay bản đồ lên một lượng nhỏ. Tôi mong đợi các trình mở sử dụng chỉ mục không gian để xác định các tính năng nào cần được hiển thị và chỉ hiển thị những tính năng đó.

Tuy nhiên, tôi thấy các kiểu dựa trên ngữ cảnh của mình được yêu cầu cung cấp thông tin về bộ ký hiệu cho mọi tính năng trong mọi lớp. Ví dụ. chức năng externalGraphic của tôi được gọi cho các đối tượng địa lý ở phía bên kia đất nước!

externalGraphic: function (f) {return map.zoom 

Khi thu nhỏ các lớp của tôi sẽ không hiển thị nhưng khi phóng to, đột nhiên có hàng nghìn đối tượng được xem xét. Có cách nào để khiến các lớp mở sử dụng một số bộ lọc khi kết xuất không? Tôi đã nghĩ đến việc thêm trình xử lý sự kiện thu phóng / xoay bản đồ để ánh xạ các đối tượng địa lý trong và ngoài các lớp bằng cách sử dụng bộ lọc không gian nhưng tôi khá chắc chắn rằng mình không cần phải làm điều đó.

Tôi không tin rằng thực tế là dữ liệu của tôi ban đầu đến từ nguồn WFS là vấn đề ở đây. Ứng dụng của tôi cũng chạy ngoại tuyến, dữ liệu sau khi truy xuất sẽ được lưu trữ cục bộ, việc truy xuất và tài nguyên cần thiết để giữ chúng trong bộ nhớ là tốt.

There must be a way of getting OL to apply some intelligence when rendering vector features when zoomed in, it shouldn't be even considering rendering features that are hundreds of miles away from the current bounds, this is triggering retrieval of images from either the local hệ thống tệp hoặc máy chủ khi tôi mức thu phóng chuyển từ biểu tượng chung sang hình ảnh cụ thể cho thiết bị chi tiết hơn.

Tổng cộng tôi có khoảng 5000 tính năng, đây phải là một số tiền nhỏ. Tôi đã giải quyết vấn đề này bằng cách xử lý các sự kiện di chuyển / thu phóng và ánh xạ các đối tượng địa lý của mình vào và ra khỏi các lớp bằng cách sử dụng cây quad từ thư viện riêng mà tôi đã viết cách đây nhiều năm và muốn di chuyển khỏi đó. Đây là một vụ hack xấu xí mà tôi cảm thấy khó tin rằng không có cách nào thanh lịch hơn để xử lý, tôi mong muốn cung cấp cho bản đồ các vectơ của mình và để nó quản lý chúng.


Ban đầu tôi sẽ xem xét việc tối ưu hóa lớp ở cấp máy chủ. Dưới đây là một số tùy chọn cần xem xét (nếu dữ liệu của bạn đến từ bảng GeoServer / PostGIS):

  • Sử dụng tùy chọn "Giới hạn tính năng theo yêu cầu" (trong web GeoServer) để giới hạn số lượng tính năng sẽ vẽ
  • Xác định chỉ mục không gian trên bảng (bảng PostGIS)

WFS không quá phù hợp để hiển thị trực tiếp - nó không xử lý tỷ lệ / thu phóng. Để cải thiện hiệu suất hiển thị vectơ phía máy khách, cần đảm bảo rằng (1) chỉ các tính năng trong chế độ xem được tải và hiển thị và (2) các tính năng được hiển thị được đơn giản hóa và tổng hợp phù hợp theo từng mức thu phóng.

Để giải quyết 1, lập chỉ mục không gian là một giải pháp. Đối với các lớp đối tượng lớn và phức tạp, Véc tơ lát gạch là một lựa chọn phù hợp hơn.

Để giải quyết vấn đề 2, định dạng dữ liệu nên mỏng để đảm bảo thời gian truyền nhanh qua web và khách hàng cũng phân tích cú pháp nhanh (ví dụ: GeoJSON trên GML khủng khiếp). Ngoài ra, bạn nên sử dụng kỹ thuật tổng quát hóa ở phía máy chủ để đơn giản hóa / tổng hợp dữ liệu cho từng lớp thu phóng. Hình học đơn giản thực sự nhanh hơn để chuyển và hiển thị.


Nếu bạn đang tham chiếu đến một tệp, bất kể nó được lập chỉ mục như thế nào hoặc ở định dạng nào, nó vẫn sẽ được tải xuống và bao gồm các tính năng không có trong cổng xem của bạn. Điều cần thiết trong trường hợp này là sử dụng phần mềm máy chủ bản đồ. Một máy chủ ô đã được đề xuất ở trên nhưng một máy chủ ô thường nằm giữa máy chủ bản đồ và người dùng. Hãy thử triển khai một cái gì đó như maperver, mapnik hoặc geoserver. Một chuỗi SO trò chuyện về họ: Mapnik, Mapserver hoặc Geoserver

Hệ thống như thế này hoạt động như thế nào:

1-từ giao diện người dùng của bạn, liền mạch trong các lớp mở, một yêu cầu được gửi tới máy chủ cho một lớp có giới hạn không gian địa lý thích hợp.

2-phần mềm máy chủ diễn giải yêu cầu và lấy tệp liên quan hoặc truy vấn bảng cơ sở dữ liệu thích hợp để thu thập dữ liệu "phù hợp" với cổng xem hiện tại của bạn

3-máy chủ bản đồ đảm bảo định dạng chính xác (png, kml, v.v.) và truyền trực tuyến đến trình duyệt

4-chức năng lớp mở của bạn sẽ đảm nhận việc hiển thị. tất nhiên, bạn sẽ cần phải viết mã một chút để đảm bảo rằng kiểu dáng của bạn, v.v. là những gì bạn muốn.

Vì vậy, bạn thấy đấy, chỉ dữ liệu bạn muốn được truy vấn và di chuyển qua kết nối web của bạn… không có tính năng, không có dữ liệu! Ngay cả khi bạn có một truy vấn về cơ bản chọn mọi thứ, bạn có thể định cấu hình đầu ra để có nhận biết mức thu phóng, vì vậy, ví dụ: thu phóng mức quốc gia sẽ không cung cấp dữ liệu bên đường.

Nếu bạn nặng về bản đồ / dữ liệu và đang tạo các trang web, học cách sử dụng máy chủ ánh xạ phía máy chủ là hoàn toàn xứng đáng. Cách đây không lâu khi chúng ta phải tạo ra các chương trình máy chủ lập bản đồ của riêng mình… về cơ bản đã biến GIS web trở thành miền của các lập trình viên, chứ không phải người lập bản đồ. Thực tế là ngày nay có những chương trình mạnh mẽ, miễn phí và có nhiều tính năng phong phú để làm điều này đối với chúng tôi là không thể tin được!


Tôi đã có thể thêm điều này như một bình luận nhưng vì tôi không có danh tiếng nên tôi nghĩ rằng tôi sẽ đặt nó như một câu trả lời. Tôi tin rằng cả đơn giản hóa và một số hình thức lập chỉ mục khoảng cách đều được sử dụng trong OpenLayers 3 để cải thiện hiệu suất vectơ. Có thể đáng để thử nếu bạn hiện đang sử dụng OL2. Nguồn http://www.slideshare.net/mobile/camptocamp/open-layers3


Xem video: 2019 - OpenLayers 6 - There And Back Again