Mise en cache des carreaux de la carte pour la visualisation hors ligne
j'essaie de construire une application qui utilisera des cartes open source de Open Street Maps (bien que le concept devrait être applicable à n'importe quel fournisseur de carte). La demande permettra à l'utilisateur de préciser un certain nombre de points de cheminement le long d'une route avant le départ.
parce que je n'ai pas de plan de données pour mon téléphone portable (et parce que se balader dans la campagne vous donne rarement une bonne connexion), Je veux être en mesure de pré-charger les carreaux de carte pertinents pour les points de cheminement et/ou l'itinéraire avant le départ afin que les cartes peuvent continuer à être utilisées sans connexion de données.
mes premières pensées sont de télécharger les tuiles nécessaires à partir du fournisseur de carte et de les stocker dans un endroit isolé. Cependant, L'implémentation du contrôle de Bing Maps, qui utilise la classe TileSource
, repose sur le retour d'un URI absolu à partir duquel il peut télécharger la(les) tuile (s), qui ne fonctionnera clairement pas avec les données stockées dans un stockage isolé.
la question a déjà été demandé: Windows Phone 7 Contrôle de la carte avec couche personnalisée en mode offline , mais n'a pas été répondu et je me demande si depuis lors quelqu'un a résolu le problème.
6 réponses
j'ai vu Cela fait avec un calque personnalisé placé sur la carte. Les carreaux sont ensuite chargés à partir de n'importe quel endroit que vous aimez (stockage isolé, en ligne, ailleurs?) dans le calque personnalisé.
Désolé, je n'ai pas de code que je puisse partager qui montre ceci en ce moment mais je fais actuellement quelque chose de très similaire.
j'ai construit un petit prototype en utilisant OpenStreetMaps pour Android. Je pense qu'il pourrait être intéressant de regarder le dépôt et, par conséquent, trouver une solution similaire à la mienne. J'ai téléchargé les cartes avant main, mais peut-être que vous pouvez utiliser une solution en ligne pour cela. C'est le repo: https://github.com/kikofernandez/OpenStreetMapExample et la vidéo de comment il pourrait ressembler: https://vimeo.com/40619538 .
j'ai utilisé pour ce prototype OpenLayers, OpenStreetMaps, JavaScript et un WebView sous Android. Je voudrais vous donner plus de détails mais c'était juste un prototype.
si vous pouvez stocker les données localement (les intégrer dans le XAP), vous pouvez les référencer via un URI absolu. Chris Walshie en parle ici .
ainsi, par exemple, une fois que vous avez le chemin d'installation de l'application, vous pouvez faire référence à la ressource comme ceci:
Uri toResource = new Uri("file:///Applications/Install/4FFA38B5-00AF-4760-A7EB-7C0C0BC1D31A/Install/EMBEDDED_RESOURCE", UriKind.Absolute);
avez-vous placé L'action de construire sur votre image(s) au contenu?
si votre application est en cours d'exécution sur WP8 puis utiliser le contrôle cartes intégré dans le SDK Windows Phone 8 comme cela prend déjà en charge les cartes hors ligne de la boîte. Si le ciblage WP7 il est possible d'obtenir des cartes hors ligne pour travailler mais prend beaucoup de travail. J'ai créé cela pour un client il y a quelques années et je crois que cela m'a pris un peu plus de 3000 lignes de code à faire. Ils voulaient aussi avoir un cadre pour ajouter des tuiles à partir de diverses sources telles que le téléchargement sur et la zone et le téléchargement les fichiers zippés. Ils ont la façon dont j'ai réussi à obtenir le rendu à travailler était à une toile à la carte sans mettre sa position. Ce sera par défaut en faire un enfant de la carte, mais il ne bougera pas. J'ai ensuite fait la toile de la même taille que la carte et utilisé l'événement redimensionner pour redimensionner la toile si la carte est redimensionnée. J'ai ensuite utilisé l'événement view change pour déclencher une méthode de rendu des tuiles. Lorsque cet événement a commencé, j'ai d'abord calculé tous les carreaux en vue en utilisant le code trouvé ici: http://msdn.microsoft.com/en-us/library/bb259689.aspx
je tirais alors les tuiles d'un entrepôt isolé et je les dessinais sur la toile. Pour la performance je garde trace des tuiles que j'ai ajouté à la toile de sorte que si la tuile était encore en vue je simplement changé sa position plutôt que de le recharger de stockage isolé. J'ai également supprimé toutes les images qui n'étaient plus en vue. Dans l'ensemble, cela fonctionne bien, mais il y avait quelques problèmes mineurs tels que ne pas avoir la transition entre les niveaux de zoom. Si tu voulais vraiment qu'il est possible d'obtenir que cela fonctionne, mais nécessite beaucoup plus de maths. En outre, si vous zoomez dans une zone où il n'y a pas de tuiles, vous vous retrouvez avec une carte vide. Vous pouvez créer un mode de carte personnalisé pour empêcher l'utilisateur d'aller dans les zones où vous n'avez pas de tuiles.
une solution
la question est un peu vieille, mais il y a une solution pour quiconque peut utiliser Qt. La solution n'est pas limitée à la plate-forme Windows Phone, Je l'ai fait cibler Android, et il fonctionne également sur mon bureau.
dans Qt, vous voudrez patcher le Plugin OSM utilisé par QtLocation. C'est simple, rapide et facile.
Comment faire ?
une implémentation rapide pourrait modifier le QGeoTiledMappingManagerEngineOsm
classe pour le faire appeler votre propre QGeoTileFetcher
au lieu de QGeoTileFetcherOsm
.
Il y a peut-être de meilleures façons d'y arriver, mais au moins ça marche pour moi.
en gros, vous faites un fetcher qui lit les tuiles du système de fichiers au lieu du réseau. Vous construisez votre base de données de système de fichiers une fois, à partir d'une ressource en ligne par exemple (voir ci-dessous) et vous la déployez avec votre application pour son utilisation hors ligne.
D'où je sors les carreaux ?
Informations sur la façon d'obtenir les tuiles pour votre implémentation hors ligne est disponible ici : http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
voici deux sources pour les carreaux qui peuvent être utilisés gratuitement:
- Open Street Maps projet des serveurs
- Mapquest Open Carreaux de serveurs
s'occuper de la licence et des conditions d'utilisation.
Open Street Map
- projet : wiki.openstreetmap.org/wiki/Main_Page
- licence : www.openstreetmap.org/copyright
- Conditions d'utilisation : wiki.openstreetmap.org/wiki/Tile_usage_policy Les serveurs
- sont actuellement nommés comme *.tile.openstreetmap.org
MapQuest-OSM Tiles
- projet : developer.mapquest.com/web/products/open/map
- licence : opendatacommons.org/licenses/odbl /
- Conditions d'utilisation : developer.mapquest.com/web/info/terms-of-use Les serveurs
- sont actuellement nommés comme otile*.mqcdn.com
(désolé pour les liens étranges : je n'ai pas assez de réputation pour poster de vrais liens).