Работа с open location code на php

OLC это способ представления локации в форме, которая проще воспринимается людьми и выглядит немного проще чем набор цифр (широта + долгота). Данный формат особенно полезен в случае если у улиц или дома нет номера, либо существуют одинаковые названия.

Что же кроме этого дает olc:

  1. Обработка локации в "оффлайне". Нет необходимости иметь доступ к сети чтобы преобразовать координаты в код и наоборот.
  2. Запоминается легче чем широта+долгота с нужной точностью. К примеру, восьмизначный код "8GWQC2GG+" запомнить легче чем координаты.
  3. Гибкая точность. Для представления здания 14x14 метров достаточно 10-символьного кода, но более точные локации требуют код с большей длинной. Чем длинней код - тем меньше объект на который он указывает.
  4. Возможность определять похожие локации по виду кода. Две локации расположенные рядом, или недалеко, в закодированном виде похожи друг на друга. К примеру "8GWQQ400+" и "8GWQC2GG+" расположены в одном городе.

Техническая сторона

Сам olc-код представляет из себя последовательность символов из 20-ти символьного алфавита (а именно 23456789CFGHJMPQRVWX). Набор символов  выбран не случайно, исключены такие символы как "1" или "B" для исключения путаницы. Для форматирования и сокращения длинны кода также добавляется символ "+" и в случае необходимости заполнитель "0" (для приведения кода к полному виду).

Процесс кодирования преобразует координаты WGS84 в olc с определенной точностью (длинной кода), Процесс декодирования возвращает "квадрат" в котором лежит эти координаты, а площадь квадрата зависит от длинны кода (его точности).

Процесс кодирования довольно прост: изначально координатное поле делиться на ячейки 20 x 20 градусов - получается таблица 18 x 9, которая покрывает всю планету. Первый символ в коде представляет из себя "номер строки"(широту) в этой таблица, второй "номер колонки"(долготу). Следующие этапы повторяют этот же процесс но над результатом предыдущих вычислений (делиться ранее вычисленный квадрат).
Таким образом код из 10 символов представляет из себя квадрат 13.9 x 13.9 метров.

Начиная с 11 символов применяется другой алгоритм кодирования, для обеспечения большей компактности. Результат кодирования десятого шага (область) представляют в виде матрицы 4 x 5 (20 ячеек). И каждый символ кода представляет позицию этой ячейки.

Реализация для php

Для кодирования-декодирования координат и была создан небольшой класс:

Комментарии