Şu anda bir uygulama bildirimi olan ve birden fazla platformda düzgün çalışan çevrimdışı bir HTML5 harita uygulamasına (Leaflet ve KendoUI üzerine inşa edilmiş) özel bir uygulama var. Ancak, gerçek harita döşemelerini bu şekilde depolamak için bildirimi kullanmakta tereddütüm var (PNG dosyaları TMS stili Döşeme Önbelleği olarak saklanır).
Sorunlar:
- Yaklaşık 1.000 PNG dosyasında birçok döşeme (10MB - 50MB) olabilir
- İlk indirme işlemi gerçekten yavaş olabilir (ve kullanıcıya ilerleme göstermesi zor olabilir)
- Uygulama Manifestleri işe ya da tüm çevrimdışı önbellekleme başarısız olmazsa çalışmazlar ([whatwg.org] [1] uyarınca)
- Çevrimdışı kullanıcı ara sıra yeniden bağlanacak ve Döşemelerin yenilenmesi gerekecek, Bunlar küçük deltalardır ancak uygulama bildirim mekanizması, bildirim güncellemelerinde en kısa sürede tüm js, css ve PNG dosyalarını yeniden yükler
Alternatif fikir: web uygulamasını kaygan harita döşemelerinin deposundan ayrı tutun. Döşemeleri web uygulaması dostu bir veritabanında saklayın
Güncelleştirme:
[PouchDB yakın zamanda ikili bloblar için destek ekledi. İyi başlangıç sonuçları alıyorum. Bkz .: /programming/16721312/using-pouchdb-as-an-offline-raster-map-cache ]
- Bu Ben Nolan tarafından önerilmektedir http://bennolan.com/2011/06/03/offline-mapping.html
- Bir Çubuktaki Haritalar'daki benzer çalışmalar: http://developmentseed.org/blog/2010/oct/02/maps-stick-version-2-edeased/ ([kullanımdan kaldırıldı] [2])
- MBtiles http://mapbox.com/developers/mbtiles/
- TileStream https://github.com/mapbox/tilestream
- Lous Remi: http://louisremi.com/2011/10/07/offline-web-applications-were-not-there-yet/
Soru: Kolektif bilgelik (ve deneyim) JavaScript dostu bir DB için aşağıdaki seçenekler hakkında ne diyor:
- SQLLite
- JavaScript ile konuşmasına izin vermek için bunun için bir yerel uygulama sarmalayıcısı oluşturmanız gerekiyor gibi görünüyor
- Örneğin, windows için yerel bir programa DLL ekleyin ve android / IOS için PhoneGap
- WebSQL
- BULUNMADI
- ancak ana web sunucusundan kolayca oluşturabildiğim ve dağıtabildiğim bir SQL Lite idi.
IndexDB
- Blobları saklama iş gibi görünüyor: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- Başlangıçta DB'yi doldurmanın tek yolu bu olduğunda endişeliyim
- Bu temelde bir SQLLite dosyası mı? Toplu DB yüklemesi için gönderebilir miyim?
- Buna bir çözüm olarak yaslanıyorum. Bilmiyorum onların yakaladıkları mı?
Gereksinimler:
- İstemci Web DB'ye hızlı başlangıç popülasyonu (indirme yoluyla)
- Geçerli Leaflet TileLayer API'siyle uyumlu (yani, özel bir katman yazmayı tercih etmem ama gerekirse ...) (ör. MbTiles)
- Platform: Windows Dizüstü Bilgisayarlar, ancak Android ve IOS tabletleri isteniyor (IndexDB piyasaya sürülünceye kadar bekleyebilirim, hemen desteğe gerek yok)
- Yerli bir uygulama (EXE, IOS, Android) yazmayı tercih etmem ama en iyisi buysa ...
- Sunucu Tarafı web haritaları üretimi (bu otomatik bir işlem olacaktır). Kullanıcı bir yer seçer, haritaları seçer ve dinamik olarak dönüştürülür ve kaygan bir döşeme önbelleğine dönüştürülür (bu çalışma zaten büyük ölçüde yapılır).
- Hızlı toplu ilk indirme
- Harita değişikliği deltası yenilenir (sabit stok numaralarına göre güncellenir ve tarih mantığını günceller)
- Güncel broşür ve KendoUI web uygulaması üzerinde minimum etki
Güncelleştirme:
Anahtar arkaplan fikri: web uygulaması oldukça kararlıyken, kaygan harita döşemeleri konumunuz için anında üretiliyor ve ne tür bir sorun yapıyorsunuz (arka tarafta). Bu yüzden ilk 'big bang'i transfer etmenin iki yolu daha düşündüm ve ardından güncellemeler:
Sıkıştırılmış Dosya (muhtemelen iyi bir fikir değil - sunucu yükü eklediği için) istemci makinedeki genişleme de kullanıcı etkileşimi gerektiriyor, ancak kaygan döşemelerin yerel URL'leri kullanmasına izin veriyor
HTML5 Dosya API'si: Buna tam olarak bakmadım. Ancak, TMS formatında yerel bir dosya ağacı oluşturmak için birçok işlem yapıldığı görülüyor: http://www.html5rocks.com/en/tutorials/file/filesystem/ Test etmek ilginç olacak ne (örneğin web çalışmalarını kullanabilir miyim? bant genişliğini diske ve ağ boyunca büyütmek için). IndexDB, web çalışanı dostu olarak yaygın şekilde uygulanmamaktadır (senkronizasyon arayüzü: /programming/10698728/indexeddb-in-web-worker-on-firefox)
IndexDB'yi Leaflet ile kullanma hakkında bazı ek bilgiler buldum:
https://github.com/calvinmetcalf/leaflet.pouch (offline için indexdb ile couchdb'yi eşitler) Ayrıca indexdb, websql ve yerel mağaza için okuma / yazma hızları için bazı testler: http://jsperf.com/indexeddb -vs-localStorage / 15
Ve burada javascript'ten okuma / yazma dosyası API'sini nasıl kullanacağınız: (ve ayrıca depolama sınırlarını arttırmayı da istemek için) http://www.html5rocks.com/tr/tutorials/file/filesystem/
Teşekkürler, Tom MacWright (aka tmcw), bazı iyi geribildirim için. Örneği, ikili blobları almak için özel katmanlar oluşturduğumda gerçekten yardımcı olacak.
Dün IndexedDB ile bazı testler yaptım ve bazı polyfills ve kütüphaneleri kullanarak sorunlarımı çözeceğini düşünüyorum. Şimdi buna biraz ter eşitliği koymanın zamanı geldi ve ben de rapor edeceğim.
BTW: Çalışmamın sonuçlarını müşteri tarafında veritabanlarında görmek istiyorsanız, bakınız:
/programming/14113278/storing-image-data-for-offline-web-application-client-side-storage-database