Рассчитать площадь между прямой и кривой - PullRequest
0 голосов
/ 01 сентября 2018

Во-первых, извините за это длинное введение, но я думаю, что это поможет лучше понять проблему. Я работаю над проектом, в котором мы пытаемся использовать огромные данные о плавающих автомобилях, чтобы вывести модели мобильности человека. Я использую RStudio для этого. В основном у нас есть два файла; trips.csv , который содержит 375 000 рейсов с метаданными, такими как идентификатор поездки, начальное / конечное местоположение (долгота, широта) и другие поля. Второй файл - waypoints.csv , который содержит полные данные о путевых точках GPS, перечисленные за поездкой. Это включает в себя последовательность путевых точек, местоположение и другие поля.

В общей сложности для этих 375 000 поездок (первый файл) существует около 10 миллионов путевых точек (второй файл). Таким образом, каждая поездка из первого файла имеет несколько путевых точек во втором файле, которые вместе образуют траекторию этой поездки. В следующих таблицах показаны примеры из каждого файла только с теми столбцами, которые мне нужны в моей задаче:

Данные поездки

Tripld,Lon1,Lat1,Lon2,Lat2,distance,
bb983d,11.565,48.19,11.55,48.143,7498,
da5bgg,11.584,48.157,11.639,48.098,1364,
saefeg,11.591,48.142,11. 563,48.18,7377

Данные о путевых точках

TripId,sequence,Lon,Lat,
bb983d,0,11.565,48.19,
bb983d,1,11.56688,48.18158,
bb983d,2,11.56351,48.18144,
bb983d,3,11.56335,48.1888,
bb983d,4,11.5654,48.17617,
da5bgg,0,11.584,48.157,
da5bgg,1,11.583417,48.155167,
da5bgg,2,11.578472,48.144556,
da5bgg,3,11.57075,48.142139,
5aefeg,0,11.591,48.142,
5aefeg,1,11.58994,4813956
5aefeg,2,11.58797,48.13706

Вот код, который я использовал для создания фреймов данных:

dput(droplevels(head(trips)))structure(list(TripId = structure(1:6, .Label = c("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee", "017cb0697a1135c5cd3479c1edc2aa6b", "01cc30aa0e036817cf4bdc468c9fad8a", "01f0a6a90ec964ae8014d2f750231663", "02949197deca3f1d52906cfc147454c5"), class = "factor"), StartLocLat = c(48.178, 48.098, 48.15, 48.176, 48.149, 48.151), startLocLon = c(11.573, 11.501, 11.503, 11.558, 11.503, 11.563), EndLocLat =  (48.143, 48.098, 48.18, 48.168, 48.148, 48.127), EndLocLon = c(11.55, 11.639, 11.563, 11.526, 11.616, 11.554)), row.names = c(NA, 6L), class = "data.frame")

dput(droplevels(head(waypoints))) structure(list(TripId = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c  ("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee"), class = "factor"), Sequence = c(0L, 1L, 2L, 3L, 4L, 0L), Latitude = c(48.178, 48.18158, 48.18144, 48.1808, 48.17617, 48.098), Longitude = c(11.573, 11.56688, 11.56351, 11.56335, 11.5654, 11.501)), row.names = c(NA, 6L), class = "data.frame")

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

Прикрепленное фото может помочь в понимании соответствующей области: the desired area to be calculated

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

Любые подсказки / предложения с кодами - если возможно - будут очень, очень ценны!

1 Ответ

0 голосов
/ 02 сентября 2018

Вот как я бы подошел к этому, и это может быть неправильно.

Чтобы правильно рассчитать расстояние между двумя продольными и широтными точками, вы обычно используете формулу Хаверсайна, однако это сложное математическое уравнение, поэтому я бы сказал, что именно поэтому были предоставлены значения расстояния.

Мы можем вычислить расстояние между двумя точками данных (x1, y1) и (x2, x2), используя евклидову формулу Пифагора, никогда не думал, что я скажу это после окончания школы. Значение это

distance = square_root ((x2 - x1) ^ 2 + (y2 - y1) ^ 2.

Причина, по которой он сначала возводится в квадрат, заключается в том, что данные Long и Lat могут иметь отрицательные значения. Отрицательные значения long и lat могут использоваться для обозначения направления, то есть на восток. Точки x и y на графике также могут иметь отрицательные значения, не в вашем сценарии, но это хорошая практика, чтобы думать головой.

Теперь возьмите два файла данных, представленных выше, поместите их в текстовый файл и сохраните где-нибудь под рукой. В консоли установите пакет dplyr для запуска моего кода.

install.packages("dplyr")

Оттуда вы можете использовать этот код: # прочитать данные в формате csv с заголовками столбцов, равными True, и сохранить текущие данные # типы через as.is равны True. Вызовите пакет dplyr для использования в текущей сессии. Функция # choose.files () также позволяет пользователю выбирать файлы, которые ему нужны. библиотека (dplyr) read.virtual.line <- read.csv (choose.files (), header = T, as.is = T) read.waypoints <- read.csv (choose.files (), header = TRUE) </p>

# Convert files read into to data.frame and assign to a variable name.
df.virtual.line <- data.frame(read.virtual.line)
df.waypoints <- data.frame(read.waypoints)

# This peice of code is execute from the right of the <- first.
# Calculate the Euclidean distance and assign to dist_scale.
# mutate makes a new column called dist_scale with the result of the above
# calculation.

Новый столбец dist_scale

Tripld  Lon1    Lat1    Lon2    Lat2    distance    dist_scale
bb983d  11.565  48.19   11.55   48.143  7498    0.049335586
da5bgg  11.584  48.157  11.639  48.098  13643   0.080659779
saefeg  11.591  48.142  11.563  48.18   7377    0.047201695

Глядя на первое значение dist_scale. Начальная точка будет 0, а конечное значение 0.049335586.

Остальное вы должны попробовать сами. Я бы посмотрел на это так:

    1. Теперь у вас есть один отрезок.
    1. Получите все отрезки, и у вас будет многоугольник.
      • а. Если y2 - y1 = 0, значит, вы достигли виртуальной линии.
      • б. Остановитесь и идите 3.
    1. Преобразовать все dist_value в тот же масштаб, что и переменная distance .
    1. Рассчитать площадь многоугольника, используя new_distance значения, которые представляют единицу. отрезок на точку данных / значение.
    1. Повторяйте, пока все значения не будут оценены и все области не вычислены.

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

Если вы получили сообщение об ошибке во время написания и запуска кода, сначала выполните поиск в Интернете, прежде чем публиковать его здесь. Есть много ответов, и вы обнаружите, что ваш ответ на вашу проблему не является уникальным. Тип R перед сообщением об ошибке в любой поисковой системе, скорее всего, даст вам необходимую помощь: «R Сообщение об ошибке».

Удачи и надеюсь, что это помогло.

...