- PVSM.RU - https://www.pvsm.ru -
Доброго времени, дорогие Хабровчане!
В этой статье я расскажу о том, как реализовать оффлайн карты.
Дисклеймер. Статья не является пиаром чего-либо. Данный вариант реализации был выбран мною как самый оптимальный и я бы хотел поведать о нем в доступной форме.
Спасибо!
При разработке гид приложения для Гонконга, возникла нужда в использовании оффлайн карт. Google карты, к сожалению, не предоставляют такой возможности, так что, из за безысходности пришлось использовать такой сервис как MapBox, точнее расширение для iOS — MapBox-ios-sdk.
Заинтересовавшихся прошу под кат.
Нам понадобится:
Скачиваем приложение с офф. сайта [1], распаковываем, перемещаем в папку с приложениями.
Далее запускаем его.
Приложение приветствует нас вот таким окном.
Нажимаем «Open psql»:
Или открываем через статус бар:
После этих действий откроется консоль с запущенным PostgreSQL. Далее нам нужно создать базу для хранения тайлов.
В консоли вводим следующее:
create database osm:
connect osm
create extension postgis;
quit
Скачиваем пакет OSM Bright по этой ссылке. [2]
Разархивируйте и откройте папку, переименуйте файл configure.py.sample в configure.py, откройте этот файл в текстовом редакторе и измените поля (если нужно).
Я советую все же сделать это, чтобы в дальнейшем не возникало путаницы с проектами.
Итак, меняем название, я указал HongKong.
Директорию оставил по умолчанию. Данную директорию использует приложение TileMill, лучше ее не менять, дабы потом не заморачиваться с TileMill.
Имя пользователя и пароль, а также все остальные поля оставляем пустыми.
Далее нам нужно скачать файлы стилей для нашей карты.
Они находятся тут:
После загрузки перемешаем их в папку OSM Bright.
Распаковывать файлы не нужно OSM Bright сделает это сам.
Скачиваем по ссылке [6], эмулируем образ и устанавливаем osm2pgsql.
Переходим на сайт и качаем его [7], с последующей переноской приложения в каталог приложений.
Перед тем как создать оффлайн карту, мы должны определится с ее размером. Карта не должна быть слишком большой, т.к вес приложения будет больше 1-2 гб, что как мне кажется, не допустимо.
Пользователи которые используют iPhone 16gb будут очень разочарованы.
Переходим на любой из ниже перечисленных сервисов.
Я скачивал карту с metro.teczno.com.
Находим наш город и скачиваем файл с расширением .osm.pbf:
Открываем «Терминал» и пишем.
osm2pgsql -cGs -d osm -S /usr/local/share/osm2pgsql/default.style ~/Downloads/<your_map>.osm.pbf
Описание параметров можете посмотреть в вики OpenStreetMap wiki.openstreetmap.org/wiki/Osm2pgsql [10], или прописать в терминале команду
osm2pgsql --help
Ждем пока пакет osm2pgsql обработает карту и перенесет ее в базу Postgres.
Обычно это 5-20 минут, в зависимости от размера файла.
В конце вы увидите надпись вроде этой “Osm2pgsql took 71s overall”.
Теперь мы должны создать проект для приложения TileMill.
Переходим в папку c OSM Bright.
cd ~/Downloads/mapbox-osm-bright
И запускаем скрипт.
./make.py
Открываем приложение TileMill.app.
Внимание! Возможен баг. Он заключается в том, что если приложение Postgres открыто во время запуска TileMill, то приложение TileMill не открывается и постоянно находится в состоянии загрузки. (Лечится перезагрузкой компьютера).
Если все было сделано верно, то проект отобразится в приложении TileMill.
Запускаем Postgres, если закрыт, и открываем проект.
Жмем на «Export» и выбираем формат MBTiles.
Выставляем Zoom, для примера я выставил 10-14 и сразу отмечаем центральную точку для минимального зума.
Если вы что-то сделаете не так как нужно, приложение сообщит вам об этом.
Выделяем выделяем нужную область.
И нажимаем «Export».
Преобразование и сжатие карты может занять довольно большое количество времени, от 10 мин до месяца, года.
Все зависит от мощностей вашего Mac и области карты которую вы сжимаете. Рекомендованный зум для карты в реальном проекте, 11-16, сжатие на моем MacBook Pro 13, mid 2012 занимает 30-40 мин.
После окончания обработки, программа предложит сохранить файл.
Сохраняем!
Подключаем MapBox-ios-sdk c помощью Cocoa-Pods, если что, SDK находится тут [11]. Порекомендую использовать ветку «develop», т.к этой версии уже подключен обновленный
SMCalloutView 2.0, который содержит стиль iOS 7.
pod 'Mapbox', :git => 'https://github.com/mapbox/mapbox-ios-sdk.git', :branch => 'develop'
Переносим созданную в TileMill карту, в ресурсы проекта.
И добавляем карту на главный view.
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
RMMBTilesSource *offlineSource = [[RMMBTilesSource alloc] initWithTileSetResource:@"HongKong" ofType:@"mbtiles"];
RMMapView *mapView = [[RMMapView alloc] initWithFrame:[self view].bounds andTilesource:offlineSource];
[mapView setZoom:11];
[mapView setMinZoom:11];
[mapView setMaxZoom:14];
[mapView setCenterCoordinate:CLLocationCoordinate2DMake(22.327330,114.123419)];
//Прячем лого MapBox и кнопку информации о карте. =)
[mapView setShowLogoBug:NO];
[mapView setHideAttribution:YES];
[mapView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth)];
//Поддержка Retina Display
[mapView setAdjustTilesForRetinaDisplay:YES];
[self.view addSubview:mapView];
}
@end
Проект с примером – github.com/Ne0nX/OfflineMaps-Example [12]
www.mapbox.com/tilemill/docs/guides/osm-bright-mac-quickstart/ [13]
github.com/mapbox/mapbox-ios-example [14]
Спасибо что дочитали статью до конца.
Удачи вам!
Автор: Ne0nX
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ios/63047
Ссылки в тексте:
[1] офф. сайта: http://postgresapp.com/
[2] ссылке.: https://github.com/mapbox/osm-bright/zipball/master
[3] tilemill-data.s3.amazonaws.com/osm/coastline-good.zip: http://tilemill-data.s3.amazonaws.com/osm/coastline-good.zip
[4] tilemill-data.s3.amazonaws.com/osm/shoreline_300.zip: http://tilemill-data.s3.amazonaws.com/osm/shoreline_300.zip
[5] mapbox-geodata.s3.amazonaws.com/natural-earth-1.3.0/physical/10m-land.zip: http://mapbox-geodata.s3.amazonaws.com/natural-earth-1.3.0/physical/10m-land.zip
[6] ссылке: http://cl.ly/0j0E0N1J3z0z
[7] качаем его: https://www.mapbox.com/tilemill/
[8] download.geofabrik.de/: http://download.geofabrik.de/
[9] metro.teczno.com: http://metro.teczno.com
[10] wiki.openstreetmap.org/wiki/Osm2pgsql: http://wiki.openstreetmap.org/wiki/Osm2pgsql
[11] тут: https://github.com/mapbox/mapbox-ios-sdk
[12] github.com/Ne0nX/OfflineMaps-Example: https://github.com/Ne0nX/OfflineMaps-Example
[13] www.mapbox.com/tilemill/docs/guides/osm-bright-mac-quickstart/: https://www.mapbox.com/tilemill/docs/guides/osm-bright-mac-quickstart/
[14] github.com/mapbox/mapbox-ios-example: https://github.com/mapbox/mapbox-ios-example
[15] Источник: http://habrahabr.ru/post/227193/
Нажмите здесь для печати.