Клуб API Карт

Как работает Polyline.encode

shasoft
15 августа 2009, 00:37

Разработчики могут поделится секретом работы закодированного Polyline/Poligon?

Правильно ли я представляю алгоритм его работы: при изменении масштаба карты пересоздается обычный Polyline/Poligon только с использованием тех вершин, которые видны для данного масштаба?



5 комментариев
Подписаться на комментарии к посту
Пример кодирования на JavaScript:
http://rodlex.narod.ru/examples/from-encoded-points.html
Мне нужен не пример, а секреты реализации. :)

Делаю свою библиотеку, в которую хочу интегрировать поддержку различных Map API (на текущий момент Яндекс и Google).
Дошел до реализации кодированных линий. Есть два пути реализации (по крайней мере я вижу только два)
1. Для каждого API использовать свои функции. Но при этом придется разбираться в каждой конкретной реализации для каждого API
2. Написать один общий класс, который будет работать на обычных Polyline/Poligon
Т.е. есть набор точек. Я по ним создаю polyline для текущего масштаба (само собой исключая точки, которые будут не видны при таком масштабе карты). При изменении масштаба polyline будует пересоздаваться. Своим первоначальным вопросом я хотел узнать - по такому ли алгоритму работает
fromEncodedPoints родного API Яндекса, чтобы понять, насколько моя реализация будет медленнее


Провел тут небольшое тестирование по кодированию линий. Взял 50 тыс точек.
Исходный файл (Координаты последовательно через запятую): 1,7 Мб
После преобразования координат pt[i]-pt[i-1]: 454 Кб
После сжатия по алгоритмы Яндекса: 524 Кб!!! (т.е. больше, чем до сжатия)
Для справки:
Cжатие google: 176 Кб (хотя у Гугля хранится 5 знаков после запятой, а не 6)

При этом учитывались только сжатиые координаты без уровней levels

Точки для теста бра отсюда 
Подробнее об алгоритме можно почитать здесь:
http://api.yandex.ru/maps/jsapi/doc/dg/concepts/polylines.xml#coord_string

Коды API мы не раскрываем.
Вопрос про алгоритм, а не код
Ну да ладно - коммерческая тайна и всё такое. :)
Ссылку на алгоритм я дал комментарием выше.