windows-phone-7 map offline openstreetmap

windows phone 7 - Caché de mosaico de mapas para visualización fuera de línea



windows-phone-7 offline (6)

Intento crear una aplicación que use mapas de código abierto de Open Street Maps (aunque el concepto debería ser aplicable a cualquier proveedor de mapas). La aplicación permitirá al usuario especificar una cantidad de puntos de referencia a lo largo de una ruta antes de la partida.

Debido a que no tengo un plan de datos para mi teléfono celular (y porque andar en el campo rara vez te da una buena conexión), quiero poder precargar los mapas de mapas relevantes para los puntos de ruta y / o ruta antes de la partida para que los mapas puedan seguir siendo utilizados sin una conexión de datos.

Mis pensamientos iniciales son descargar las fichas requeridas del proveedor del mapa y almacenarlas en un almacenamiento aislado. Sin embargo, la implementación de control de Bing Maps, que utiliza la clase TileSource , se basa en devolver un URI absoluto desde el que puede descargar los mosaicos, lo que claramente no funcionará con los datos almacenados en un almacenamiento aislado.

La pregunta ya se ha hecho: Windows Phone 7 Map Control con capa personalizada en modo fuera de línea , pero no fue respondida y me pregunto si desde entonces alguien ha descifrado el problema.


Una solución

La pregunta es un poco vieja, pero hay una solución para cualquiera que pueda usar Qt. La solución no está limitada a la plataforma Windows Phone, lo he hecho para Android y también funciona en mi escritorio.

En Qt, querrá parchar el complemento de OSM utilizado por QtLocation. Es simple, rápido y fácil.

Cómo hacerlo ?

Una implementación rápida podría modificar la clase QGeoTiledMappingManagerEngineOsm para hacer que llame a su propia QGeoTileFetcher lugar de QGeoTileFetcherOsm . Puede haber mejores formas de lograr esto, pero al menos funciona para mí.

Básicamente, crea un buscador que lee los mosaicos del sistema de archivos en lugar de la red. Usted construye su base de datos del sistema de archivos una vez, desde un recurso en línea, por ejemplo (ver a continuación) y lo implementa con su aplicación para su uso fuera de línea.

¿De dónde consigo fichas?

La información sobre cómo obtener los mosaicos para su implementación fuera de línea está disponible aquí: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Aquí hay dos fuentes de fichas que se pueden utilizar de forma gratuita:

  • Servidores del proyecto Open Street Maps
  • Servidores Mapquest Open Tiles

Cuide la licencia y los términos de uso.

Mapa de la calle abierta

  • Proyecto: wiki.openstreetmap.org/wiki/Main_Page
  • Licencia: www.openstreetmap.org/copyright
  • Términos de uso: wiki.openstreetmap.org/wiki/Tile_usage_policy
  • Los servidores se nombran actualmente como * .tile.openstreetmap.org

MapQuest-OSM Tiles

  • Proyecto: developer.mapquest.com/web/products/open/map
  • Licencia: opendatacommons.org/licenses/odbl/
  • Términos de uso: developer.mapquest.com/web/info/terms-of-use
  • Los servidores se nombran actualmente como otile * .mqcdn.com

(Perdón por enlaces extraños: no tengo suficiente reputación para publicar enlaces reales).


¿Ha configurado la acción de compilación en su (s) imagen (es) al contenido?


Creé un pequeño prototipo utilizando OpenStreetMaps para Android. Creo que podría ser interesante mirar el repositorio y, por lo tanto, encontrar una solución similar a la mía. Sí descargué los mapas de antemano, pero tal vez puedas usar una solución en línea para esto. Este es el repositorio: https://github.com/kikofernandez/OpenStreetMapExample y el video de cómo podría verse: https://vimeo.com/40619538 .

Utilicé este prototipo OpenLayers, OpenStreetMaps, JavaScript y WebView en Android. Me gustaría darle más detalles, pero fue solo un prototipo.


He visto esto hecho con una capa personalizada colocada sobre el mapa. Los mosaicos se cargan desde cualquier lugar que desee (IsolatedStorage, en línea, ¿alguna otra cosa?) En la capa personalizada.

Lo siento, no tengo ningún código que pueda compartir que demuestre esto en este momento, pero actualmente estoy haciendo algo muy similar.


Si puede almacenar los datos localmente (incrustarlos en el XAP), puede hacer referencia a ellos a través de un URI absoluto. Chris Walshie habla de eso here .

Entonces, por ejemplo, una vez que tenga la ruta de instalación para la aplicación, puede hacer referencia al recurso de esta manera:

Uri toResource = new Uri("file:///Applications/Install/4FFA38B5-00AF-4760-A7EB-7C0C0BC1D31A/Install/EMBEDDED_RESOURCE", UriKind.Absolute);


Si su aplicación se está ejecutando en WP8, utilice el control integrado de mapas en el Windows Phone 8 SDK, ya que admite mapas fuera de línea. Si se orienta a WP7, es posible hacer que los mapas fuera de línea funcionen pero requiere mucho trabajo. Creé esto para un cliente hace unos años y creo que me tomó un poco más de 3000 líneas de código. Ten en cuenta que también querían tener un marco para agregar mosaicos de varias fuentes, como la descarga y el área y la descarga de archivos comprimidos. La forma en que logré que el renderizado funcionara fue en un lienzo del mapa sin establecer su posición. Esto será predeterminado convertirlo en un elemento secundario del mapa, pero no se moverá. Luego hice el lienzo del mismo tamaño que el mapa y utilicé el evento de cambio de tamaño para redimensionar el lienzo en caso de que se cambiara el tamaño del mapa. Luego utilicé el evento de cambio de vista para activar un método para representar los mosaicos. Cuando se desencadenó este evento, primero calculé todos los mosaicos a la vista usando el código que se encuentra aquí: http://msdn.microsoft.com/en-us/library/bb259689.aspx

Luego sacaba las fichas del almacenamiento aislado y las dibujaba en el lienzo. Para el rendimiento, hago un seguimiento de las fichas que agregué al lienzo, de modo que si el mosaico todavía estaba a la vista, simplemente cambié su posición en lugar de volver a cargarlo desde el almacenamiento aislado. También eliminé las imágenes que ya no estaban a la vista. En general, esto funciona bien, pero hubo algunos problemas menores, como no tener la transición suave entre los niveles de zoom. Si realmente lo desea, es posible hacer que funcione, pero requiere mucha más matemática. Además, si haces zoom en un área donde no hay mosaicos terminas con un mapa vacío. Puede crear un modo de mapa personalizado para evitar que el usuario vaya a áreas donde no tiene mosaicos.