Python:根据条件中断线串


11

我有一堆线串的geopandas数据框,其中的一些数据与每个顶点/点相关:

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

这些点将根据ID转换为线串,并按时间排序。

我想在满足某些条件的地方断开线串。此时,点之间的距离大于某个值。将来,数据字段的功能可能会有所价值。例如,当Speed超过5 kph时拆分线串。

当前的问题是,某些轨道是由具有重复ID的点形成的,因此线串在很长的距离上来回跳跃,我希望有一个阈值来打破这些线。

关于构建此方法的正确方法或可能有用的库/方法的任何想法?

该数据帧有超过15万条磁道,每个磁道中有许多点,因此效率会很高。

这是轨道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列,包括日期时间,时间点(经度,纬度),速度,大小等:

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()将受到欢迎。
基因

编辑显示
首相

我过去曾使用GeoPy(geopy.distance.vincenty)做类似的事情。我需要连接点,但是如果它们长于我确定的阈值,则不希望它们连接。我通过函数发送了每对坐标,并且仅在它们小于我的阈值时才连接它们。geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

重复ID功能的主键/排序条件是什么:时间与ID或ID与时间?
huckfinn

不太确定您的意思。这些点按ID分组,然后按时间排序,然后按顺序用于创建线串。该ID有时在对象之间重复。示例:城市A中有一辆ID ='123'的汽车。它正在传递其位置和时间。在城市B中也有一辆ID ='123'的汽车,它也在传输其位置,并且时间交错。由这些点构成的线将在A和B之间跳跃
-RedM

Answers:


1

我还没有使用整形/ geopandas,所以我只能提供伪代码:

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

距离函数应该是您的库已经提供的功能,否则您必须自己实现它(亲朋好友毕达哥拉斯将为您提供帮助)。

从那里可以根据需要提高效率,但这应该是一个很好的起点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.