Shapely की तड़क भड़क (GEO snaps) उम्मीद के मुताबिक काम क्यों नहीं कर रही है?


14

मैं Shapely / Geopandas का उपयोग करते हुए एक दूसरे को दो लाइनें खींचने की कोशिश कर रहा हूं, लेकिन तड़क का परिणाम बहुत ही अजीब है। मैंने कोशिश की :

import geopandas as gpd
from shapely.geometry import *
from shapely.ops import snap

lines1 = gpd.GeoDataFrame.from_file('lines1.shp')
lines1 = lines1.to_crs({'init': 'epsg:2227'})
lines2 = gpd.GeoDataFrame.from_file('lines2.shp')
lines2 = lines2.to_crs({'init': 'epsg:2227'})
res = lines1
lines2_union = lines2.geometry.unary_union
res.geometry = res.geometry.apply(lambda x: snap(x, lines2_union, 14))
res.to_file('result.shp', driver="ESRI Shapefile")

और यह परिणाम मिला:

लाइनों 1 = लाल लाइनें

लाइनें 2 = काली रेखाएँ

तड़कने से पहले

तड़क के बाद (एक सहिष्णुता के रूप में 14 के साथ): नीली रेखाएं तड़क के परिणाम हैं

इस मामले में लाइनें सही ढंग से तड़क रही हैं तड़कने के बाद

एक और उदाहरण जहां यह उम्मीद के मुताबिक काम नहीं किया: (तड़कने से पहले) तड़कने से पहले

और यहाँ तड़क के बाद परिणाम है। केवल एक भाग काली रेखा (दक्षिण की ओर) में तड़क जाता है। हालांकि मूल पंक्तियां बहुत करीब हैं और 14 जाल के भीतर हैं तड़कने के बाद

यदि मैं सहनशीलता बढ़ाता हूं तो मुझे एक गलत आउटपुट मिलता है, कुछ ऐसा है (स्नैपिंग की सहिष्णुता के रूप में 20 को परिभाषित करने के बाद, ग्रीन लाइन परिणाम है):

एक सहिष्णुता के रूप में 20 के बाद

तड़क क्यों ठीक से काम नहीं कर रहा है पर कोई विचार? इस समस्या को हल करने के बारे में कोई सुझाव?



@ मेरे विचार से आपको अपनी टिप्पणी को एक उत्तर में बदलना चाहिए।
nmtoken

क्या आप इस मुद्दे को पुन: पेश करने के लिए डेटा या इसके कुछ हिस्सों को साझा कर सकते हैं?
Bugmenot123

2
बशर्ते शाप्ली 1.6 यूजर मैनुअल: "स्नैप () फंक्शन सुडौल रूप में हो। एक ज्यामिति में कोने को एक दिए गए सहिष्णुता के साथ दूसरे ज्यामिति में कोने तक ले जाता है।" जैसा कि मैं समझता हूं, यह एक दूसरे के करीब आने वाले जियोमेट्री को नहीं छीनता है, यह एक दूसरे के करीब उनके छोरों को छीनता है। इसलिए यदि कोई ज्यामिति अन्य ज्यामिति के करीब है, तो यह दहलीज के भीतर उनके कोने को छीन लेता है।
कादिर Kadबज

जवाबों:


6

shapely.ops.snapसमारोह केवल ज्यामिति के कोने करने के लिए तस्वीरें।

चित्रण नीचे देखें। बाईं ओर, लाल शीर्ष, नीले शीर्ष के लिए तड़क सहनशीलता के भीतर है, इसलिए यह स्नैप करेगा। दाईं ओर लाल शीर्ष स्नेपिंग सहिष्णुता के बाहर है (किनारे के करीब होने के बावजूद!)।

तड़क-भड़क सहिष्णुता दृश्य

Shapely किनारों के लिए टांके लगाने के लिए एक एल्गोरिथ्म प्रदान नहीं करता है। shapely.ops.nearest_pointsहालांकि इसका उपयोग करके लिखना मुश्किल नहीं होना चाहिए । ऐसा कुछ (परीक्षण नहीं किया गया है, और विशेष रूप से कुशल नहीं):

from shapely.ops import nearest_points

def snap(g1, g2, threshold):
    coordinates = []
    for x, y in g1.coords:  # for each vertex in the first line
        point = Point(x, y)
        p1, p2 = nearest_points(point, g2)  # find the nearest point on the second line
        if p1.distance(p2 <= threshold):
            # it's within the snapping tolerance, use the snapped vertex
            coordinates.append(p2.coords[0])
        else:
            # it's too far, use the original vertex
            coordinates.append((x, y))
    # convert coordinates back to a LineString and return
    return LineString(coordinates)

बहुत अच्छा है, लेकिन मुझे लगता if p1.distance(p2 <= threshold):हैif p1.distance(p2) <= threshold:
क्रिसलसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.