জিওপ্যান্ডাস লাইন বহুভুজ ছেদ


11

আমি যেখানে একাধিক লাইন দুটি পৃথক জিওডাটা ফ্রেমের জন্য বহুভুজকে ছেদ করে তা সন্ধান করার চেষ্টা করছি:

from shapely.geometry import Polygon, LineString
import geopandas as gpd

polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])


poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])

উপরের জিওডাটাফ্রেমগুলি দেখতে এটির মতো (একটির বহুভুজ রয়েছে এবং অন্যটির দুটি লাইনে আছে)। আমার কাছে মনে হচ্ছে যেন উভয় রেখা বহুভুজকে ছেদ করে:

বহুভুজ এবং লাইন

তবে ছেদকৃত আউটপুটটি খুব বিভ্রান্তিকর:

print(line_gdf.intersects(poly_gdf))

0 সত্য

1 মিথ্যা

print(line1.intersects(polygon))
print(line2.intersects(polygon))

সত্য

সত্য

কেন geopandas intersectপদ্ধতিটি মানকে আলাদা আউটপুট দেয় shapely?

আমি অ্যানাকোন্ডায় পাইথন ৩.৩.৩ এবং জিওপ্যান্ডাস ০.০.১ ব্যবহার করছি।


যখন আপনি বলেন যে print(line.intersects(polygon))আপনি এমন একটি ভেরিয়েবল অ্যাক্সেস করতে পারেন যা আমি দেখতে পারা যায় না defined আপনি কোডটি সংজ্ঞায়িত করেছেন line1এবং এর line2আগেও। আমি জানি না কেন এটি সত্য হবে।
পল

2
আমি এর উত্তরও জানতে চাই। দেখে মনে হচ্ছে আপনি জিওডাটাফ্রেমে কেবল একটি একক জ্যামিতি কলাম নির্ধারণ করতে পারবেন। আমি মনে করি আপনার লাইন_জিডিএফ ডেটা ফ্রেম দুটি জ্যামিতি কলাম যুক্ত করার চেষ্টা করেছে। পরীক্ষা করে দেখুন geopandas.org/data_structures.html#geodataframe
পল

@ পোল আমার ক্ষমা চেয়েছিলেন, print(line.intersects(polygon))এটি একটি টাইপ ছিল। আমি line1মূলত যা বোঝাতে চেয়েছি তা উল্লেখ করতে আমি প্রশ্ন আপডেট করেছি updated
বগর্ডন

@ পল আমি ডকুমেন্টেশন থেকে দেখতে পাচ্ছি যে দুটি জ্যামিতি কলাম কীভাবে সমস্যা সৃষ্টি করবে, তবে কেন আমি দুটি স্থানে দুটি জ্যামিতি কলাম যুক্ত হবে তা আমি নিশ্চিত নই।
বগর্ডন

line_gdf.infoআপনার কাছে কেবল একটি একক জ্যামিতি কলাম রয়েছে তা নিশ্চিত করে। আমি স্ট্যাম্পড আমি কিছু খুঁজে পেলে অনুসরণ করব।
পল

উত্তর:


7

জিওপ্যান্ডাসে জ্যামিতি ক্রিয়াকলাপের সাথে জিওডাটাফ্রেমগুলির তুলনা করার সময় জ্যামিতিগুলি প্রথম সূচকের সাথে মিলে যায়। যে ক্ষেত্রে কোনও মিলের সূচক নেই (কারণ আপনার কাছে উদাহরণের জন্য কেবল একটি একক বহুভুজ রয়েছে) তারপরে ফলাফলটি হবে False

যদি এটির প্রতিটি বস্তুর তুলনা করা হয় তবে GeoSeriesআপনার পরিবর্তে বুলিয়ান মানগুলির একটি সম্পূর্ণ আয়তক্ষেত্রাকার ডেটাফ্রেম ফিরে পাওয়া দরকার এবং এটি সম্ভবত খুব অদক্ষ।

আপনি যদি সমস্ত জ্যামিতির তুলনা করতে চান তবে আপনার কাছে দুটি বিকল্প রয়েছে। প্রথম (এবং সম্ভবত সবচেয়ে সহজ) হ'ল জিওপ্যান্ডাস sjoinপদ্ধতিটি ব্যবহার করা :

gpd.sjoin(line_gdf, poly_gdf, op='intersects')

GeoDataFrameডানদিকে বস্তুর সূচী সহ তারা ডানদিকে ছেদ করে প্রতিটি জ্যামিতির জন্য পুনরাবৃত্তি বাম ডাটাফ্রেমের প্রতিটি বস্তুর জ্যামিতির সাথে এটি একটি নতুন ফেরৎ দেয় :

                        geometry  index_right
0  LINESTRING (0.5 0.5, 0.7 0.7)            0
1  LINESTRING (0.9 0.9, 0.2 0.6)            0

দ্বিতীয় পদ্ধতিটি আমাদের কাছে আয়তক্ষেত্রাকার ডেটাফ্রেম ফিরিয়ে আনার প্যান্ডাস applyপদ্ধতি GeoSeries:

line_gdf.geometry.apply(lambda g: poly_gdf.intersects(g))

যা ঘুরে ফিরে আসে (ডেটাফ্রেমগুলি বাড়ার সাথে সাথে ক্রমবর্ধমান অদক্ষতার সাথে):

index_right     0
index_left
0            True
1            True

সাধারণভাবে, আপনার যদি বর্গ ম্যাট্রিক্সের প্রয়োজন না হয় তবে আমার পরামর্শটি sjoinপদ্ধতিটিতে লেগে থাকা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.