Geopandas में बाउंडिंग बॉक्स द्वारा फ़िल्टर करें?


11

मेरे पास EPSG: 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'

मैं क्या गलत कर रहा हूं?


समस्या इसलिए है क्योंकि आप 'total_bounds' विधि का उपयोग कर रहे हैं। यह केवल बाउंडिंग बॉक्स के अधिकतम और न्यूनतम अंक के साथ एक टपल बनाता है। उपयोग की जाने वाली विधि 'लिफाफा' है; पिछले अपने संबंधित GeoDataFrame का निर्माण करने के लिए ।
xunilk

जवाबों:


6

समस्या इसलिए है क्योंकि आप 'total_bounds' विधि का उपयोग कर रहे हैं। यह केवल बाउंडिंग बॉक्स के अधिकतम और न्यूनतम अंक के साथ एक टपल बनाता है। उपयोग की जाने वाली विधि 'लिफाफा' है; पिछले अपने संबंधित 'GeoDataFrame' का निर्माण करने के लिए। उदाहरण के लिए, GeoDataFrame के रूप में मेरे आकार को पढ़ना :

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

के बॉक्स बाउंडिंग बिल्डिंग pol1 और अपने संबंधित बनाने GeoDataFrame :

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

दोनों GeoDataFrame का परिचय :

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

प्लॉटिंग परिणाम:

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

यहां छवि विवरण दर्ज करें

यह उम्मीद के मुताबिक काम किया।

संपादन नोट:

'Total_bounds' विधि का उपयोग करके (क्योंकि 'लिफाफा' विधि बहुभुज की प्रत्येक विशेषता के लिए बाउंडिंग बॉक्स लौटाता है), यह इस दृष्टिकोण का उपयोग किया जा सकता है:

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 :

मानक पांडा विधियों के अलावा, जियोपांडास cx इंडेक्सर के साथ समन्वय आधारित अनुक्रमण प्रदान करता है , जो एक बाउंडिंग बॉक्स का उपयोग करके स्लाइस करता है। GeoSeries या GeoDataFrame में जियोमेट्री कि बाउंडिंग बॉक्स को इंटरसेक्ट किया जाएगा।


इस समाधान ने मेरे लिए काम किया। धन्यवाद। हालाँकि, मुझे आश्चर्य हो रहा था कि क्या लागू करने का कोई तेज़ तरीका है। फ़िल्टरिंग OSM भूमि-उपयोग और स्थान जो एक प्रांत के बाउंडिंग बॉक्स के भीतर आते हैं।
ईएफएल

ध्यान दें कि समाधान की .cxतुलना में कुछ अलग होता है gpd.overlay: यह उन पंक्तियों का चयन करता है जो बाउंडिंग बॉक्स को इंटरसेक्ट करता है लेकिन जियोमेट्रीज को बरकरार रखता है, जबकि gpd.overlayसमाधान केवल बाउंडिंग बॉक्स में जियोमेट्री के कुछ हिस्सों को वापस करेगा। स्थिति के आधार पर आप एक या दूसरे को चाह सकते हैं।
danvk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.