ฐานข้อมูลสำหรับแผ่นแผนที่ลื่นแบบออฟไลน์


25

ขณะนี้ฉันมีแอปพลิเคชั่นแผนที่ HTML5 ออฟไลน์ (สร้างขึ้นบน Leaflet & KendoUI พร้อมส่วนเพิ่มเติมที่กำหนดเอง) ที่มีรายการแอปและทำงานได้ดีบนหลายแพลตฟอร์ม อย่างไรก็ตามฉันลังเลที่จะใช้ไฟล์ Manifest เพื่อจัดเก็บไทล์แผนที่จริงด้วยวิธีนี้ (ไฟล์ PNG ที่จัดเก็บเป็นแคชสไตล์ไทม์ TMS)

ปัญหาที่พบ:

  • อาจมีไทล์มาก (10MB - 50MB) ในไฟล์ PNG ประมาณ 1,000 ไฟล์
  • การดาวน์โหลดเริ่มต้นอาจช้ามาก (และยากที่จะแสดงความคืบหน้าต่อผู้ใช้)
  • แอปพลิเคชันทำงานหรือไม่หากไม่ใช้การแคชออฟไลน์ทั้งหมดจะล้มเหลว (สอดคล้องกับ [whatwg.org] [1])
  • ผู้ใช้ออฟไลน์จะเชื่อมต่อใหม่และต้องการรับการรีเฟรชของกระเบื้องเป็นครั้งคราวซึ่งเป็นเดลต้าเล็ก ๆ แต่กลไกรายการแอปจะโหลดไฟล์ js, css และ PNG ทั้งหมดใหม่ทันทีที่อัปเดตรายการ

แนวคิดทางเลือก:แยกเว็บแอปพลิเคชันออกจากที่เก็บข้อมูลของแผ่นแผนที่แบบลื่น จัดเก็บไทล์ในฐานข้อมูลที่เป็นมิตรกับเว็บแอปพลิเคชัน

ปรับปรุง:

[PouchDB เพิ่งเพิ่มการสนับสนุนสำหรับ blobs ไบนารี ฉันได้รับผลลัพธ์เบื้องต้นที่ดี ดู: /programming/16721312/using-pouchdb-as-an-offline-raster-map-cache ]

คำถาม: ภูมิปัญญาส่วนรวม (และประสบการณ์) พูดเกี่ยวกับตัวเลือกต่อไปนี้สำหรับฐานข้อมูลที่เป็นมิตรกับ JavaScript:

  1. SQLlite
    • ดูเหมือนว่าคุณจะต้องสร้าง wrapper แอพสำหรับสิ่งนี้เพื่อให้สามารถพูดคุยกับ JavaScript ได้
    • เช่นเพิ่ม DLL ให้คุณเป็นโปรแกรมเนทิฟสำหรับ windows และ PhoneGap สำหรับ android / IOS
  2. WebSQL
    • depricated
    • แต่มันเป็น SQL Lite ที่ฉันสามารถสร้างและแจกจ่ายได้อย่างง่ายดายจากโฮสต์เว็บเซิร์ฟเวอร์
  3. IndexDB

    • ดูเหมือนว่าการจัดเก็บ blobs จะใช้งานได้: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
    • ฉันกังวลว่านี่เป็นวิธีเดียวที่จะเติมฐานข้อมูลในขั้นต้นได้หรือไม่
    • นี่เป็นไฟล์ SQLLite หรือไม่? ฉันสามารถจัดส่งเพื่ออัปโหลดฐานข้อมูลจำนวนมากได้หรือไม่
    • ฉันเอนตัวไปทางนี้เพื่อแก้ปัญหา gotchas ของพวกเขาที่ฉันไม่รู้เกี่ยวกับ?

    ที่ต้องการ:

    • ประชากรเริ่มต้นอย่างรวดเร็ว (ผ่านการดาวน์โหลด) ไปยังเว็บฐานข้อมูลลูกค้า
    • เข้ากันได้กับ Leaflet TileLayer API ปัจจุบัน (เช่นฉันไม่ต้องการเขียนเลเยอร์ที่กำหนดเอง แต่ถ้าจำเป็น ... ) (เช่น MbTiles)
    • แพลตฟอร์ม: แล็ปท็อป Windows แต่ต้องการแท็บเล็ต Android และ IOS (ฉันสามารถรอจนกว่าจะปล่อย IndexDB ไม่ต้องการการสนับสนุนในทันที)
    • ฉันจะไม่เขียนแอพพื้นฐาน (EXE, IOS, Android) แต่ถ้าเป็นวิธีที่ดีที่สุด ...
    • การสร้างแผนที่เว็บฝั่งเซิร์ฟเวอร์ (นี่จะเป็นกระบวนการอัตโนมัติ) ผู้ใช้เลือกสถานที่เลือกแผนที่และพวกเขาได้รับการแปลงแบบไดนามิกและกลายเป็นแคชไทล์ลื่น (งานนี้เสร็จแล้วส่วนใหญ่แล้ว)
    • การดาวน์โหลดเริ่มต้นจำนวนมากอย่างรวดเร็ว
    • การเปลี่ยนแปลงแผนที่เดลต้ารีเฟรช (ฉันจะเขียนตรรกะนี้ตามจำนวนหุ้นคงที่และตรรกะวันที่อัพเดท)
    • ส่งผลกระทบน้อยที่สุดต่อเว็บแอปพลิเคชัน Leaflet & KendoUI ปัจจุบัน

ปรับปรุง:

แนวคิดพื้นหลังที่สำคัญ: ในขณะที่แอปพลิเคชันเว็บมีความเสถียรพอสมควรแผ่นแผนที่แบบลื่นไหลจะถูกสร้างขึ้นในทันทีสำหรับตำแหน่งของคุณและปัญหาประเภทใดที่คุณกำลังทำอยู่ (ที่ส่วนท้าย) ดังนั้นฉันจึงคิดถึงวิธีอื่นสองวิธีในการถ่ายโอน 'บิ๊กแบงเริ่มต้น' จากนั้นอัปเดต:

ไฟล์ซิป (อาจไม่ใช่ความคิดที่ดี - เนื่องจากเป็นการเพิ่มโหลดเซิร์ฟเวอร์) นอกจากนี้การขยายตัวบนเครื่องไคลเอนต์จะต้องมีการโต้ตอบกับผู้ใช้ แต่จะอนุญาตให้ไทล์ลื่นเพื่อใช้ url ของท้องถิ่น

API ของไฟล์ HTML5: ฉันยังไม่ได้ดูรายละเอียดอย่างนี้ แต่ดูเหมือนว่าการดำเนินการส่วนใหญ่จะสร้างแผนผังไฟล์ในเครื่องในรูปแบบ TMS: http://www.html5rocks.com/en/tutorials/file/filesystem/สิ่งที่น่าสนใจในการทดสอบคือประสิทธิภาพ (เช่นฉันสามารถใช้งานเว็บได้หรือไม่ เพื่อเพิ่มแบนด์วิดท์สูงสุดให้กับดิสก์และทั่วเน็ต) IndexDB ไม่ได้ถูกนำมาใช้อย่างกว้างขวางเพื่อให้เป็นมิตรกับผู้ปฏิบัติงานเว็บ (ซิงค์อินเตอร์เฟส: /programming/10698728/indexeddb-in-web-worker-on-firefox

ฉันพบข้อมูลเพิ่มเติมเกี่ยวกับการใช้ IndexDB กับ Leaflet:

https://github.com/calvinmetcalf/leaflet.pouch (ซิงค์ couchdb กับ indexdb สำหรับออฟไลน์) และนี่คือการทดสอบความเร็วในการอ่าน / เขียนสำหรับ indexdb, websql และร้านค้าในพื้นที่: http://jsperf.com/indexeddb -vs-localStorage / 15

และนี่คือวิธีใช้ API ไฟล์อ่าน / เขียนจาก javascript: (และเพื่อขอเพิ่มขีด จำกัด พื้นที่เก็บข้อมูล) http://www.html5rocks.com/en/tutorials/file/filesystem/


ขอบคุณ Tom MacWright (aka tmcw) สำหรับการตอบรับที่ดี ตัวอย่างของคุณจะช่วยได้จริง ๆ เมื่อฉันได้สร้างเลเยอร์ที่กำหนดเองเพื่อนำเข้าไปในไบนารี blobs

ฉันทำการทดสอบกับ IndexedDB เมื่อวานและด้วยการใช้ polyfills และไลบรารี่ฉันคิดว่ามันจะแก้ปัญหาของฉันได้ ตอนนี้เป็นเวลาที่จะทำให้เหงื่อออกและฉันจะรายงานกลับ


BTW: ถ้าคุณต้องการดูผลลัพธ์ของการศึกษาของฉันในฐานข้อมูลฝั่งไคลเอ็นต์ให้ดู:

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



มีเหตุผลใดที่ทำให้ซ้ำซ้อน? stackoverflow.com/questions/14058489/…
radek

อันเดอร์กราวไม่ได้ขีดล่าง? ;]
radek

ขอบคุณสำหรับการแก้ไขแอนนิต้า ฉันเป็นมือใหม่และฉันไม่รู้จักมารยาทที่เหมาะสมสำหรับการปิดบันทึกย่อนี้ แต่ทิ้งเบาะแสสำหรับผู้อ่านถึงสิ่งที่ฉันเลือกสำหรับการแก้ปัญหา
Dr.YSG

คำตอบ:


7

PhoneGap และ MBTiles

WebSQL & IndexDB จะไม่เพียงพอ 'แล็ปท็อป Windows' จะไม่เป็นรหัสเดียวกันกับอุปกรณ์มือถือ


พื้นหลังเพิ่มเติม: ลูกค้าขอความช่วยเหลือจากแล็ปท็อปเท่านั้น มันเป็นความปรารถนาส่วนบุคคลในส่วนของฉันเพื่อดูว่าฉันสามารถขยายไปยังแท็บเล็ต (IOS, Android) ความรู้สึกของฉันคือ PhoneGap จะเพิ่มเวลา dev มากเกินไปและนำไปสู่การกระจายตัวของรหัสฐาน (ค่าบำรุงรักษาซอฟต์แวร์) แต่ขอบคุณสำหรับบทความมันเป็นน้ำเชื้อ
Dr.YSG

ฉันเพิ่งจำได้ว่ามีข้อ จำกัด เพิ่มเติมที่นี่: หากเราใช้งานกับ PhoneGap ผู้สนับสนุนจะเรียกแอปนี้ว่าเป็นแอพที่มีอยู่แล้วและจะต้องผ่านการรับรองหนึ่งปีหรือมากกว่านั้น เราต้องการหลีกเลี่ยงสิ่งนี้จริงๆ
Dr.YSG

1
สิ่งที่คุณต้องการทำไม่สามารถทำได้หากไม่มีส่วนประกอบพื้นฐาน อาจถึงเวลาที่จะเจรจาใหม่
tmcw

สำหรับความอยากรู้ของฉันมีปัญหาอะไรกับ IndexDB หรือ FileAPI?
Dr.YSG

1
การสนับสนุนเบราว์เซอร์ใกล้เป็นศูนย์และขาด ๆ หาย ๆ พร้อมขีด จำกัด ขนาดต่ำ ลองด้วยตัวคุณเอง
tmcw

3

ผลลัพธ์แคชหยดแบบออฟไลน์สำหรับแผนที่ลื่นไหล PNG

การทดสอบ

  • 171 ไฟล์ PNG (ทั้งหมด 3.2MB)
  • ทดสอบแพลตฟอร์ม: Chrome v24, FireFox 18, IE 10
  • ควรทำงานกับ Chrome & FF สำหรับ Android

ดึงข้อมูลจากเว็บเซิร์ฟเวอร์

  • ใช้ XHR2 (รองรับเกือบทุกเบราว์เซอร์) สำหรับการดาวน์โหลด blob จากเว็บเซิร์ฟเวอร์
  • ฉันไปกับ XHR2-Lib โดย Phil Parsons ซึ่งเหมือนกับ JQUERY .ajax ()

การเก็บรักษา

  • IndexedDB สำหรับ IE และ FireFox
  • Chrome: Polyfill (blob ที่จัดเก็บโดยใช้ FileSystem API อ้างอิงที่เก็บไว้ใน IndexedDB)
  • ต้องอ่านบทความเกี่ยวกับ "วิธีที่เบราว์เซอร์จัดเก็บข้อมูล IndexedDB"
  • หมายเหตุ: FireFox ใช้ SQLlite สำหรับ NOSQL IndexedDB นั่นอาจเป็นสาเหตุของประสิทธิภาพที่ช้า (blobs เก็บแยกต่างหาก)
  • หมายเหตุ: Microsoft IE ใช้เอนจินการจัดเก็บข้อมูลแบบขยายได้:
  • หมายเหตุ: Chrome ใช้ LevelDB http://code.google.com/p/leveldb/

แสดง

  • ฉันใช้ Leaflet http://leafletjs.com/เพื่อแสดงไทล์แผนที่
  • ฉันใช้ปลั๊กอินเลเยอร์ที่ใช้งานได้โดย Ishmael Smyrnow เพื่อดึงเลเยอร์ไทล์จาก DB
  • ฉันเปรียบเทียบเลเยอร์ไทล์ DB-based กับการจัดเก็บในท้องถิ่น (localhost: //) อย่างหมดจด
  • ไม่มีความแตกต่างที่ชัดเจนในประสิทธิภาพ! ระหว่างการใช้ IndexedDB กับไฟล์ในเครื่อง!

ผล

  • Chrome: ดึงข้อมูล (6.551s), Store (8.247s)
  • FireFox: Fetch (0.422s), Store (34.519s)
  • IE 10: ดึงข้อมูล (0.668 วินาที), ร้านค้า: (0.896 วินาที)

2

ดังนั้นคุณแทบจะไม่ต้องการใช้ leaf.pouch แน่นอนฉันทำโดยใช้ข้อมูลเวกเตอร์ในใจไม่ใช่ไทล์คุณควรจะดีกว่าด้วยการใช้strait up PouchDBเพื่อเก็บไทล์ของคุณเนื่องจากคุณสามารถทำซ้ำจาก CouchDB สำหรับ โหลดเริ่มต้นที่รวดเร็วคำตอบโดย @tmcw ด้านบนจะทำงานได้เช่นกันหากคุณมีแอพโทรศัพท์มากกว่าหน้าเว็บมือถือ


0

ใช้รูปแบบ MBTILES คอนเทนเนอร์ SQLite3 มาตรฐานที่มีตารางกระเบื้องที่มีเขตข้อมูล tile_data blob พร้อม PNG หรือ JPG หรือ WebP หรือ GZipped PBF รวมเข้ากับ MBTILES.JS https://github.com/tilemapjp/mbtiles.js/tree/master https: // www.npmjs.com/package/Leaflet.TileLayer.MBTiles

คุณสามารถแปลง TMS หรือ XYZ Tiles เป็น mbtiles ด้วย MBUTIL โดย MapBox ถ้าคุณต้องการสร้างโฟลเดอร์ของไทล์ก่อนอื่นให้ใช้ GDAL2TILES_Parallel.py หรือ gdal2tilesp.py การประมวลผลแบบหลามมัลติโพรเซสเซอร์แบบขนานของ orginal พวกเขาทั้งสองต้องการ GDAL


ฉันได้ใช้การอ่านโดยตรงของ mbtiles (แรสเตอร์เวกเตอร์และภูมิประเทศ / ระดับความสูง) ในแผ่นพับเพื่อการดูแบบออฟไลน์โดยสมบูรณ์
GeospatialInformationTech

การใช้งานของฉันเพิ่มการสนับสนุน OGC GeoPackage กระเบื้องแรสเตอร์เวกเตอร์ระดับความสูงและเวกเตอร์ ใช้ GeoPackage-JS
GeospatialInformationTech

0

MBTILES ใน Leafletjs ป้อนคำอธิบายรูปภาพที่นี่

มันจะอ่าน mbtiles ท้องถิ่นและระยะไกล แพ็คเกจเป็นแอพมือถือที่มี IONIC หรือ React Native หรือเดสก์ท็อปด้วย Electron Atom MBTILES เป็นวิธีที่จะไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.