Подтвердить что ты не робот

Кэширование карты для автономного просмотра

Я пытаюсь создать приложение, которое будет использовать карты с открытым исходным кодом с Open Street Maps (хотя концепция должна быть применима к любому поставщику карт). Приложение позволит пользователю указать несколько путевых точек вдоль маршрута до отправления.

Поскольку у меня нет плана данных для моего мобильного телефона (и потому, что в сельской местности редко бывает очень хорошо), я хочу иметь возможность предварительно загружать соответствующие фрагменты карты для путевых точек и/или маршрут до вылета, чтобы карты могли продолжать использоваться без подключения к данным.

Мои первоначальные мысли - загрузить необходимые фрагменты из поставщика карт и сохранить их в изолированном хранилище. Однако реализация управления Bing Maps, использующая класс TileSource, основана на возврате абсолютного URI, из которого он может загрузить плитку (плиты), которая явно не будет работать с данными, хранящимися в изолированном хранилище.

Вопрос уже задан: Управление телефоном Windows Phone 7 с пользовательским уровнем в автономном режиме, но на него не ответил, и мне интересно, с тех пор кто-то проблема с этим.

4b9b3361

Ответ 1

Я видел, как это сделано с пользовательским слоем, размещенным над картой. Затем плитки загружаются из любого места, где вам нравится (IsolatedStorage, online, somehwere else?) В пользовательский слой.

Извините, у меня нет кода, который я могу предоставить, который демонстрирует это на данный момент, но в настоящее время я делаю что-то очень похожее.

Ответ 2

Я построил небольшой прототип, используя OpenStreetMaps для Android. Я думаю, было бы интересно посмотреть на репозиторий и, следовательно, найти решение, подобное моему. Я загрузил карты заранее, но, возможно, вы можете использовать онлайн-решение для этого. Это репо: https://github.com/kikofernandez/OpenStreetMapExample и видео о том, как это могло бы выглядеть: https://vimeo.com/40619538.

Я использовал этот прототип OpenLayers, OpenStreetMaps, JavaScript и WebView в Android. Я хотел бы дать вам более подробную информацию, но это был всего лишь прототип.

Ответ 3

Если вы можете хранить данные локально (вставлять их в XAP), вы можете ссылаться на него через абсолютный URI. Крис Уолши говорит об этом здесь.

Итак, например, как только у вас есть путь установки для приложения, вы можете ссылаться на ресурс следующим образом:

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

Ответ 4

Установили ли вы действие Build на своих изображениях на Content?

Ответ 5

Если ваше приложение работает на WP8, используйте встроенный контроль над картами в SDK Windows Phone 8, так как это уже поддерживает автономные карты из коробки. Если вы планируете использовать WP7, можно использовать автономные карты для работы, но при этом требуется много работы. Несколько лет назад я создал это для клиента, и я считаю, что мне потребовалось более 3000 строк кода. Имейте в виду, что они хотели иметь также фреймворк для добавления плиток из разных источников, таких как загрузка и область и загрузка заархивированных файлов. Как мне удалось заставить рендеринг работать на холсте на карте, не устанавливая его положение. Это будет по умолчанию сделать его дочерним по карте, но он не будет двигаться. Затем я сделал холст того же размера, что и карта, и использовал событие изменения размера для изменения размера холста при изменении размера карты. Затем я использовал событие изменения вида, чтобы вызвать метод для отображения фрагментов. Когда это событие было запущено, я сначала вычислил все просмотренные фрагменты, используя код, найденный здесь: http://msdn.microsoft.com/en-us/library/bb259689.aspx

Затем я вытащил плитки из изолированного хранилища и нарисовал их на холсте. Для производительности я отслеживаю, какие плитки я добавил на холст, чтобы, если плитка все еще была в поле зрения, я просто изменил ее положение, а не перезагрузил ее из изолированного хранилища. Я также удалил все изображения, которые больше не отображаются. В целом это работает отлично, но были некоторые незначительные проблемы, такие как отсутствие плавного перехода между уровнями масштабирования. Если вы действительно хотели, чтобы это можно было использовать, но требует гораздо больше математики. Кроме того, если вы увеличиваете площадь, где нет плиток, вы получаете пустую карту. Вы можете создать настраиваемый режим карты, чтобы пользователь не переходил в области, где у вас нет фрагментов.

Ответ 6

Решение

Вопрос немного стар, но есть решение для всех, кто может использовать Qt. Решение не ограничивается платформой Windows Phone, я сделал это для Android, и он также работает на моем рабочем столе.

В Qt вы захотите исправить плагин OSM, используемый QtLocation. Это просто, быстро и легко.

Как это сделать?

Быстрая реализация может изменить класс QGeoTiledMappingManagerEngineOsm, чтобы он вызывал ваш собственный QGeoTileFetcher вместо QGeoTileFetcherOsm. Могут быть лучшие способы добиться этого, но, по крайней мере, это работает для меня.

В принципе, вы делаете сборщик, который читает фрагменты из файловой системы вместо сети. Вы создаете базу данных файловой системы один раз, например, из онлайн-ресурса (см. Ниже) и развертываете ее с вашим приложением в автономном режиме.

Где я могу получить плитки?

Информация о том, как получить плитки для вашей автономной реализации, доступна здесь: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Вот два источника для плиток, которые можно использовать бесплатно:

  • Серверы проектов Open Street Maps
  • Серверы Mapquest Open Tiles

Позаботьтесь о лицензировании и условиях использования.

Открытая карта улиц

  • Проект: wiki.openstreetmap.org/wiki/Main_Page
  • Лицензия: www.openstreetmap.org/copyright
  • Условия использования: wiki.openstreetmap.org/wiki/Tile_usage_policy
  • В настоящее время серверы называются *.tile.openstreetmap.org

MapQuest-OSM Tiles

  • Проект: developer.mapquest.com/web/products/open/map
  • Лицензия: opendatacommons.org/licenses/odbl/
  • Условия использования: developer.mapquest.com/web/info/terms-of-use
  • В настоящее время серверы называются otile *.mqcdn.com

(Извините за странные ссылки: у меня нет достаточной репутации для публикации реальных ссылок).