Map Tile Caching für die Offline-Anzeige
Ich versuche, eine Anwendung zu erstellen, der Einsatz von open-source-Karten von Open Street Maps (obwohl das Konzept sollte für jede Karte Anbieter). Die Anwendung ermöglicht dem Benutzer das festlegen einer Anzahl von waypoints entlang einer route vor Abfahrt.
Da ich nicht über einen Datentarif für mein Handy (und weil Wandern in der Natur nur selten gibt Sie eine gute Verbindung), ich möchte in der Lage sein, um pre-load der jeweiligen map-Kacheln für die Wegpunkte und/oder die route schon vor der Abfahrt so, dass die Karten weiter verwendet werden kann, ohne eine Datenverbindung.
Meine ersten Gedanken sind zum herunterladen der benötigten tiles aus der map provider und speichert Sie in einem isolierten Speicher. Aber die Bing-Maps-control-Anwendung, die verwendet die TileSource
Klasse beruht auf der Rückkehr eine absolute URI, die Sie herunterladen können die Kachel(N) aus, die eindeutig nicht die Arbeit mit den gespeicherten Daten im isolated storage.
Die Frage schon gefragt wurde: Windows Phone 7 Map-Steuerelement mit benutzerdefinierten layer im offline-Modus, wurde aber nicht beantwortet und ich Frage mich, ob da dann jemand geknackt hat das problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe gesehen, dies geschieht mit einem benutzerdefinierten layer über der Karte. Die Fliesen werden dann von dort geladen, wo Sie wollen (IsolatedStorage, online, woanders her?) in den custom layer.
Sorry, ich habe keinen code, den ich teilen kann, das zeigt diese im moment aber bin momentan etwas sehr ähnliches.
Ich baute einen kleinen Prototyp mit OpenStreetMaps für Android. Ich denke, es könnte interessant sein zu schauen, das repository und daher eine Lösung finden, die ähnlich der meinen. Ich habe download der Karten vor der hand, aber vielleicht können Sie eine online-Lösung für dieses. Dies ist die repo: https://github.com/kikofernandez/OpenStreetMapExample und das video, wie es Aussehen könnte: https://vimeo.com/40619538.
Habe ich für diesen Prototyp OpenLayers, OpenStreetMaps, JavaScript und ein WebView in Android. Ich möchte Ihnen weitere details, aber es war nur ein Prototyp.
Wenn Sie können, speichern Sie die Daten lokal (Einbettung in die XAP), können Sie die Referenz, die es über eine absolute URI. Chris Walshie über Sie spricht hier.
So, zum Beispiel, wenn Sie den Installationspfad für die app, können Sie die Referenz-Ressource wie dieses:
TileSource
. Aber Chris' post greift zu kurz, wirklich zu erklären, wie Sie das update XAP. Könnte ich den download von Bild-Dateien und schieben Sie Sie dann in das XAP, die später verwendet werden?XDocument.Save
. Wissen Sie, was ich würde tun müssen, um zu schreiben, Bilder in die XAP zur Laufzeit?Haben Sie die Build Action auf deinem Bild(s) auf Inhalte?
Wenn Ihre app läuft auf WP8 dann mit dem eingebauten Karten-Steuerelement in die Windows Phone 8 SDK als dies bereits jetzt unterstützt offline-Karten aus der box. Wenn targeting WP7 ist es möglich, offline-Karten zu arbeiten, aber braucht eine Menge Arbeit. Ich habe dies für einen Kunden vor ein paar Jahren und ich glaube, dass es mich ein wenig über 3000 Zeilen code zu tun. Wohlgemerkt, Sie wollten auch einen Rahmen für das hinzufügen von Fliesen aus verschiedenen Quellen wie das herunterladen von über-und Bereichs-und Download von Zip-Dateien. Die Art, wie ich es geschafft die rendering-arbeiten wurde auf eine Leinwand, auf der Karte ohne s-Stellung. Diese werden Standard machen es zu einem Kind von der Karte, aber es wird sich nicht bewegen. Ich machte dann die Leinwand die gleiche Größe wie die Karte und benutzt das resize-Ereignis, um die Größe der Leinwand sollte die Karte verkleinert werden. Ich habe dann das view change-Ereignis auslösen, eine Methode zum Rendern der Kacheln. Wenn dieses Ereignis ausgelöst ich zuerst berechnet Sie alle Fliesen in der Ansicht mit dem code hier gefunden: http://msdn.microsoft.com/en-us/library/bb259689.aspx
Ich würde dann ziehen Sie die Fliesen aus dem isolierten Speicher und ziehen Sie auf der Leinwand. Für die Leistung, die ich verfolgen welche Fliesen ich Hinzugefügt, um die Leinwand, so dass, wenn die Fliesen noch in Aussicht habe ich einfach geändert, es die position, anstatt neu laden aus dem isolierten Speicher. Ich habe auch entfernt alle Bilder, die waren nicht mehr in Sicht. Insgesamt ist dies funktioniert gut, aber es gab einige kleinere Probleme, wie die nicht die den reibungslosen übergang zwischen den zoom-Stufen. Wenn Sie wirklich wollten, dass es möglich ist, um die Arbeit, aber erfordert viel mehr Mathematik. Auch, wenn Sie zoom in einen Bereich, wo es keine Fliesen, die Sie am Ende mit einer leeren Karte. Sie können erstellen einer benutzerdefinierten map-Modus zu verhindern, dass die Benutzer aus, die in Bereichen, in denen Sie nicht über die Fliesen.
Eine Lösung
Die Frage ist ein bisschen alt, aber es gibt eine Lösung für Personen, die Qt benutzen.
Die Lösung ist nicht beschränkt auf die Windows Phone-Plattform, ich habe es getan, welche auf Android, und es funktioniert auch auf meinem desktop.
In Qt, werden Sie wollen, um den patch auf den OSM-Plugin verwendet QtLocation. Es ist einfach, schnell und einfach.
, Wie es zu tun ?
Eine schnelle Umsetzung ändern könnte, die
QGeoTiledMappingManagerEngineOsm
Klasse, um es Ihr eigen nennenQGeoTileFetcher
stattQGeoTileFetcherOsm
.Möglicherweise gibt es bessere Wege das zu erreichen, aber zumindest funktioniert es für mich.
Grundsätzlich, Sie machen ein fetcher, der liest Fliesen aus dem Dateisystem, statt das Netzwerk.
Bauen Sie Ihr Dateisystem, Datenbank, einmal, aus einer online-Ressource, zum Beispiel (siehe unten) und stellen Sie es mit Ihrem Antrag für seine offline-Nutzung.
Wo bekomme ich die Fliesen aus ?
Informationen, wie man die Fliesen, um Ihre offline-Implementierung finden Sie hier :
http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
Hier sind zwei Quellen für Kacheln, die kostenlos genutzt werden können :
Kümmern sich um die Lizenzierung und Nutzungsbedingungen.
Open Street Map
MapQuest-OSM-Kacheln
(Sorry für fremde links : habe ich noch nicht genug Ruf zu post real links).