Как стать автором
Обновить

Кривые линии на Google Maps

Время на прочтение2 мин
Количество просмотров4.8K
Думается мне, что скоро Google даст нам возможность нарисовать не только ломаную на своих картах, но и кривую. А с необходимостью нарисовать кривую линию я столкнулся уже сейчас, в процессе работы с одним проектом. И пришлось вертеться.

Я обычно очень люблю почитать на Хабре посты вида «Смотрите, что я сделал» (особенно, когда это не стартап). Поэтому — смотрите, что я сделал — я реализовал грязный хак, который поможет нарисовать кривые.

Сначала — картинка (не кликабельно):

Пример графика на карте



Прежде чем читать много букв, хочу попробовать!

Я бы тоже захотел. Пройдите вот по этому адресу. Там будет карта. Щелкните по ней один раз, потом щелкните в другом месте, на некотором удалении от первого щелчка. Посмотрите на результат. Можете щелкать дальше.

Зачем?

Обычно мне хочется нарисовать кривую линию, когда я изображаю на карте путь пешехода. Ведь люди не ходят через дома, не левитируют над речками и вообще любят тротуар. Поэтому мне всегда хотелось изобразить их путь кривой.

Как задавать кривые?

Кажется, заставлять людей учить теорию по кривым Безье, это не очень здорово. Поэтому я решил, что достаточно задавать кривые функциями одного переменного. Я лично больше всего люблю синус и косинус. Они достаточно красочно изображают путь пьяного пешехода.

Как они будут отображаться?

Графики функций будут аппроксимироваться графиками многочленов. По-русски: будут выбираться несколько точек на графике и соединяться отрезками. От количества точек зависит качество получаемого графика и скорость работы.

Как это выглядит в коде?


my_poly = ApproxPolyline(gmap, lls, f, range, points);
map_instance.addOverlay(my_poly.get_polyline());


gmap — объект класса GMap2 (он нужен, потому что в нем есть метод преобразования географических координат в декартовы),
lls — массив из двух точек, которые надо соединить графиком (объектов класса GLatLng),
f — функция одного переменного, которую хочется изобразить,
range — массив из двух чисел (отображаемый промежуток),
points — количество точек, которые будут соединены отрезками.

Где скачать?

Ссылки
Я разместил это на GitHub: страница репозитория и ссылки на архивы со скриптом последней ревизии: zip и tar.
Размер
Исходник скрипта на момент публикации весит 3400 байт, после сжатия YUICompressor — 2026 байт.
Лицензия
Код распространяется по лицензии MIT.

Как помочь?

Есть два способа:
1) Сказать мне, что не так. В комментариях, в почте или любым другим удобным способом.
2) Клонировать ветку на github, сделать изменения и сообщить мне, если вы хотите, чтобы они влились в мою ветку.

А он умеет «грабить корованы»?

Нет, а еще он не умеет заменять вам gnuplot и другие программы, которые рисуют графики. Поэтому всем, кто хочет нарисовать, например, тангенс на промежутке [-10; 10], сразу хочу сказать — получится плохо, ведь опорные точки распределяются равномерно. Потому что я ума не приложу, зачем рисовать графики неограниченных функций на картах :-)

Хотя тангенс на отрезке [-1; 1] выглядит очень даже ничего — потому что ограничен и непрерывен.

[:||||:]

Ах да, возможно это уже кто-то сделал, а я не знаю. Мне захотелось тряхнуть стариной и вспомнить немножко математики. Если это действительно не актуально, дайте мне знать и я скрою топик (только сначала научите — как).

Теги:
Хабы:
Всего голосов 50: ↑47 и ↓3+44
Комментарии27

Публикации

Ближайшие события