Кэширование тайлов карты для автономного просмотра - PullRequest
26 голосов
/ 21 февраля 2011

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

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

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

Вопрос уже был задан: Windows Phone 7 Map Control с пользовательским слоем в автономном режиме , но не получил ответа, и мне интересно, если с тех пор кто-нибудь решил эту проблему.

Ответы [ 6 ]

2 голосов
/ 28 мая 2012

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

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

2 голосов
/ 14 февраля 2012

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

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

0 голосов
/ 13 апреля 2015

Решение

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

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

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

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

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

Откуда я могу получить плитки?

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

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

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

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

Open Street Map

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

Плитки MapQuest-OSM

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

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

0 голосов
/ 31 июля 2013

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

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

0 голосов
/ 07 мая 2012

Вы установили действие «Построить» на изображениях на «Содержимое»?

0 голосов
/ 22 февраля 2011

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

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

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