iMapsManager.com

Офф-лайн карты для iPhone

О карте в 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 хранится информация о закладках. Формат файла:

<?xml version="1.0" encoding="UTF-8" ?>
- <plist version="1.0">
- <dict>
  <key>Bookmarks</key>
- <array>
- <dict>
  <key>LatitudeE6</key>
  <integer>55774871</integer>
  <key>LongitudeE6</key>
  <integer>37627395</integer>
  <key>MapType</key>
  <string>Standard</string>
  <key>Name</key>
  <string>Перемещенная булавка</string>
  <key>OriginalType</key>
  <integer>3</integer>
  <key>ResultIndex</key>
  <integer>0</integer>
  <key>Type</key>
  <integer>0</integer>
  <key>ZoomLevel</key>
  <integer>16</integer>
  </dict>
- <dict>
......

Здесь 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'а.