О карте в iPhone
Для разработчиков
MapTiles.sqlitedb
База данных содержит 2 таблицы – images и version. Таблица version в прошивках до 3.2.0/4.0.0 содержит единственную колонку – version, в которой лежат 2 числа. Cтрока с rowid=1, версия структуры кеша, всегда содержит число 4 для карт, используемых в прошивках до версии 2.2, и число 5 для прошивки 2.2. Cтрока с rowid=2 – это номер текущей версии картографических данных. По нему телефон определяет, не нужно ли ему удалять закешированную информацию. Если в таблице содержится информация об устаревшей версии, телефон удалит базу при первом же обращении к серверу. В случае, если таблица пуста, телефон считает карту актуальной и заносит туда текущий номер версии с сервера Google.
Таблица images содержит фрагменты карты. Для слоя «Карта» информация хранится в формате png (за исключением фрагментов, полностью закрашенных в один цвет – в этом случае в ячейке хранятся 3 байта – RGB). Для слоев «Спутник» и «Гибрид» используется формат CJPG, т.е. Jpeg, у которого отрезан заголовок для экономии дискового пространства. Средний объем одного фрагмента составляет 1 Килобайт. Для каждого фрагмента хранятся его координаты (x, y, аналогично Google Maps), тип (flags: 2=карта, 3=спутник, 6=гибрид) и масштаб (zoom: от 2 до 18 для карты и от 2 до 21 для спутниковых снимков, масштаб растет в сторону увеличения значения, в Google Maps – наоборот, 2му масштабу соответствует 16й в Google Maps).
x,y - координаты тайла, оси направлены направо и вниз, нумерация
порядковая
zoom - масштаб, от 2 до 18 для карты и от 2 до 21 для спутника. В
масштаб влезает pow(2, zoom + 1) квадратов 64х64
точки (в прошивке 2.2 используются
фрагменты 128х128, на iPad/iPhone4 - 256х256).
Т.е. на 2м масштабе поле имеет вид
(0,0) ...... (7,0)
....
(7,0).......(7,7)
(в скобках указаны координаты блоков, как они лежат в базе)
Подробнее о формате файла можно почитать здесь.
Для карт используется та же проекция, что и на Google Картах - сферический Меркатор. Почитать о формулах преобразования географических координат в координаты на плоскости можно здесь.
com.apple.Maps.plist
В файле /private/var/mobile/Library/Preferences/com.apple.Maps.plist
содержится информация о последнем просмотренном фрагменте карты.
Формат файла:
<?xml
version="1.0" encoding="UTF-8"
?>
-
<plist
version="1.0">
-
<dict>
<key>Cookie</key>
<integer>-2315336406771822464</integer>
<key>LastViewMode</key>
<integer>3</integer>
<key>LastViewedLatitude</key>
<real>55.73531341552734375</real>
<key>LastViewedLongitude</key>
<real>37.6561126708984375</real>
<key>LastViewedZoomScale</key>
<real>17.</real>
<key>LiveSearchEnabled</key>
<false />
<key>SearchMode</key>
<integer>1</integer>
<key>SearchString</key>
<ustring>Россия,
Тамбовская область, Сампурский район, село Ивановка</ustring>
<key>SearchStringIsAtom</key>
<false />
<key>TrafficEnabled</key>
<false />
<key>UISuspendedSettings</key>
<dict />
<key>UserLocation</key>
<data>Y....</data>
<key>UserLocationViewMode</key>
<integer>8</integer>
</dict>
</plist>
LastViewMode может принимать одно из 4х
значений: 0 – карта, 1 – спутник, 2 – гибрид, 3 - список. Кроме
того, в файле
содержатся параметры
SelectedRouteSegmentKey(int),
SearchResults(array of <LatitudeE6(int),
LongitudeE6(int), Name(string)>).
Bookmarks.plist
В файле /private/var/mobile/Library/Maps/Bookmarks.plist хранится информация о закладках. Формат файла:
Здесь Name
- название закладки,
LatitudeE6, LongitudeE6
- координаты места, умноженные на 1E6,
ZoomLevel -
масштаб, выставляемый при переходе к закладке.
Помимо OpenStreetMap, для его изготовления можно воспользоваться службами геокодирования, предоставляемыми такими сайтами как Google и Яндекс.
Пара советов генераторам закладок:
1. Делайте закладки, которые будут открываться на 14м уровне детализации. При переходе на такие закладки не придется уменьшать масштаб, чтобы понять, где находится улица. Делается это просто - добавляете в каждую закладку секцию ZoomLevel, например так:<key>ZoomLevel</key>
<integer>14</integer>
<key>Name</key>
<string>Автосборочный 1-й пер</string>
<key>LatitudeE6</key>
<integer>47263946</integer>
<key>LongitudeE6</key>
<integer>39735036</integer>
2. Удаляйте из результирующего файла пробелы и переводы строк - они сильно раздувают файл, приложение "Карты" начинает притормаживать при его открывании. А еще лучше - переводите его в формат бинарного plist'а.