শ্যাপলির स्न্পিং (জিও স্ন্যাপ) প্রত্যাশার মতো কাজ করছে না কেন?


14

আমি শেপলি / জিওপান্ডাস ব্যবহার করে একে অপরের কাছে দুটি লাইন স্ন্যাপ করার চেষ্টা করছি তবে স্ন্যাপিংয়ের ফলাফলটি খুব অদ্ভুত। আমি চেষ্টা করেছিলাম :

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")

এবং এই ফলাফল পেয়েছে:

lines1 = লাল লাইন

লাইন 2 = কালো রেখা

ছটফট করার আগে

স্নাপিংয়ের পরে (সহনশীলতার হিসাবে 14 দিয়ে): নীল রেখাগুলি হ'ল स्न্পিংয়ের ফলাফল

এই ক্ষেত্রে লাইনগুলি সঠিকভাবে বিচ্ছিন্ন হয় ছটফট করার পরে

আর একটি উদাহরণ যেখানে এটি প্রত্যাশার মতো কার্যকর হয়নি: (ছোড়ার আগে) ছটফট করার আগে

এবং snapping পরে ফলাফল এখানে। কেবল একটি অংশ কালো রেখায় (দক্ষিণ দিকে) ছড়িয়ে পড়ে। যদিও মূল লাইনগুলি বেশ কাছাকাছি এবং 14 টি ফেটের মধ্যে রয়েছে ছটফট করার পরে

যদি আমি সহনশীলতা বৃদ্ধি করি তবে আমি একটি ভুল আউটপুট পেতে পারি, এরকম কিছু (20 টি সংক্ষেপের সহনশীলতা হিসাবে সংজ্ঞায়িত করার পরে, সবুজ রেখার ফলাফল):

সহনশীলতা হিসাবে 20 পরে

কেন स्न্পিং সঠিকভাবে কাজ করছে না সে সম্পর্কে কোনও ধারণা? এই সমস্যাটি কীভাবে সমাধান করবেন সে সম্পর্কে কোনও পরামর্শ?



@ জেন আপনার নিজের মন্তব্যটি এমন একটি উত্তরে রূপান্তর করা উচিত যা আমি মনে করি।
nmtoken

এই সমস্যাটি পুনরুত্পাদন করতে আপনি কি ডেটা বা এর অংশগুলি ভাগ করতে পারেন?
বাগম্যানট 123

2
প্রদত্ত আকারে 1.6 ব্যবহারকারীর ম্যানুয়াল: "শেপলি.পসে স্ন্যাপ () ফাংশন প্রদত্ত সহনশীলতার সাথে দ্বিতীয় জ্যামিতিতে একটি জ্যামিতির শীর্ষকে একটি জ্যামিতির শীর্ষকে স্ন্যাপ করে" " আমি যেমন বুঝতে পারি, এটি একে অপরের নিকটে থাকা জ্যামিতিগুলি স্ন্যাপ দেয় না, এটি একে অপরের কাছাকাছি অবস্থিত তাদের শীর্ষগুলি স্ন্যাপ করে। সুতরাং কোনও জ্যামিতি যদি অন্য জ্যামিতির খুব কাছাকাছি থাকে তবে এটি তাদের প্রান্তিক প্রান্তের মধ্যে স্ন্যাপ করে।
কাদির Şাহবাজ

উত্তর:


6

shapely.ops.snapফাংশনটি কেবল জ্যামিতির উল্লম্বে স্ন্যাপ করে।

নীচের চিত্র দেখুন। বামদিকে, লাল প্রান্তিটি নীল প্রান্তে ছড়িয়ে পড়া সহনশীলতার মধ্যে রয়েছে, সুতরাং এটি স্ন্যাপ হবে। ডানদিকে লাল মেরুদণ্ডগুলি হুবহু সহ্য করার বাইরে (প্রান্তের কাছাকাছি থাকা সত্ত্বেও!)।

স্নেপিং সহনশীলতার দৃশ্যায়ন

সুদৃশ্য প্রান্তগুলিতে বিছানার জন্য অ্যালগরিদম সরবরাহ করে না। এটি ব্যবহার করে লিখতে খুব বেশি অসুবিধা হওয়া উচিত নয় 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:
chrislarson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.