Python: Phá vỡ linestring dựa trên điều kiện


11

Tôi có một khung dữ liệu geopandas của một loạt các linestrings có một số dữ liệu được liên kết với mỗi đỉnh / điểm:

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

Các điểm được chuyển đổi thành linestrings dựa trên ID và được sắp xếp theo Thời gian.

Tôi muốn phá vỡ các linestrings nơi tại đó một số điều kiện được đáp ứng. Ngay bây giờ đó là khi khoảng cách giữa các Điểm lớn hơn một số giá trị. Trong tương lai, nó có thể là nơi một chức năng của các trường Dữ liệu là một giá trị. Chẳng hạn, tách một linestring khi Tốc độ vượt qua 5 kph.

Vấn đề hiện tại là một số bản nhạc được hình thành từ các điểm có ID trùng lặp, do đó dòng dõi nhảy qua lại trên khoảng cách lớn và tôi muốn có một ngưỡng để phá vỡ các dòng này.

Bất kỳ ý tưởng về cách chính xác để cấu trúc này hoặc thư viện / phương pháp có thể được sử dụng?

Khung dữ liệu có hơn 150 nghìn bản nhạc với nhiều điểm trên mỗi bản nhạc nên hiệu quả sẽ rất tốt.

Đây là một ví dụ về các bài hát 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...     

Đây là một mẫu từ các điểm DF. Có 18 cột bao gồm Datetime, Point (Lon, Lat), Speed, Size, v.v.

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: Đã thử để rõ ràng hơn một chút.


Cấu trúc của GeoDataFrame của bạn là gì? Một bản sao của gd.head()sẽ được hoan nghênh.
gen

Chỉnh sửa để hiển thị đầu
RedM

Tôi đã sử dụng GeoPy (geopy.distance.vincenty) trong quá khứ cho một cái gì đó tương tự. Tôi cần kết nối các điểm, nhưng không muốn chúng được kết nối nếu chúng dài hơn ngưỡng xác định của tôi. Tôi đã gửi từng cặp tọa độ thông qua hàm và chỉ kết nối chúng nếu chúng nhỏ hơn ngưỡng của tôi. geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

Điều kiện khóa / sắp xếp chính cho tính năng ID trùng lặp: thời gian so với ID hoặc ID so với thời gian là gì?
huckfinn

Không thực sự chắc chắn những gì bạn có ý nghĩa. Các điểm được nhóm theo ID sau đó được sắp xếp theo thời gian và sau đó các vị trí được sắp xếp được sử dụng để tạo chuỗi dòng. ID đôi khi được nhân đôi giữa các đối tượng. Ví dụ: Có một chiếc xe trong thành phố A có ID = '123'. Nó đang truyền tải vị trí và thời gian của nó. Ngoài ra còn có một chiếc xe trong thành phố B với ID = '123' và nó cũng đang truyền các vị trí của nó và thời gian được xen kẽ. Một đường được xây dựng từ những điểm này sẽ nhảy giữa A và B
RedM

Câu trả lời:


1

Tôi chưa sử dụng shapely / geopandas, vì vậy tôi chỉ có thể cung cấp mã giả:

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

Hàm khoảng cách phải là thứ mà libs của bạn đã cung cấp hoặc bạn sẽ phải tự thực hiện nó (Pythagoras bạn thân của ol sẽ giúp bạn giải quyết).

Hiệu quả có thể được cải thiện khi cần thiết từ đó, nhưng nó phải là một điểm khởi đầu tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.