Python: Break linestring ขึ้นอยู่กับสภาพ


11

ฉันมี dataframe ของ geopandas ซึ่งเป็นพวงของ linestrings ที่มีข้อมูลบางอย่างที่เกี่ยวข้องกับจุดยอด / จุดแต่ละจุด:

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

คะแนนจะถูกแปลงเป็น linestrings ตาม ID และเรียงตามเวลา

ฉันต้องการทำลาย linestrings ตรงจุดที่ตรงกับเงื่อนไข ตอนนี้คือเมื่อระยะทางระหว่างคะแนนมากกว่าค่าบางอย่าง ในอนาคตอาจเป็นที่ที่ฟังก์ชันของเขตข้อมูลเป็นค่าบางอย่าง ตัวอย่างเช่นแบ่ง linestring เมื่อ Speed ​​ข้าม 5 kph

ปัญหาในปัจจุบันคือบางแทร็กเกิดจากจุดที่มี ID ซ้ำกันดังนั้นการวิ่งย้อนกลับไปมาในระยะทางไกลและฉันต้องการให้ขีดแบ่งเส้นแบ่งเหล่านี้

ความคิดใด ๆ เกี่ยวกับวิธีที่ถูกต้องในการจัดโครงสร้างนี้หรือไลบรารี / วิธีการที่อาจใช้

dataframe มีแทร็กมากกว่า 150k ที่มีหลายจุดต่อแทร็คดังนั้นประสิทธิภาพจะดี

นี่คือตัวอย่างของแทร็ก 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()ยินดีต้อนรับสำเนาของ
ยีน

แก้ไขเพื่อแสดงส่วนหัว
RedM

ฉันเคยใช้ GeoPy (geopy.distance.vincenty) ในอดีตเพื่อสิ่งที่คล้ายกัน ฉันต้องการเชื่อมต่อคะแนน แต่ไม่ต้องการให้พวกเขาเชื่อมต่อหากมันยาวกว่าเกณฑ์ที่กำหนดไว้ ฉันส่งพิกัดแต่ละคู่ผ่านฟังก์ชั่นและเชื่อมต่อพวกเขาก็ต่อเมื่อมันน้อยกว่าเกณฑ์ของฉัน geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

คีย์หลัก / เงื่อนไขการเรียงลำดับสำหรับคุณลักษณะรหัสซ้ำกันคือ: เวลาเทียบกับ ID หรือ ID เทียบกับเวลา
huckfinn

ไม่แน่ใจจริงๆว่าคุณหมายถึงอะไร คะแนนจะถูกจัดกลุ่มตาม ID จากนั้นเรียงลำดับตามเวลาจากนั้นตำแหน่งที่เรียงลำดับที่ใช้ในการสร้างสตริงบรรทัด บางครั้ง ID ซ้ำกันระหว่างวัตถุ ตัวอย่าง: มีรถในเมือง A พร้อม ID = '123' มันกำลังส่งสัญญาณตำแหน่งและเวลาของมัน นอกจากนี้ยังมีรถยนต์ในเมือง B ที่มี ID = '123' และยังส่งสัญญาณตำแหน่งและเวลาที่ถูกอินเตอร์ลีฟ เส้นที่สร้างขึ้นจากจุดเหล่านี้จะกระโดดระหว่าง A และ B
RedM

คำตอบ:


1

ฉันยังไม่ได้ใช้หุ่นดี / geopandas ดังนั้นฉันสามารถให้ 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

ฟังก์ชันระยะทางควรเป็นสิ่งที่ libs ของคุณมีอยู่แล้วหรือคุณจะต้องใช้มันด้วยตัวคุณเอง (เพื่อนสนิทของพีธากอรัสจะช่วยคุณออกไป)

สามารถปรับปรุงประสิทธิภาพได้ตามต้องการจากที่นั่น แต่ควรเป็นจุดเริ่มต้นที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.