Построение lineArcs с помощью turf.js, которые не совпадают с окружающими их геодезическими строками. - PullRequest
0 голосов
/ 04 октября 2018

Фон

Мы снабжены некоторыми данными AIXM (надмножество GML на основе XML), которые описывают полигональные области на карте как смесь GeodesicStrings (список координат) и ArcByCentrePoints (координата центральной точкис радиусом, начальный подшипник и конечный подшипник).Мы берем эти данные и преобразуем их в простой список координат, который затем отображаем с помощью полилинии карт Google.

Задача

Когда мы строим фигуру с дугой, начало и конецточки дуги обычно не совпадают с конечной точкой предыдущей линии и начальной точкой следующей линии.Выглядит так, как будто радиальное расстояние отсутствует на величину, которая, кажется, не пропорциональна радиусу.Смотрите скриншот: интересно, что меньшая дуга вверху кажется хорошей, но большая дуга вставлена.

Bad arc

Мы почти уверены, что данные верны, потому чтоэто выглядит нормально, когда мы используем сторонний инструмент для его визуализации, поэтому мы делаем что-то не так.

Реализация

Мы используем библиотеку turf.js дляпреобразовать описание дуги в набор точек, используя функцию lineArc .Внутренне это использует их функцию destination , которая "использует формулу Хаверсайна для учета глобальной кривизны" .Мы скомбинируем эти сгенерированные точки в правильной последовательности с точками, взятыми непосредственно из предыдущего и последующих элементов GeodesicString, чтобы получить наш конечный многоугольник.

Данные

Помощь!

ЯЯ знаю, что этот вопрос не слишком полезен для кода, но я надеюсь, что описал проблему адекватно, и что какой-то добрый человек с большим знанием ГИС, чем я (> 0), мог бы указать мне правильное направление.Спасибо :)

1 Ответ

0 голосов
/ 02 декабря 2018

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

К сожалению, в этом случае я не воспользовался собственным советом.Я был настолько одержим идеей, что проблема возникла из-за сложной причины, такой как проблемы с реализацией формулы Хаверсина, что я упустил гораздо более простой ответ.Мой код брал строковое представление радиуса, включая единицы измерения (например, морские мили или метры) и преобразовывал его в километры.К сожалению, я использовал parseInt вместо parseFloat как часть этого и поэтому мгновенно терял точность.Это было просто - ошибка школьника.

Большое спасибо Стефано Борги, сопровождающему Turf JS, за всю его помощь в этом и за то, что он помог мне увидеть дерево для деревьев.

...