Объединение нескольких закодированных полилиний в одну закодированную полилинию - PullRequest
9 голосов
/ 11 февраля 2012

Я пытаюсь объединить новую закодированную полилинию с существующей полилинией без декодирования и перекодирования всей полилинии. Новая закодированная полилиния будет загружена на сервер (linux), где я хотел бы добавить ее к существующей полилинии.

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

41.386692,-73.475912
41.424822,-73.375027
41.428292,-73.311173
41.426183,-73.254577
41.470168,-73.218532
41.498865,-73.155278
(Yes, 6 points are easy, but it's going to be more like 7,000 coordinate pairs)
  • Первые 3 пары координат: yir{Fnwm_MimFquRuTanK
  • Последние 3: s`z{Fbpb~L{qGg`FkrDkjK
  • Все 6: yir{Fnwm_MimFquRuTanKdLw`J{qGg`FkrDkjK

Утилита Interactive Polyline Encoder
Формат закодированного полилинейного алгоритма (к нему можно обратиться с помощью интерактивного кодера)
Кодировщик Polyline

Edit:

У меня также есть исходные данные, которые кодировали полилинии на обоих концах. Таким образом, я также могу сохранить первую и последнюю пару координат отдельно.

Полезные чтения:

Я закончил тем, что написал сообщение в блоге, в котором есть намного больше деталей о том, как работают закодированные полилинии. Вы можете прочитать это здесь: Что такое закодированная полилиния?

Ответы [ 4 ]

9 голосов
/ 12 февраля 2012

Здесь показан алгоритм кодирования: http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html

Доступен декодер от профессора Марка МакКлюра по адресу http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/decode.html

При кодировании используются смещения (дельты) от точки к точке.Смещение первой точки вычисляется из (0,0), поэтому оно равняется координатам первой точки.Вторая точка кодируется как смещение точки два от точки один и т. Д.

Чтобы соединить две линии, сначала нужно найти последнюю точку первой линии и первую точку второйline.

Затем вы вычисляете смещение второй линии от последней точки первой линии и подставляете это смещение для первой координаты во второй строке.Таким образом, вторая строка начинается не со смещения от (0,0), а со смещения от конца первой строки.

Теперь необходимо перекодировать последнюю точку первой строкичтобы показать, что это еще не все.

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

Итак: сделатьработа, которую вам нужно будет сделать некоторые декодирования и перекодирования.Вероятно, проще всего декодировать каждую строку в массив точек, а затем перекодировать все это.Кодирование быстро и просто в PHP - см. Сайт McClure снова.

Это противоречит ответу, который я дал в группе Google Карт версии 2, где я ошибочно предположил, что длина каждой закодированной точки строгопять символов.


UNCA реорганизовала веб-сайт своего персонала в 2013/14 году, и доступ к работе профессора МакКлюра теперь доступен только через archive.org .Хотя описание кодированных полилиний все еще доступно и актуально, примеры, основанные на Javascript, могут больше не работать.

6 голосов
/ 12 февраля 2012

Хорошо, так что я думаю, что понял это. Большое спасибо Эндрю Личу за объяснение того, как алгоритм на самом деле работает на простом английском языке.

Проблема: Слияние новой кодированной полилинии с существующей кодированной полилинией

Решение: сохранить последнюю пару координат из существующей полилинии, закодировать только эту пару и сохранить ее на потом, закодировать все новые координаты с координатами из существующей полилинии в начале этой новой кодировки. найдите строку последней пары координат, удалите ее из новой закодированной полилинии и приклейте новую закодированную полилинию к обратной стороне существующей полилинии

Что нужно знать: Кодировка вычисляет смещение (расстояние от x, y) и преобразует это значение в ASCII. Проблема в том, что первая координата вычисляется из 0,0, поэтому, если бы вы просто сложили две закодированные полилинии, где вы добавили новую, она не будет смещена от существующей, но смещена от 0,0, что приведет к большому скачку ломаная линия Что нам нужно сделать, это выяснить, какие символы в закодированной полилинии имеют смещение от 0,0, и удалить их. Затем вы можете добавить новую строку к старой, и она будет правильно смещена.

Нажмите на ссылку ниже, чтобы увидеть все это написано и с хорошими комментариями. Кроме того, пожалуйста, дайте мне знать, если вы видите где-нибудь, эффективность может быть улучшена!

PasteBin: реализация решения на PHP

0 голосов
/ 12 февраля 2012

Я предлагаю вам не выполнять конкатенацию на сервере. Сделайте это в браузере. Все декодирование происходит в браузере. Очень легко объединить декодированные массивы вместе с JavaScript. Вы можете использовать метод "сращивания" или просто перебирать каждый из массивов компонентов.

0 голосов
/ 12 февраля 2012

Декодирование выполняется браузером.Вы можете отправлять отдельные сегменты строки в браузер для декодирования и объединения.Полилинии принимают одно свойство пути.Полигоны принимают несколько свойств «пути» в массиве путей.Единственная разница между ломаной и многоугольником заключается в отсутствии или наличии непрозрачности цвета «заливка» и «заливка».Если вы объявите свою ломаную линию как многоугольник без свойств «заливки», вы построите многосегментную линию из отдельных частей.

PS - редактор «stackoverflow» действительно отстой.

...