MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tìm các điểm gần LineString trong mongodb được sắp xếp theo khoảng cách

Như bạn đã đề cập, Mongo hiện không hỗ trợ bất kỳ thứ gì khác ngoài Point . Bạn đã xem qua khái niệm về một võ sĩ tuyến đường chưa? 1 Nó đã rất phổ biến một vài năm trở lại đây trên Google Maps. Với đường thẳng mà bạn đã vẽ, hãy tìm các điểm dừng nằm trong dist(x) . Nó được thực hiện bằng cách tạo một loạt các hộp giới hạn xung quanh mỗi điểm trong đường thẳng và tìm kiếm các điểm nằm trong nhóm.

Tôi tình cờ gặp câu hỏi của bạn sau khi tôi nhận ra rằng Mongo chỉ hoạt động với các điểm, tôi cho là hợp lý.

Tôi đã có một số tùy chọn về cách thực hiện (chúng mở rộng dựa trên những gì @mnemosyn nói trong nhận xét). Với tập dữ liệu mà tôi đang làm việc, tất cả đều ở phía máy khách, vì vậy tôi có thể sử dụng hộp định tuyến, nhưng tôi muốn triển khai nó ở phía máy chủ vì lý do hiệu suất. Đây là những đề xuất của tôi:

  1. ngắt LineString xuống các bộ tọa độ riêng lẻ của nó và truy vấn cho $near sử dụng từng thứ đó, kết hợp các kết quả và trích xuất một tập hợp duy nhất. Có những thuật toán để đơn giản hóa một đường phức tạp, bằng cách giảm số điểm, nhưng một thuật toán đơn giản thì dễ viết.

  2. làm tương tự như trên, nhưng dưới dạng một thủ tục / hàm được lưu trữ. Tôi chưa thử các chức năng được lưu trữ của Mongo và tôi không biết chúng hoạt động tốt như thế nào với trình điều khiển, nhưng điều này có thể nhanh hơn tùy chọn đầu tiên ở trên vì bạn sẽ không phải thực hiện các bước đi vòng và tùy thuộc vào máy tính. (các) phiên bản Mongo của bạn được (được) lưu trữ, các phép tính có thể nhanh hơn từng micro giây.

  3. Triển khai phương pháp tiếp cận routeboxer phía máy chủ (đã được thực hiện trong PHP), sau đó sử dụng một trong hai cách trên để tìm các điểm dừng $within các hộp giới hạn kết quả. Rất tiếc vì phương thức routeboxer trả về các hình chữ nhật, có thể hợp nhất tất cả các hình chữ nhật này thành một đa giác bao phủ tuyến đường của bạn và chỉ cần thực hiện $within trong vấn đề này. (Những gì @mnemosyn đề xuất).

  4. CHỈNH SỬA: Tôi đã nghĩ đến điều này nhưng quên mất nó, nhưng có thể đạt được một số điều ở trên bằng cách sử dụng khung tổng hợp.

Đó là điều mà tôi sẽ sớm thực hiện (hy vọng), tôi sẽ mã nguồn mở (các) kết quả của mình dựa trên đó mà tôi kết thúc.

CHỈNH SỬA: Tôi phải đề cập đến mặc dù 1 và 2 có một khuyết điểm là nếu bạn có 2 điểm trên một đoạn thẳng cách nhau 2km và bạn muốn các điểm nằm trong phạm vi 1,8km so với đoạn thẳng của mình, thì rõ ràng bạn sẽ bỏ lỡ tất cả các điểm giữa đoạn đó. của dòng của bạn. Giải pháp là đưa điểm vào dòng của bạn khi đơn giản hóa nó (tôi biết, đánh bại mục tiêu giảm điểm khi thêm lại những điểm mới vào).

Khi đó, sai sót với 3 là nó không phải lúc nào cũng chính xác vì một số điểm trong đa giác của bạn có thể có khoảng cách lớn hơn giới hạn của bạn, mặc dù sự khác biệt sẽ không phải là một tỷ lệ phần trăm đáng kể trong giới hạn của bạn.

[ 1 ] google maps utils routeboxer



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để nhập thư mục kết xuất vào cơ sở dữ liệu mongodb?

  2. Chèn nhiều tệp JSON vào MongoDB bằng python

  3. Trình điều khiển mongo sao băng có thể xử lý các toán tử $ each và $ position không?

  4. Làm cách nào để xóa _id trong MongoDB và thay thế bằng một trường khác làm Khóa chính?

  5. Hướng dẫn MongoDB BSON