Python: rupture de la chaîne de caractères en fonction de la condition

11

J'ai un cadre de données géopandas d'un tas de chaînes de lignes qui ont des données associées à chaque sommet / point:

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

Les points sont convertis en chaînes de lignes en fonction de l'ID et classés par heure.

Je veux briser les chaînes de lignes où au point où une condition est remplie. En ce moment, c'est quand la distance entre les points est supérieure à une valeur. À l'avenir, cela pourrait être le cas où une fonction des champs de données a une certaine valeur. Par exemple, divisez une chaîne de caractères lorsque la vitesse passe à 5 km / h.

Le problème actuel est que certaines des pistes sont formées à partir de points qui ont des identifiants en double, de sorte que la chaîne de caractères saute d'avant en arrière sur d'énormes distances et je veux un seuil pour briser ces lignes.

Avez-vous des idées sur la bonne façon de structurer cela ou des bibliothèques / méthodes qui pourraient être utiles?

La trame de données a plus de 150 000 pistes avec de nombreux points par piste, donc l'efficacité serait agréable.

Voici un exemple des pistes 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...     

Voici un exemple des points DF. Il y a 18 colonnes comprenant Datetime, Point (Lon, Lat), Speed, Size etc etc:

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: J'ai essayé d'être un peu plus clair.

RedM
la source
Quelle est la structure de votre GeoDataFrame? Une copie de gd.head()serait la bienvenue.
gène
Modifié pour montrer la tête
RedM
J'ai utilisé GeoPy (geopy.distance.vincenty) dans le passé pour quelque chose de similaire. J'avais besoin de connecter des points, mais je ne voulais pas qu'ils soient connectés s'ils étaient plus longs que mon seuil déterminé. J'ai envoyé chaque paire de coordonnées via la fonction et je ne les ai connectées que si elles étaient inférieures à mon seuil. geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR
Quelle est la clé primaire / condition de tri pour la fonction d'ID en double: heure vs ID ou ID vs heure?
huckfinn
Je ne sais pas vraiment ce que tu veux dire. Les points sont regroupés par ID puis triés par heure, puis par ces positions ordonnées utilisées pour créer une chaîne de lignes. L'ID est parfois dupliqué entre les objets. Exemple: il y a une voiture dans la ville A avec ID = '123'. Il transmet sa position et son temps. Il y a aussi une voiture dans la ville B avec ID = '123' et elle transmet également ses positions et les temps sont entrelacés. Une ligne construite à partir de ces points sauterait entre A et B
RedM

Réponses:

1

Je n'ai pas encore utilisé / geopandas galbé, donc je ne peux fournir que le pseudocode:

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

La fonction de distance devrait être quelque chose que vos bibliothèques offrent déjà, ou vous devrez l'implémenter vous-même (mon copain Pythagoras vous aidera).

L'efficacité peut être améliorée selon les besoins à partir de là, mais cela devrait être un bon point de départ.

Senshi
la source