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 стовпців, включаючи дату, крапку (Lon, Lat), швидкість, розмір тощо тощо:

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               

EDIT: Намагався бути трохи зрозумілішим.


Яка структура вашої GeoDataFrame? Копія gd.head()вітається.
ген

Відредаговано, щоб показати голову
RedM

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

Яка умова первинного ключа / сортування для функції повторюваного ідентифікатора: time vs. ID або ID vs. time?
huckfinn

Не дуже впевнений, що ти маєш на увазі. Точки групуються за ідентифікатором, потім сортуються за часом, а потім ті упорядковані позиції, які використовуються для створення рядкового рядка. Ідентифікатор іноді дублюється між об'єктами. Приклад: У місті A є автомобіль з ID = '123'. Він передає свою позицію та час. У місті B також є машина з ID = '123', і вона також передає свої позиції, і час перемежовується. Лінія, побудована з цих точок, стрибнула б між A і B
RedM

Відповіді:


1

Я ще не використовував стройних / геопанд, тому можу надати лише псевдокод:

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

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

Ефективність може бути підвищена за необхідності звідти, але це повинно бути хорошим відправною точкою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.