Các lựa chọn thay thế OpenLayers hỗ trợ nhiều tính năng phía máy khách hơn [đã đóng]


14

Tôi đang xem xét các kiến ​​trúc khác nhau cho một hệ thống sẽ sử dụng lý tưởng kết xuất phía máy khách cho các tính năng điểm và phải không có plugin. Tôi đã sử dụng ứng dụng này được phát triển để trả lời câu hỏi này để kiểm tra máy tính xách tay của tôi (khá có khả năng - lõi tứ 2,6 ghz, bộ nhớ 4 gb, không thuộc bất kỳ tải nào khác, Firefox 8) với số lượng điểm khác nhau trong OpenLayers và nó đáng chú ý là tụt lại ở mức 500 và bắt đầu vật lộn hơn 1.000. Các tính năng được tạo ngẫu nhiên dường như không có bất kỳ trình xử lý sự kiện nào và tất cả đều sử dụng cùng một hệ thống ký hiệu.

Tôi hy vọng sẽ hiển thị tới 1.000 tính năng, với tối đa 10 biểu tượng khác nhau, tất cả đều có trình xử lý nhấp chuột và chuột và trên các nền tảng ít khả năng hơn.

Tôi đã hy vọng cho hiệu suất phía máy khách tốt hơn, đặc biệt là sau khi xem ví dụ về Đám mây GIS này - tôi biết nó hoạt động khác nhau (canvas HTML5 so với SVG) nhưng sự khác biệt về hiệu suất thực sự rất đáng chú ý.

Các câu hỏi chính của tôi (nếu bạn sẽ rất tử tế) là:

  1. Là ứng dụng tạo điểm ngẫu nhiên đại diện cho hiệu suất trong các ứng dụng OpenLayers khác mà bạn đã viết / sử dụng?
  2. Có API ánh xạ web thay thế đã được chứng minh và miễn phí hỗ trợ các dịch vụ WMS (mà tôi cần sử dụng) và nhanh hơn với các tính năng phía máy khách, mà không cần sử dụng Flash / Silverlight / bất kỳ plugin nào khác không?
  3. Bất kỳ đề nghị khác về những gì tôi nên được điều tra?

Dựa chủ yếu vào kết xuất phía máy chủ là một tùy chọn nhưng cả tôi và khách hàng đều muốn tránh điều này do lo ngại về việc tăng số lượng người dùng và khả năng phản hồi của UI.


Trên lõi kép 5 năm tuổi, máy tính để bàn RAM 3gb sử dụng ứng dụng đó trên Firefox 8 (trong khi tải xuống bản phân phối ISO 1gb Linux), 1.000 điểm rút ra khá nhiều ngay lập tức, không phải vật lộn ... 10.000 mất khoảng 1,5 giây.
dùng2856

@LukePinner chỉ là vẽ nhanh * và xoay / thu phóng mượt mà? Lấy dữ liệu và vẽ các tính năng cũng tốt đối với tôi, nhưng đó là vấn đề tương tác bản đồ.
tomfumb

Tôi vừa thử ứng dụng của bạn trên ipad2 và nó xử lý 1000 điểm rất tốt. Với 10 nghìn điểm, phải mất vài giây để hiển thị ban đầu, nhưng sau đó nó xử lý khá tốt. Nếu bạn muốn, bạn luôn có thể phân lớp lớp OL Vector và thực hiện một lớp tùy chỉnh. Tôi có thể chỉ cho bạn một ví dụ.
unicoletti

Có, không có vấn đề panning / phóng to. Điểm 1K làm chậm khá nhiều trên netbook 1.6ghz Atom của tôi :)
user2856

Câu trả lời:


23

Trả lời câu hỏi thứ 1 là . Bạn đang sử dụng OL với cấu hình khá phổ biến. Có những mẹo bạn có thể sử dụng để cải thiện hiệu suất, tôi sẽ nói về vấn đề đó sau.

Trả lời cho câu hỏi 2 là có thể (đặc biệt là liên quan đến độ bền). Bạn có thể tìm kiếm trang web này để xem danh sách các lựa chọn thay thế (một trong những điều cần chú ý ngay bây giờ là Tờ rơi ).

Trả lời cho câu hỏi 3: bắt đầu với việc đo lường:

Tôi đã chỉnh sửa một bản sao cục bộ của ứng dụng để trình kết xuất được chỉ định rõ ràng trong danh sách tùy chọn cho lớp Vector. Trong các thử nghiệm, tôi sẽ bỏ qua trình kết xuất Canvas và sau đó tải lại trang thử nghiệm với một trang khác:

var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});

Tôi đã thêm một bộ đếm thời gian cho chức năng vẽ lại để nó in ra bao nhiêu thời gian nó đã vẽ :

function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");

Sau đó, tôi đã thử một vài lần chạy trên cả Chrome 17 và Firefox 8.0.1 trên OSX SL, vẽ 1000 và 5000 tính năng. Thật ngạc nhiên, trình kết xuất SVG nhanh hơn trung bình 20% so với trình kết xuất Canvas! (Lưu ý: trên Windows js thời gian không chính xác như trong OSX nên kết quả có thể ít nhất quán hơn).

Điều này và nói của bạn rằng

đó là sự tương tác bản đồ đó là vấn đề

, IMHO, cho chúng tôi biết rằng điểm nóng nằm trong việc xử lý các tính năng của Vector. Trong khi làm việc trên một ứng dụng của tôi, gần đây tôi đã xem xét nó và quyết định phân lớp nó và sau đó loại bỏ tất cả các mã phức tạp không sử dụng cho các điểm đơn giản. Phải thừa nhận rằng tôi đã khá hoang dã và thậm chí đã loại bỏ sự phụ thuộc vào OpenLayers.Geometry.Point và phiên bản của tôi bây giờ hoạt động trên các đối tượng js đơn giản với các thuộc tính x, y.

Các tùy chọn của bạn là, theo thứ tự lợi ích / chi phí:

Tùy chọn đầu tiên là lọc phía máy chủ điểm nhìn thấy bằng cách định cấu hình tùy chọn chiến lược cho lớp vectơ như sau:

 strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],

Cách này khi bạn phóng to số lượng các tính năng được vẽ phía máy khách sẽ bị giới hạn ở những mức độ hiển thị ở mức độ đó, thay vì tất cả.

Là tùy chọn thứ hai, bạn có thể cân nhắc viết một Vector / Renderer tùy chỉnh . Một ví dụ về tùy chỉnh, tước xuống, triển khai nhanh hơn có sẵn trên trang github của tôi ở đây . Mặc dù không phù hợp với mọi mục đích sử dụng, nhưng nó cũng đủ để đưa ra ý tưởng sơ bộ về những gì tôi đang đề xuất.

Tùy chọn thứ ba khi người dùng được thu nhỏ hoàn toàn là triển khai một số loại tính năng phân cụm phía máy chủ để các điểm gần được hợp nhất thành một điểm duy nhất, một lần nữa làm giảm số lượng tính năng được vẽ.


Rất cám ơn đã trả lời chi tiết và kỹ lưỡng. Tôi rất có thể sẽ xem xét phân cụm phía máy chủ, hy vọng kết hợp với chiến lược lưu trữ để hoạt động chỉ xảy ra khi cần thiết. Một trong các tùy chọn cho phía máy chủ là MapGuide, vì vậy cách tiếp cận để truy xuất và phân cụm các điểm có thể hoàn toàn tùy chỉnh. Tôi cũng sẽ có một cuộc chơi xung quanh với các tùy chọn kết xuất để xem sự khác biệt của nó.
tomfumb

1
Tôi đã thêm một liên kết đến một ví dụ vector / canvas mà tôi sử dụng trong một proj của tôi.
unicoletti

Wow, ví dụ lột xuống tạo ra sự khác biệt lớn, điều đó thực sự ấn tượng. Tôi đã đi từ vật lộn với 1.000 tính năng để bay với 10.000
tomfumb

Tôi đã sửa đổi ví dụ đầu tiên (swingley.appspot.com) để sử dụng trình kết xuất OL Canvas và phần bổ sung vững chắc cho các điểm, và hiệu suất thu phóng và pan thực sự rất giống với TagCanvas & TagVector của bạn. Tôi cũng đã triển khai lại chức năng kiểm tra lần truy cập mà bạn đã xóa trong các sửa đổi của mình để tôi có thể kiểm tra hiệu suất so sánh - phương pháp Tag * nhanh hơn khoảng 20% ​​trong việc xác định tính năng nào bị tấn công (trong số 5000). Với nỗ lực đáng kể trong việc viết / cập nhật các lớp tùy chỉnh và hiệu suất tương tự (trong các thử nghiệm của tôi), tôi nghĩ tôi sẽ thấy những gì vanilla OL có thể làm
tomfumb

Đó là bởi vì hit-test vẽ lại tất cả các tính năng vào một khung vẽ khác, do đó chúng được vẽ hai lần với mỗi lần làm mới.
unicoletti

0

Sử dụng UTFGridTileMill, bạn có thể hiển thị điểm không giới hạn với hiệu suất khá tốt. Hiển thị n điểm ngẫu nhiên là một ví dụ giả định sẽ không hoạt động trong tình huống đó hoặc với GISCloud hoặc bất kỳ phép thuật tương tự nào - vì việc hack hiệu suất vectơ thường đòi hỏi kiến ​​thức về bộ dữ liệu đầy đủ và một số xử lý trước: cả TileMill và GISCloud đều làm ốp lát rất nhiều.

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.