Python: Linestring'i koşullara göre ayırın


11

Her köşe / nokta ile ilişkili bazı veriler olan linestrings bir grup geopandas veri çerçevesi var:

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

Noktalar kimliğe göre linestring'lere dönüştürülür ve Time tarafından sıralanır.

Ben bazı koşulların karşılandığı noktada linestrings kırmak istiyorum. Şu anda Puanlar arasındaki mesafe bir değerden büyük olduğunda. Gelecekte, Veri alanlarının bir fonksiyonunun bir değer olduğu yerde olabilir. Örneğin, Hız 5 km / s'yi geçtiğinde bir linest bölün.

Şu anki sorun, bazı izlerin yinelenen kimliklere sahip noktalardan oluşması, böylece linestring büyük mesafelerde ileri geri atlıyor ve bu çizgileri kırmak için bir eşik istiyorum.

Bunu veya doğru olabilecek kütüphaneleri / yöntemleri yapılandırmak için doğru bir fikrin var mı?

Veri çerçevesi, parça başına birçok noktaya sahip 150 binden fazla parçaya sahiptir, bu nedenle verimlilik iyi olurdu.

İşte parça DF'sine bir örnek:

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...     

İşte DF noktalarından bir örnek. Tarih, Nokta (Lon, Lat), Hız, Boyut vb. Dahil 18 sütun vardır:

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: Biraz daha net olmaya çalıştı.


GeoDataFrame'inizin yapısı nedir? Bir kopyası gd.head()memnuniyetle karşılanacaktır.
gen

Kafa göstermek için düzenlendi
RedM

Geçmişte benzer bir şey için GeoPy (geopy.distance.vincenty) kullandım. Puanları birleştirmem gerekiyordu, ancak belirlenen eşik değerimden daha uzun olsaydı bağlantılarını istemedim. Her koordinat çiftini fonksiyon aracılığıyla gönderdim ve sadece eşik değerimden azlarsa bağladım. geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

Yinelenen kimlik özelliği için birincil anahtar / sıralama koşulu nedir: zamana karşı kimlik veya ID'ye karşı zaman?
huckfinn

Ne demek istediğinden emin değilim. Noktalar kimliğe göre gruplanır, daha sonra zamana göre sıralanır ve daha sonra bir sıra dizesi oluşturmak için kullanılan sıralı konumlar. Kimlik bazen nesneler arasında çoğaltılır. Örnek: A şehrinde ID = '123' olan bir araba var. Konumunu ve zamanını iletiyor. Ayrıca B şehrinde ID = '123' bulunan bir araba var ve aynı zamanda pozisyonlarını da iletiyor ve zamanlar serpiştiriliyor. Bu noktalardan inşa edilen bir çizgi A ve B arasında atlar
RedM

Yanıtlar:


1

Henüz düzgün / geopandas kullanmadım, bu yüzden sadece sözde kod sağlayabilirim:

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

Mesafe işlevi, kitaplarınızın zaten sunduğu bir şey olmalı veya bunu kendiniz uygulamak zorunda kalacaksınız (arkadaşınız Pisagor size yardımcı olacaktır).

Verimlilik buradan gerektiği gibi geliştirilebilir, ancak iyi bir başlangıç ​​noktası olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.