2012-04-18 48 views
6

Tôi đang sử dụng Bản đồ Bing với Ajax và tôi có khoảng 80.000 vị trí để thả đinh ghim vào. Mục đích của tính năng này là cho phép người dùng tìm kiếm nhà hàng ở Louisiana và nhấp vào đinh ghim để xem thông tin kiểm tra sức khỏe.Cách xử lý số lượng lớn pushpins trong Bản đồ Bing

Rõ ràng là không tốt lắm khi có 80.000 chân trên bản đồ cùng một lúc, nhưng tôi đang cố gắng tìm ra giải pháp tốt nhất cho vấn đề này. Một vấn đề khác là khoảng cách giữa các địa điểm này là rất nhỏ (Tất cả 80.000 là ở Louisiana). Tôi biết tôi có thể sử dụng phân cụm để tránh làm lộn xộn bản đồ, nhưng có vẻ như điều đó vẫn sẽ gây ra vấn đề về hiệu suất.

Điều tôi hiện đang cố gắng thực hiện chỉ đơn giản là không hiển thị bất kỳ ghim nào cho đến một mức thu phóng nhất định và sau đó chỉ hiển thị các chân trong chế độ xem hiện tại. Cách tôi hiện đang cố gắng làm điều đó là sử dụng sự kiện viewchangeend để tìm mức thu phóng và ranh giới của bản đồ và sau đó truy vấn cơ sở dữ liệu (thông qua dịch vụ web) cho bất kỳ điểm nào trong phạm vi đó.

Có vẻ như tôi đang đi sai đường này. Có cách nào tốt hơn để quản lý lượng dữ liệu lớn này không? Nó sẽ là tốt hơn để cố gắng để tải tất cả các điểm ban đầu và sau đó có các dữ liệu trên tay mà không cần phải nhấn dịch vụ web của tôi mỗi khi bản đồ di chuyển. Nếu vậy, làm thế nào tôi sẽ đi về nó?

Tôi chưa thể tìm thấy câu trả lời cho câu hỏi của mình, điều này thường có nghĩa là tôi đang đặt câu hỏi sai. Nếu bất cứ ai có thể giúp tôi tìm ra câu hỏi đúng, nó sẽ được đánh giá cao.

+0

Nếu bạn đang cố gắng hình dung rằng nhiều điểm dữ liệu, có lẽ đinh ghim không phải là cách tốt nhất để làm điều đó. Bạn đã từng nghĩ đến việc sử dụng bản đồ nhiệt? –

+0

Cảm ơn bạn đã bình luận! Tôi đã không nghĩ về điều đó, nhưng sau khi kiểm tra nó ra, tôi không nghĩ rằng nó sẽ làm việc cho kịch bản của tôi bởi vì người dùng cần để có thể chọn một vị trí cá nhân và được đưa đến một trang thông tin cho vị trí đó. Tôi sẽ chỉnh sửa câu hỏi của mình để làm rõ hơn. – Justin

Trả lời

9

Vâng, tôi đã thực hiện một cách tiếp cận hơi khác với điều này. Nó chỉ là một bài tập thú vị, nhưng tôi hiển thị tất cả dữ liệu của tôi (khoảng 140.000 điểm) trong Bản đồ Bing bằng cách sử dụng canvas HTML5.

Trước đây tôi tải tất cả dữ liệu cho khách hàng. Sau đó, tôi đã tối ưu hóa quá trình vẽ rất nhiều mà tôi đã đính kèm nó vào sự kiện "Viewchange" (điều này kích hoạt tất cả thời gian trong quá trình thay đổi chế độ xem).

Tôi đã viết blog về điều này. Bạn có thể kiểm tra nó here.

Ví dụ của tôi không có tương tác trên đó nhưng có thể dễ dàng thực hiện (nên là một chủ đề hay cho bài đăng trên blog). Do đó, bạn có thể xử lý các sự kiện theo cách thủ công và tự tìm kiếm các điểm tương ứng hoặc nếu số điểm cần vẽ và/hoặc mức thu phóng nằm dưới ngưỡng nào đó, hãy hiển thị đinh ghim thông thường.


Dù sao, một lựa chọn khác, nếu bạn đang không bị giới hạn Bing Maps, là sử dụng những cầu thủ như Leaflet. Nó cho phép bạn tạo một Lớp Canvas là một lớp dựa trên nền gạch nhưng được hiển thị ở phía máy khách bằng cách sử dụng canvas HTML5. Nó mở ra một loạt các khả năng mới. Kiểm tra ví dụ this bản đồ trong GisCloud.


Một tùy chọn khác, mặc dù phù hợp hơn với dữ liệu tĩnh, đang sử dụng kỹ thuật được gọi là UTFGrid. Các chàng trai đã phát triển nó chắc chắn có thể là explain nó tốt hơn tôi, nhưng nó quy mô cho nhiều điểm như bạn muốn với một hiệu suất fenomenal. Nó bao gồm việc có một lớp gạch với thông tin của bạn, và một tệp tin json đi kèm với một cái gì đó giống như một tệp "ascii-art" mô tả các tính năng trên các ô. Sau đó, sử dụng thư viện có tên là wax, nó cung cấp các sự kiện chuột, nhấp chuột hoàn chỉnh trên thư viện mà không có bất kỳ tác động hiệu suất nào.

Tôi cũng có blogged về điều đó.

+0

Thú vị khái niệm, tôi đã thực sự làm một cái gì đó rất giống với một ứng dụng bản đồ mái, nơi vải được sử dụng để hiển thị kích thước chi tiết (chiều dài phong cách vẽ, góc vv) trên đầu trang của bản đồ. Tuy nhiên, vấn đề với cách tiếp cận này là phần tử canvas bây giờ nhận được tất cả các sự kiện con trỏ được sử dụng để đi đến bản đồ. Không có sự kiện con trỏ thuộc tính css chuẩn nào: không ai có thể giải quyết điều này nhưng nó không được hỗ trợ trong một số trình duyệt, đặc biệt là IE. Đang cố gắng để vượt qua các sự kiện bằng tay trong javascript chỉ có vẻ như một mớ hỗn độn. Tôi muốn được quan tâm để biết nếu bạn biết một cách để giải quyết điều này. –

+0

Trên thực tế, các sự kiện trực tiếp đến bản đồ. Bạn đã xem video mà tôi đã hiển thị chưa? Tất cả các zoom và chảo được xử lý trực tiếp bởi Bing Maps. – psousa

+0

Ahh tôi thấy những gì bạn đang làm. Bạn đã chèn canvas vào bản đồ div trong khi tôi vừa đặt nó lên trên bản đồ div. Tuy nhiên, ngay cả với cách tiếp cận của bạn, canvas vẫn sẽ ở trên cùng của các phần tử bản đồ khác như đinh ghim mà người dùng có thể thêm vào sau đó. Tôi cho rằng người ta có thể làm một cái gì đó thông minh như cố gắng để chèn vải trên đầu trang của các lát bản đồ nhưng bên dưới các yếu tố bản đồ khác như đinh ghim hoặc hình dạng, nhưng âm thanh đó giống như một cơn đau để thực hiện một cách chính xác. Dù sao +1;) –

3

Tôi nghĩ rằng phân cụm sẽ là đặt cược tốt nhất của bạn nếu bạn có thể sử dụng nó. Bạn nói rằng bạn đã thử sử dụng clustering nhưng nó vẫn gây ra vấn đề hiệu suất? Tôi đã thử nghiệm nó với 80000 điểm dữ liệu tại V7 Interactive SDK và dường như nó hoạt động tốt. Kiểm tra nó ra cho mình bằng cách vào liên kết và có sự thay đổi trong Load module - clustering tab:

TestDataGenerator.GenerateData(100,dataCallback); 

để

TestDataGenerator.GenerateData(80000,dataCallback); 

sau đó nhấn vào nút Run. Hiệu suất có vẻ chấp nhận được với tôi với nhiều điểm dữ liệu.

+0

Thành thật mà nói, tôi đã không thử nghiệm điều đó. Tôi không chỉ quan tâm đến hiệu suất của việc vẽ nó trên bản đồ, mà còn với việc nhấn vào dịch vụ web và tải từ cơ sở dữ liệu. Tôi đã nghĩ rằng tôi đã tiếp cận vấn đề một cách sai lầm, nhưng nó thực sự có thể làm việc. Cảm ơn đã giúp đỡ! (Tôi mới ở đây và tôi chưa có 15 điểm danh tiếng, vì vậy tôi không thể +1 câu trả lời của bạn ... Xin lỗi). – Justin

Các vấn đề liên quan