Parasite писал(а):Применительно к Перлу либо PHP, плз. Спасибо.
Для начала небольшая вводная. В GC используется индекс на базе SQLite. Индекс состоит из 2-х таблиц: основной и дополнительной.
Основная таблица:
Table [GCindex]
Fields: 12
[ServerType]: TINYINT
[TileType]: TINYINT
[TVersion]: TINYINT
[THistory]: INTEGER
[TLayer]: INTEGER
[TZoom]: TINYINT
[X]: BIGINT
[Y]: BIGINT
[CacheID]: BIGINT
[OffSet]: REAL
[TSize]: INTEGER
[CRC]: BIGINT
ServerType - тип сервера. 1 - Земля, 2 - Небо, 3 - Марс, 4- История
TileType - тип тайла
h80: q2-name-q.ver;
h81: f1c-name-d.xxxx.ver;
h82: f1-name-i.ver;
h83: f1c-name-t.ver;
h84: f1c-name-d.xxxx.ver (описание 3D текстур - только в кэше GE);
h85: f1-name-d.xxxxx.ver;
h86: qp-name-q.ver;
TVersion - версия тайла
THistory - историческое смещение в версии тайла (f1-0123-i.8-f7213 -> TVersion=8, THistory=f7213)
TLayer - номер слоя
TZoom - зум
X,Y - x,y (аналогично GM но с учётом проекции)
CacheID - ID кэша (для поиска по дополнительной таблице)
OffSet - смещение в файле кэша от начала файла до начала тайла
TSize - размер тайла в байтах.
CRC - контрольная сумма тайла (CRC32B).
Дополнительная таблица:
Table [CacheInfo]
Fields: 3
[CacheID]: BIGINT
[TypeID]: TINYINT
[FileName]: TEXT
CacheID - ID кэша - порядковый номер кэша
TypeID - тип кэша. 1 - тайловый, 2 - кэш GE, 3 - файловый
FileName - полный/относительный путь к файлу кэша
А теперь, собственно, чтоб получить тайл нужно:
- Из исходного URL выделить: ServerType, TileType, TVersion, THistory, TLayer, TZoom, X, Y. (Если какого-то параметра нет, то его нужно приравнять нулю)
- Выполнить SQL запрос к основной таблице и получить недостающие параметры: CacheID, OffSet, TSize, CRC;
- Выполнить SQL запрос к дополнительной таблице и получить TypeID и FileName;
- Если TypeID=2 или 3, то открыть файл FileName, сместиться на OffSet от начала файла и считать TSize байт - считанные байты и будут искомым тайлом.
При желании, можно подсчитать CRC считанного тайла и сравнить с CRC из индекса, но я обычно такой проверки не выполняю, чтоб не замедлять процесс.
При желании можно подсмотреть в исходниках GC как реализована та или иная функция.