पायथन: हालत के आधार पर लिनेस्ट्रिंग को तोड़ें


11

मेरे पास लिनस्टार्स के एक गुच्छा का जियोपैन्डस डेटाफ्रेम है जिसमें प्रत्येक शीर्ष / बिंदु के साथ कुछ डेटा जुड़ा हुआ है:

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

अंक ID के आधार पर linestrings में परिवर्तित हो जाते हैं और Time द्वारा ऑर्डर किए जाते हैं।

मैं उस लाइनस्ट्रेस को तोड़ना चाहता हूं, जहां कुछ शर्त पूरी की जाती है। अभी जब पॉइंट्स के बीच की दूरी कुछ मूल्य से अधिक है। भविष्य में यह हो सकता है जहां डेटा फ़ील्ड का एक फ़ंक्शन कुछ मूल्य है। उदाहरण के लिए, जब स्पीड 5 किलोमीटर प्रति घंटे की रफ्तार से आगे बढ़े तो एक लिनेस्ट्रिंग को विभाजित करें।

वर्तमान समस्या यह है कि कुछ ट्रैक ऐसे बिंदुओं से बनते हैं जिनकी डुप्लिकेट आईडी होती है, इसलिए लिनस्ट्रिंग बड़ी दूरी पर आगे और पीछे कूदता है और मैं चाहता हूं कि इन लाइनों को तोड़ दें।

इस या पुस्तकालयों / विधियों की संरचना करने के सही तरीके पर कोई विचार जो उपयोग में हो सकते हैं?

डेटाफ़्रेम में प्रति ट्रैक कई बिंदुओं के साथ 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.distance.vincenty) का उपयोग किया है। मुझे बिंदुओं को जोड़ने की आवश्यकता थी, लेकिन अगर वे मेरे निर्धारित सीमा से अधिक लंबे थे, तो उन्हें कनेक्ट नहीं करना चाहिए। मैंने फ़ंक्शन के माध्यम से निर्देशांक की प्रत्येक जोड़ी को भेजा और उन्हें केवल तभी जोड़ा जब वे मेरी सीमा से कम थे। geopy.readthedocs.io/en/1.10.0/#geopy.distance.vincenty
JohnR

डुप्लिकेट आईडी सुविधा के लिए प्राथमिक कुंजी / सॉर्ट की स्थिति क्या है: समय बनाम आईडी या आईडी बनाम समय?
हुक्फिन

वास्तव में निश्चित नहीं कि आपका क्या मतलब है। बिंदुओं को आईडी द्वारा वर्गीकृत किया जाता है, फिर समय के अनुसार क्रमबद्ध किया जाता है और फिर उन आदेशित पदों का उपयोग लाइन स्ट्रिंग बनाने के लिए किया जाता है। आईडी को कभी-कभी वस्तुओं के बीच दोहराया जाता है। उदाहरण: ID = '123' के साथ शहर A में एक कार है। यह स्थिति और समय प्रसारित कर रहा है। आईडी = '123' के साथ सिटी बी में एक कार भी है और यह भी स्थिति को प्रेषित कर रही है और समय के लिए हस्तक्षेप किया जाता है। इन बिंदुओं से बनी एक लाइन A और B
RedM

जवाबों:


1

मैंने अभी तक सुडौल / जियोपैन्डस का उपयोग नहीं किया है, इसलिए मैं केवल स्यूडोकोड प्रदान कर सकता हूं:

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

डिस्टेंस फंक्शन कुछ ऐसा होना चाहिए जो आपके लिबास में पहले से ही मौजूद हो, या आपको इसे खुद लागू करना होगा (ol 'friend पाइथागोरस आपकी मदद करेगा)।

वहाँ से आवश्यकतानुसार दक्षता में सुधार किया जा सकता है, लेकिन यह एक अच्छा प्रारंभिक बिंदु होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.