Cơ sở dữ liệu cho các lát bản đồ ngoại tuyến


25

Tôi hiện có một ứng dụng bản đồ HTML5 ngoại tuyến (được xây dựng trên Leaflet & KendoUI với các bổ sung tùy chỉnh) có bảng kê khai ứng dụng và hoạt động tốt trên nhiều nền tảng. Tuy nhiên, tôi ngần ngại sử dụng bảng kê khai để lưu trữ các lát bản đồ thực tế theo cách này (các tệp PNG được lưu dưới dạng Bộ đệm ẩn kiểu TMS).

Các vấn đề:

  • Có thể có rất nhiều ô (10MB - 50MB) trong khoảng 1.000 tệp PNG
  • Tải xuống ban đầu có thể rất chậm (và khó hiển thị tiến trình cho người dùng)
  • Bản kê khai ứng dụng hoạt động hoặc chúng không hoạt động nếu chúng không thực hiện toàn bộ bộ đệm ẩn ngoại tuyến (theo [whatwg.org] [1])
  • Người dùng ngoại tuyến đôi khi sẽ kết nối lại và cần được làm mới các ô, Đây là các đồng bằng nhỏ nhưng cơ chế tệp kê khai ứng dụng sẽ tải lại tất cả các tệp js, css và PNG ngay khi cập nhật tệp kê khai

Ý tưởng thay thế: giữ cho ứng dụng web tách biệt khỏi việc lưu trữ các lát bản đồ slippy. Lưu trữ các ô trong cơ sở dữ liệu thân thiện với ứng dụng web

Cập nhật:

[PouchDB gần đây đã thêm hỗ trợ cho các đốm nhị phân. Tôi đang nhận được kết quả ban đầu tốt. Xem: /programming/16721312/USE-pouchdb-as-an-offline-raster-map-cache ]

Câu hỏi: Trí tuệ tập thể (và kinh nghiệm) nói gì về các lựa chọn sau cho DB thân thiện với JavaScript:

  1. SqlLite
    • Có vẻ như bạn cần tạo một trình bao bọc ứng dụng gốc cho việc này để cho phép nó nói chuyện với JavaScript
    • Ví dụ: Thêm bạn DLL vào chương trình gốc cho windows và PhoneGap cho android / IOS
  2. WebQuery
    • thất vọng
    • nhưng đó là SQL Lite mà tôi có thể dễ dàng tạo và phân phối từ máy chủ web
  3. IndexDB

    • Lưu trữ các đốm màu dường như hoạt động, xem: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
    • Tôi lo ngại nếu đây là cách duy nhất để bắt đầu DB
    • Đây có phải là một tệp SQLLite không? Tôi có thể gửi nó để tải lên số lượng lớn DB không?
    • Tôi đang nghiêng về phía này như là một giải pháp. Có phải Gotchas của họ không biết?

    Yêu cầu:

    • Dân số ban đầu nhanh chóng (thông qua tải xuống) đến máy khách Web DB
    • Tương thích với API LeafLayer Leaflet hiện tại (nghĩa là tôi không muốn viết một lớp tùy chỉnh, nhưng nếu cần ...) (ví dụ: MbTiles)
    • Nền tảng: Máy tính xách tay Windows, nhưng máy tính bảng Android và IOS mong muốn (Tôi có thể đợi cho đến khi IndexDB được phát hành, không cần hỗ trợ ngay lập tức)
    • Tôi thà không viết một ứng dụng gốc (EXE, IOS, Android) nhưng nếu đó là cách tốt nhất ...
    • Tạo bản đồ phía máy chủ (đây sẽ là một quy trình tự động). Người dùng chọn một vị trí, chọn bản đồ và họ được chuyển đổi linh hoạt và biến thành bộ đệm ẩn nhanh chóng (công việc này đã được thực hiện phần lớn).
    • Tải xuống hàng loạt nhanh
    • Làm mới delta thay đổi bản đồ (Tôi sẽ viết logic này, dựa trên số lượng chứng khoán không đổi và cập nhật logic ngày)
    • Tác động tối thiểu đến ứng dụng web Tờ rơi & KendoUI hiện tại

Cập nhật:

Ý tưởng nền tảng chính: trong khi ứng dụng web khá ổn định, các lát bản đồ slippy được tạo ra một cách nhanh chóng cho vị trí của bạn và loại vấn đề bạn đang làm (ở phần cuối). Vì vậy, tôi đã nghĩ đến hai cách khác để chuyển 'vụ nổ lớn' ban đầu và sau đó cập nhật:

Tệp Zip (có thể không phải là ý tưởng hay - vì nó thêm tải máy chủ) cũng mở rộng trên máy khách sẽ yêu cầu tương tác của người dùng, nhưng nó cho phép các lát gạch nhanh chóng sử dụng url cục bộ

API tệp HTML5: Tôi chưa xem xét điều này rất chi tiết. Nhưng có vẻ như hầu hết các hoạt động để tạo một cây tệp cục bộ ở định dạng TMS: http://www.html5rocks.com/en/tutorials/file/filesystem/ điều thú vị để kiểm tra là hiệu suất (ví dụ: tôi có thể sử dụng các tác phẩm web để tối đa hóa băng thông vào đĩa và trên mạng). IndexDB không được triển khai rộng rãi để thân thiện với nhân viên web (giao diện đồng bộ: /programming/10698728/indexeddb-in-web-worker-on-firefox

Tôi đã tìm thấy một số thông tin bổ sung về việc sử dụng IndexDB với Tờ rơi:

https://github.com/calvinmetcalf/leaflet.pouch (đồng bộ couchdb với indexdb để ngoại tuyến) Ngoài ra đây là một số thử nghiệm về tốc độ đọc / ghi cho indexdb, websql và cửa hàng địa phương: http://jsperf.com/indexeddb -vs-localst Storage / 15

Và đây là cách sử dụng API tệp đọc / ghi từ javascript: (và cũng để yêu cầu tăng giới hạn lưu trữ) http://www.html5rocks.com/en/tutorials/file/filesystem/


Cảm ơn bạn, Tom MacWright (còn gọi là tmcw), vì một số phản hồi tốt. Ví dụ của bạn thực sự sẽ giúp ích khi tôi tạo các lớp tùy chỉnh để ăn các đốm nhị phân.

Tôi đã thực hiện một số thử nghiệm ngày hôm qua với IndexedDB và bằng cách sử dụng một số polyfill và thư viện tôi nghĩ rằng nó sẽ giải quyết vấn đề của tôi. Bây giờ là lúc để đặt một số vốn chủ sở hữu mồ hôi vào đây, và tôi sẽ báo cáo lại.


BTW: nếu bạn muốn xem kết quả nghiên cứu của tôi về cơ sở dữ liệu phía khách hàng, hãy xem:

/programming/14113278/storing-image-data-for-offline-web-application-client-side-st Storage-database



Bất kỳ lý do cụ thể cho trùng lặp? stackoverflow.com/questions/14058361/ Lời
radek

underdark không undershark? ;]
radek

Cảm ơn bạn đã chỉnh sửa Anita. Tôi là một người mới và tôi không biết phép xã giao phù hợp để đóng ghi chú này, nhưng để lại manh mối cho độc giả về những gì tôi đã chọn cho giải pháp.
Dr.YSG

Câu trả lời:


7

PhoneGap và MBTiles .

WebQuery & IndexDB sẽ không đủ. 'Máy tính xách tay Windows' sẽ không cùng mã với thiết bị di động.


Bối cảnh bổ sung: Khách hàng chỉ yêu cầu hỗ trợ máy tính xách tay. Đó là một mong muốn cá nhân của tôi để xem liệu tôi có thể kéo dài điều này sang máy tính bảng (IOS, Android) hay không. Ý thức của tôi là PhoneGap sẽ tăng thời gian phát triển quá nhiều và dẫn đến sự phân mảnh của cơ sở mã (chi phí bảo trì phần mềm) Nhưng cảm ơn vì bài viết, nó là rất quan trọng.
Dr.YSG

Tôi chỉ nhớ có một ràng buộc bổ sung ở đây: nếu chúng tôi triển khai nó với PhoneGap, nhà tài trợ sẽ gọi đây là ứng dụng gốc, và sau đó nó sẽ phải trải qua một năm hoặc lâu hơn để chứng nhận. Chúng tôi thực sự muốn tránh điều này.
Dr.YSG

1
Những gì bạn đang tìm kiếm không thể thực hiện được nếu không có thành phần bản địa. Có lẽ đã đến lúc đàm phán lại.
tmcw

Đối với sự tò mò của tôi, vấn đề với IndexDB hoặc FileAPI là gì?
Dr.YSG

1
Hỗ trợ trình duyệt gần như bằng không và đốm cộng với giới hạn kích thước thấp. Hãy cố gắng vì chính mình.
tmcw

3

Kết quả Bộ nhớ cache blob ngoại tuyến cho bản đồ slippy PNG

Kiểm tra

  • 171 tệp PNG (tổng cộng 3,2 MB)
  • Các nền tảng được thử nghiệm: Chrome v24, FireFox 18, IE 10
  • Cũng nên hoạt động với Chrome & FF cho Android

Tìm nạp từ máy chủ web

  • sử dụng XHR2 (được hỗ trợ trên hầu hết các trình duyệt) để tải xuống blob từ máy chủ web
  • Tôi đã đi với XHR2-Lib của Phil Parsons, rất giống với JQUERY .ajax ()

Lưu trữ

Trưng bày

  • Tôi đang sử dụng Tờ rơi http://leafletjs.com/ để hiển thị các ô bản đồ
  • Tôi đã sử dụng plugin lớp chức năng của Ishmael Smyrnow để tìm nạp lớp gạch từ DB
  • Tôi đã so sánh lớp gạch dựa trên DB với lưu trữ hoàn toàn cục bộ (localhost: //)
  • Không có sự khác biệt đáng chú ý trong hiệu suất! giữa việc sử dụng IndexedDB và các tệp cục bộ!

Các kết quả

  • Chrome: Tìm nạp (6.551s), Cửa hàng (8.247s)
  • FireFox: Fetch (0.422s), Store (34.519s)
  • IE 10: Tìm nạp (0,668 giây), Lưu trữ: (0,896)

2

Vì vậy, bạn gần như chắc chắn không muốn sử dụng leaf.pouch, tôi đã làm điều đó với dữ liệu vectơ trong tâm trí không phải là gạch, có lẽ tốt hơn hết là bạn nên sử dụng eo biển lênDB để lưu trữ các ô của mình, vì bạn cũng có thể sao chép từ CouchDB cho tải ban đầu nhanh, Câu trả lời của @tmcw ở trên cũng sẽ hoạt động nếu bạn có nhiều ứng dụng điện thoại hơn là trang web di động.


0

sử dụng định dạng MBTILES của bộ chứa SQLite3 tiêu chuẩn với bảng xếp gạch với trường blobata_db với PNG hoặc JPG hoặc WebP hoặc PBF GZipped được tích hợp với MBTILES.JS https://github.com/tilemapjp/mbtiles.js/tree/master https: // www.npmjs.com/package/Leaflet.TileLayer.MBTiles

bạn có thể chuyển đổi TMS hoặc XYZ Tiles thành mbtiles bằng MBUTIL bằng MapBox. nếu trước tiên bạn cần tạo thư mục gạch, hãy sử dụng GDAL2TILES_Parallel.py hoặc gdal2tilesp.py việc triển khai python đa xử lý song song của bản gốc. Cả hai đều yêu cầu GDAL.


Tôi đã triển khai việc đọc trực tiếp mbtiles (raster, vector và địa hình / độ cao) trong tờ rơi để xem hoàn toàn ngoại tuyến.
GeospatialIn informationTech

Triển khai của tôi đã thêm hỗ trợ OGC GeoPackage. Raster, Vector, Độ cao và Gạch Vector. sử dụng GeoPackage-JS
GeospatialIn

0

MBTILES trong Leafletjs nhập mô tả hình ảnh ở đây

nó sẽ đọc mbtiles địa phương và từ xa. Gói dưới dạng ứng dụng di động với IONIC hoặc React Native. hoặc Máy tính để bàn với Electron Atom. MBTILES là con đường để đi

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.