Python: Hentikan linestring berdasarkan kondisi


11

Saya memiliki kerangka data geopanda dari sekelompok linestrings yang memiliki beberapa data yang terkait dengan setiap titik /:

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

Poin dikonversi ke linestrings berdasarkan ID dan dipesan oleh Time.

Saya ingin memecahkan linestrings di mana pada titik di mana beberapa kondisi terpenuhi. Saat ini juga ketika jarak antara Poin lebih besar dari beberapa nilai. Di masa depan bisa jadi di mana fungsi bidang Data adalah beberapa nilai. Misalnya, pisahkan linestring ketika Kecepatan melintasi 5 kpj.

Masalah saat ini adalah bahwa beberapa trek terbentuk dari titik-titik yang memiliki duplikat ID sehingga linestring melompat bolak-balik jarak yang sangat jauh dan saya ingin ambang batas untuk memecah garis-garis ini.

Adakah ide tentang cara yang benar untuk menyusun ini atau perpustakaan / metode yang mungkin berguna?

Kerangka data memiliki lebih dari 150k trek dengan banyak titik per trek di dalamnya sehingga efisiensi akan lebih baik.

Berikut adalah contoh trek 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...     

Berikut ini contoh dari poin DF. Ada 18 kolom termasuk Datetime, Point (Lon, Lat), Speed, Size dll.

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: Berusaha sedikit lebih jelas.


Apa struktur GeoDataFrame Anda? Salinan gd.head()akan disambut.
gen

Diedit untuk menunjukkan kepala
RedM

Saya telah menggunakan GeoPy (geopy.distance.vincenty) di masa lalu untuk sesuatu yang serupa. Saya perlu menghubungkan titik, tetapi tidak ingin mereka terhubung jika mereka lebih lama dari batas yang saya tentukan. Saya mengirim setiap pasangan koordinat melalui fungsi dan menghubungkannya hanya jika mereka kurang dari ambang batas saya. geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

Apa kunci utama / kondisi penyortiran untuk fitur ID duplikat: waktu vs. ID atau ID vs waktu?
huckfinn

Tidak begitu yakin apa yang Anda maksud. Poin dikelompokkan berdasarkan ID kemudian diurutkan berdasarkan waktu dan kemudian posisi yang dipesan tersebut digunakan untuk membuat string garis. ID terkadang diduplikasi di antara objek. Contoh: Ada mobil di kota A dengan ID = '123'. Itu mentransmisikan posisi dan waktu itu. Ada juga mobil di kota B dengan ID = '123' dan itu juga mentransmisikan posisi itu dan waktunya disisipkan. Garis yang dibangun dari titik-titik ini akan melompat antara A dan B
RedM

Jawaban:


1

Saya belum pernah menggunakan shapely / geopanda, jadi saya hanya bisa memberikan 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

Fungsi jarak haruslah sesuatu yang sudah ditawarkan lib Anda, atau Anda harus mengimplementasikannya sendiri (teman Pythagoras akan membantu Anda).

Efisiensi dapat ditingkatkan sesuai kebutuhan dari sana, tetapi harus menjadi titik awal yang baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.