জিওপ্যান্ডে বাউন্ডিং বক্স দিয়ে ফিল্টার করবেন?


11

আমার ইপিএসজি-তে একটি জিওপ্যান্ডাস ডেটাফ্রেম রয়েছে: 4326 এবং আমি নির্দিষ্ট বাউন্ডিং বাক্সের মধ্যে থাকা সমস্ত সারিগুলিকে নিয়ে একটি নতুন ডাটাফ্রেম তৈরি করব।

প্রথমে আমি যে সীমাবদ্ধ বক্সটি যত্ন করি তা পাই (যা আসলে অন্য ডেটাফ্রেমের বাউন্ডিং বাক্স):

print df_sussex.total_bounds
[ -1.57239292  50.57467674   0.14528384  51.27465152]

তারপরে আমি কেবলমাত্র সেই সীমাবদ্ধ বাক্সটি নিয়ে একটি ডেটাফ্রেম তৈরি করি:

pts = gpd.GeoDataFrame(df_sussex.total_bounds)

এবং পরিশেষে আমি সেই সমস্ত বৈশিষ্ট্যগুলি পাওয়ার চেষ্টা করি যা সেই সীমানা বাক্সের সাথে ছেদ করে:

sac_sussex = gpd.overlay(pts, df_sac, how='intersection')

কিন্তু এই আমাকে দেয় AttributeError: No geometry data set yet (expected in column 'geometry'

আমি কি ভুল করছি?


সমস্যাটি কারণ আপনি 'মোট_বাউন্ডস' পদ্ধতিটি ব্যবহার করছেন। এটি কেবল সীমাবদ্ধ বাক্সের সর্বাধিক এবং ন্যূনতম পয়েন্ট সহ একটি টুপল উত্পাদন করে। ব্যবহারের পদ্ধতি হ'ল খাম '; পূর্ববর্তী তার নিজস্ব জিওডাটা ফ্রেম তৈরি করতে ।
xunilk

উত্তর:


6

সমস্যাটি কারণ আপনি 'মোট_বাউন্ডস' পদ্ধতিটি ব্যবহার করছেন। এটি কেবল সীমাবদ্ধ বাক্সের সর্বাধিক এবং ন্যূনতম পয়েন্ট সহ একটি টুপল উত্পাদন করে। ব্যবহারের পদ্ধতি হ'ল খাম '; পূর্ববর্তী তার নিজস্ব 'জিওডাটা ফ্রেম' তৈরি করতে। উদাহরণস্বরূপ, জিওডাটা ফ্রেম হিসাবে আমার শেফফিলগুলি পড়া :

import geopandas as gpd
pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

Pol1 এর বাউন্ডিং বাক্স তৈরি করা এবং এর সাথে সম্পর্কিত জিওডাটা ফ্রেম তৈরি করা :

bounding_box = pol1.envelope
df = gpd.GeoDataFrame(gpd.GeoSeries(bounding_box), columns=['geometry'])

জিওডাটা ফ্রেম উভয়কেই ছেদ করছে :

intersections = gpd.overlay(df, pol8, how='intersection')

প্লটিং ফলাফল:

from matplotlib import pyplot as plt
plt.ion()
intersections.plot() 

এখানে চিত্র বর্ণনা লিখুন

এটি আশানুরূপ কাজ করেছিল।

সম্পাদনা নোট:

'মোট_বাউন্ডস' পদ্ধতিটি ব্যবহার করে (কারণ 'খামে' পদ্ধতিটি বহুভুজগুলির প্রতিটি বৈশিষ্ট্যের জন্য সীমানা বাক্সটি দেয়) এটি এই পদ্ধতির ব্যবহার করা যেতে পারে:

from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Point, Polygon

pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

bbox = pol1.total_bounds

p1 = Point(bbox[0], bbox[3])
p2 = Point(bbox[2], bbox[3])
p3 = Point(bbox[2], bbox[1])
p4 = Point(bbox[0], bbox[1])

np1 = (p1.coords.xy[0][0], p1.coords.xy[1][0])
np2 = (p2.coords.xy[0][0], p2.coords.xy[1][0])
np3 = (p3.coords.xy[0][0], p3.coords.xy[1][0])
np4 = (p4.coords.xy[0][0], p4.coords.xy[1][0])

bb_polygon = Polygon([np1, np2, np3, np4])

df2 = gpd.GeoDataFrame(gpd.GeoSeries(bb_polygon), columns=['geometry'])

intersections2 = gpd.overlay(df2, pol8, how='intersection')

plt.ion()
intersections2.plot()

এবং ফলাফল অভিন্ন।


21

cxএকটি জিওডাটাফ্রেমে পদ্ধতিটি আপনি একটি সীমানা বাক্সের মধ্যে সারি নির্বাচন করতে ব্যবহার করতে পারেন । আপনার উদাহরণ ফ্রেম জন্য:

xmin, ymin, xmax, ymax = df_sussex.total_bounds
sac_sussex = df_sac.cx[xmin:xmax, ymin:ymax]

Http://geopandas.org/indexing.html থেকে :

মান পান্ডাস পদ্ধতি ছাড়াও, GeoPandas সাথে ভিত্তিক ইন্ডেক্স তুল্য উপলব্ধ CX indexer, যা একটি সীমান্ত বাক্স ব্যবহার করে টুকরা। জিওসারিজ বা জিওডাটা ফ্রেমের জ্যামিতিগুলি সীমানা বাক্সকে ছেদ করে ফিরে আসবে।


এই সমাধানটি আমার পক্ষে কাজ করেছিল। ধন্যবাদ. তবে, আমি ভাবছিলাম যে বাস্তবায়নের আরও দ্রুত উপায় আছে কিনা। ফিল্টারিং ওএসএম ল্যান্ড-ব্যবহার এবং যে স্থানগুলি একটি প্রদেশের সীমানা বাক্সের মধ্যে পড়ে।
EFL

দ্রষ্টব্যটি সমাধানের .cxতুলনায় কিছুটা পৃথক করে gpd.overlay: এটি সারিগুলি নির্বাচন করে যা সীমানা বাক্সটিকে ছেদ করে তবে জ্যামিতিগুলি অক্ষত রেখে দেয়, যেখানে gpd.overlayসমাধানটি কেবল সীমানা বাক্সে জ্যামিতির অংশগুলিই ফিরিয়ে আনবে। পরিস্থিতির উপর নির্ভর করে আপনি এক বা অন্যটি পেতে পারেন।
ডানভেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.