Làm cách nào để lưu trữ hiệu quả tất cả dữ liệu OpenStreetMap theo cách được lập chỉ mục?


8

Tôi có tệp PBF chứa thông tin sau về một quốc gia:

  • Các nút, mỗi nút có kinh độ, vĩ độ và tính chất riêng; Được sử dụng để lưu trữ các điểm trong không gian 2D.

  • Các cách, mỗi thuộc tính của chúng, chúng được kết nối thông qua các nút; Dùng để lưu trữ đường xá, ranh giới.

Mặc dù tệp này chỉ có 80 MB ở dạng nén, nhưng nó là 592 MB khi không nén và được lưu trữ trong DB.

Vâng, và đó chỉ dành cho một quốc gia, Bỉ. Hãy tưởng tượng lưu trữ Pháp, Đức và Ý cùng với.


Ví dụ, hãy đi một đường cao tốc duy nhất, từ Antwerp qua Brussels đến Charleroi. Điều này sẽ bao gồm một tấn các nút để lưu trữ tất cả các ngã rẽ trên đường cao tốc, nhưng tôi có cần tất cả các ngã rẽ này không? Tôi nghi ngờ điều đó.

Hãy để tôi nói cho bạn biết những gì tôi muốn có thể làm:

  • Tôi muốn xem bản đồ ở các mức thu phóng khác nhau; các thành phố lớn, thành phố nhỏ và đường phố ít nhất.

  • Tôi muốn có thể có được thông tin định tuyến giữa hai điểm.

  • Tôi muốn có thể tính toán con đường gần nhất đến vị trí GPS của mình.

  • Tìm kiếm một vị trí, bằng một chỉ mục trong cơ sở dữ liệu.

Nhưng quan trọng nhất, cơ sở dữ liệu không nên quá lớn vì nó sẽ được lưu trữ trên thiết bị di động .


Vì vậy, tôi nghĩ về sự kết hợp của hai kỹ thuật:

  • Gạch hình ảnh cho mục đích xem, để làm việc xung quanh lưu trữ / xử lý tất cả các nút riêng lẻ.

  • Lưu trữ các điểm cuối của đường để định tuyến thông tin, cùng với thông tin về đường.

Vấn đề với điều này là tôi không thể tính đường gần nhất đến vị trí GPS của mình chỉ bằng thông tin này; hãy tưởng tượng rằng một khúc cua trên đường cao tốc, tôi không thể xác định rằng tôi đang ở trên đường cao tốc chỉ với hai điểm cuối. Tôi đã suy nghĩ về việc lưu trữ các nút trung gian giữa các điểm cuối nhưng điều đó sẽ rất tốn kém để tạo ra, tôi nghĩ vậy. Ngoài ra, việc xác định điểm cuối của các con đường (giống như phân chia T) rất có thể không dễ dàng như tôi cần để biết liệu tôi có cần lưu trữ điểm giữa ở đầu phân chia T đó hay không.

Vì vậy, xem là dễ dàng sử dụng gạch hình ảnh; nhưng tôi không thể tìm thấy một cách dễ dàng để thực hiện định tuyến và tìm vị trí GPS, tôi nên xem xét loại kỹ thuật lưu trữ nào? Tôi thấy hơi bất tiện khi một 80 MBtệp biến thành cơ sở dữ liệu 592 MB, tôi muốn giảm kích thước đó càng nhiều càng tốt ...

Tôi có thể làm gì để làm điều này hiệu quả nhất có thể? Về mặt đĩa và CPU. Tôi đang nhắm mục tiêu một WP7 ...


bao nhiêu trong số 580MB là dữ liệu nút / cách và bao nhiêu là chỉ mục để có quyền truy cập nhanh vào dữ liệu
k3b

Câu trả lời:


4

Dường như với tôi, vấn đề chính chỉ bao gồm các nút thêm thông tin quan trọng về một con đường.

tức là không có yêu cầu GPS của bạn, bạn chỉ có thể lưu trữ các nút tại các điểm nối và điểm cuối (mà tôi nghĩ bạn gọi các nút bắt đầu / kết thúc). Rõ ràng bao gồm trọng lượng / chi phí, vv

Một cách tôi có thể nghĩ đến khi tiếp cận điều này là trước tiên, thêm tất cả các nút bắt đầu / kết thúc. Đây là mức tối thiểu cần thiết. Rõ ràng điều này không giải thích cho những con đường quanh co.

Sau đó, đối với mọi con đường (được định nghĩa là kết thúc đến ngã ba hoặc ngã ba đến ngã ba), hãy làm như sau:

  1. Lặp lại tất cả các nút trung gian và tính khoảng cách tối thiểu từ mỗi nút đến đường như được xác định bởi các nút được bao gồm cho đến nay (để bắt đầu chỉ với điểm bắt đầu và kết thúc).
  2. Nếu tổng của ở trên lớn hơn (some constant threshold * number of intermediate nodes)chúng ta cần thêm các nút trung gian. Nếu không, thoát khỏi vòng lặp.
    • Để thêm các nút trung gian, hãy tìm nút có khoảng cách lớn nhất từ ​​đại diện hiện tại của đường và thêm nó.

Điều đó có ý nghĩa hơn, bây giờ tôi chỉ tự hỏi một ngưỡng tốt sẽ là gì. Có vẻ khó thực hiện tất cả điều đó, mặc dù tôi có thể bắt đầu từ cơ sở dữ liệu 582 MB mà tôi đã có thay vì bắt đầu từ tệp nén 80 MB. Sẽ bỏ ngỏ câu hỏi để xem những ý tưởng khác xuất hiện ... :)
Tamara Wijsman

Bạn sẽ phải cân bằng ngưỡng giữa bao gồm nhiều nút hơn (kích thước lớn hơn) và bao gồm ít nút hơn (kém chính xác hơn) tôi đoán. Giả sử bước đầu tiên có thể tạo ra một DB nhỏ hơn chỉ chứa các điểm nối và điểm cuối.
George Duckett

Bạn bị mắc kẹt phải có dữ liệu giữa các nút, bao gồm cả đường dẫn thực tế. Có chi phí giữa các nút, nhưng chúng có thể thay đổi giữa các nút giao. Giới hạn tốc độ và số làn đường không chỉ thay đổi tại các giao lộ. Biết đường dẫn chính xác là cần thiết để tính toán con đường gần nhất. Các đường kết nối giữa các nút ngoài đường dẫn thực tế sẽ cần tất cả dữ liệu meta cho phân đoạn đó. Dữ liệu meta này sẽ cần thiết cho việc định tuyến và chỉ đường.
mhoran_psprep

Để tìm đường, có lẽ bạn có thể thoát khỏi việc giảm số lượng nút, ví dụ: nếu một con đường (giữa các nút giao) có một số nút, trong đó có những thay đổi trong giới hạn tốc độ không quan trọng như khi bạn đi trên đó đường bạn phải tiếp tục đến ngã ba tiếp theo. Chỉ cần cẩn thận khi giảm các nút để tính đến các giới hạn tốc độ và độ dài khác nhau của các giới hạn tốc độ đó. Điều tương tự cũng xảy ra với # làn đường, bạn chỉ cần giảm nó xuống một trọng lượng cạnh thích hợp.
George Duckett

Nó cũng phụ thuộc vào định nghĩa của 'ngã ba', ý nghĩa sẽ giảm nhiều nhất, nhưng sẽ ít chính xác nhất chỉ đơn giản là nơi 2 hoặc nhiều đường gặp nhau. Một giải pháp thay thế có thể là nơi một tài sản của con đường thay đổi (ví dụ: Nhỏ-> Chính, 30km-> 40km, v.v.).
George Duckett
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.