Как «усреднить» две или более строк географии с использованием C # / SQL Server 2008 - PullRequest
4 голосов
/ 28 ноября 2010

Предположим, я получил ряд результатов исследования поведения конкретной перелетной птицы. Птица была помечена, и приемник GPS записывает путь миграции, по которому он следует каждый год в течение пятилетнего периода. Результаты хранятся в таблице SQL Server, содержащей одну строку географии для пути каждого года.

Как бы вы описали линейную линию, представляющую «средний» путь, пройденный за пятилетний период?

Обратите внимание, что каждая строка образца может содержать разное количество точек. Они также не начинаются и не заканчиваются в одинаковых точках.

Лучший подход, который у меня есть, - это использовать интерполяцию для определения точек с определенными пропорциями набора вдоль каждой линейной линии. Так, например, начальная точка, четверть пути, половина пути по каждому маршруту и ​​т. Д. Затем вычислите среднее среднее значение широты / длины этих позиций по всем маршрутам и постройте новую географию линий линий из этих усредненных точек.

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

Мне не нужен точный код - просто предложения по улучшению общих подходов. Мне тоже не нужна "супер-точность". Как замечание, я бы в идеале хотел бы, чтобы подход был применим и к двум или более полигонам.

Спасибо за любые предложения!

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

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

Для каждой линии определите положение каждой вершины (процент) вдоль линии.

После получения этих значений для каждой строки вычисляйте новые вершины вдоль каждой линии, используя процентные значения всех ДРУГИХ линий.

В этой точке каждая строка должна содержать одинаковое количество вершин, а N-я вершина каждой линии напрямую соответствует N-й вершине каждой другой линии.

Теперь просто усредните вершину 0 для каждой линии, чтобы получить вершину 0 "усредненной" линии. Повторите для vertex1 каждой строки и т. Д.

Это должно работать как для линий, так и для полигонов.

Обратите внимание, что вы также можете использовать алгоритм взвешенного усреднения, если сможете определить значение точности для каждой строки. В прошлом я использовал этот подход при попытке усреднить две строки. У нас была возможность разрешить взвешивание каждой строки, обычно 50:50, но мы могли пройти до 100: 0 или 0: 100, в зависимости от точности источников.

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

1 голос
/ 29 ноября 2010

Хорошо, я перечитал все здесь и посмотрел на изображение.Есть единственный способ сделать это действительно, и это было несколько заявлено.Вы должны нормализовать свою выборку и , а затем применить формулу скользящего среднего полинома к n ​​результатам.

Математика, чтобы сделать это правильно, интенсивна, что приводит нас к вопросу о том, что вытребования к скорости?

Здесь приведены формулы для интерполяции: http://en.wikipedia.org/wiki/Interpolation

Как только вы нормализуете или «переформируете» каждую строку в предопределенную частоту дискретизации, вы можете усреднить их.

Посмотрите и на этот ответ: Какой алгоритм может эффективно найти набор точек на определенном расстоянии от пути?

0 голосов
/ 28 ноября 2010

Я предлагаю вам применить линейную регрессию к известным точкам. Это даст среднюю прямую через них.

...