Python: разрыв строки в зависимости от условия


11

У меня есть геопанда с фреймом данных из ряда строк, у которого есть некоторые данные, связанные с каждой вершиной / точкой:

Point_x = (Lat, Lon, Time, ID, Data1, Data2, Data3)

Точки преобразуются в линейные линии на основе идентификатора и упорядочены по времени.

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

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

Любые идеи о том, как правильно структурировать это или библиотеки / методы, которые могут быть полезны?

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

Вот пример треков DF:

ID         geometry                                                  
204235000  LINESTRING (37.62001 -28.99535, 37.62015 -28.9...   
205400000  LINESTRING (3.807816666666666 -18.083181666666...   
207138000  LINESTRING (22.73206 -34.97915833333333, 22.73...   
209016000  LINESTRING (8.447673333333331 -23.522783333333...     

Вот образец из точек DF. Есть 18 столбцов, включая Datetime, Point (Lon, Lat), Speed, Size и т. Д .:

Index           Heading   Latitude  Longitude       ID  
20              92.8 -35.946802  13.089695  210725000               
21              93.5 -35.946912  13.091808  210725000               
22              95.4 -35.965520  13.497698  210725000               
23              94.7 -35.965803  13.501898  210725000               
24              94.9 -35.965987  13.504573  210725000               

РЕДАКТИРОВАТЬ: пытался быть немного яснее.


Какова структура вашего GeoDataFrame? Копия gd.head()будет приветствоваться.
ген

Отредактировано, чтобы показать голову
RedM

Я использовал GeoPy (geopy.distance.vincenty) в прошлом для чего-то подобного. Мне нужно было соединить точки, но я не хотел, чтобы они были подключены, если они были длиннее моего определенного порога. Я отправлял каждую пару координат через функцию и связывал их, только если они были меньше моего порога. geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

Каков первичный ключ / условие сортировки для функции дублирования идентификатора: время против идентификатора или идентификатор против времени?
huckfinn

Не совсем уверен, что вы имеете в виду. Точки группируются по идентификатору, затем сортируются по времени, а затем эти упорядоченные позиции используются для создания строки. Идентификатор иногда дублируется между объектами. Пример: в городе A есть автомобиль с ID = '123'. Он передает свою позицию и время. В городе B также есть автомобиль с ID = '123', который также передает свои позиции и время чередуется. Линия, построенная из этих точек, прыгнет между А и В
RedM

Ответы:


1

Я еще не использовал shape / геопанду, поэтому могу предоставить только псевдокод:

distance_threshold = 50 # Value at which distance to cut off
new_lines = [] # Array to hold the newly created, split lines
new_line_marker = 0 # Let's remember where our new line starts
for linestring in linestrings: # Iterate over all linestrings
  for i, coord in enumerate(linestring.coords[:-1]): # Iterate over all coords of the linestring
    if distance(coord, coords[i+1]) >= distance_threshold: # Check if threshold is met
      # If condition is met, we generate a new linestring,
      # starting from the last split to the current one
      new_lines[] = new LineString(coords[new_line_marker:i])
      new_line_marker = i+1 # remember to reset the marker

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.