जियोपांडस लाइन बहुभुज अंतर्ग्रहण


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?

मैं एनाकोंडा पर पायथन 3.5.3 और जियोपैन्डास 0.2.1 का उपयोग कर रहा हूं।


जब आप कहते हैं कि print(line.intersects(polygon))आप एक वैरिएबल का उपयोग कर रहे हैं, जो अब तक मुझे दिखाई नहीं देता है। आपने पहले line1और line2कोड में परिभाषित किया है । मुझे नहीं पता कि यह सच क्यों होगा।
पॉल

2
मैं इसका उत्तर भी जानना चाहता हूं। ऐसा लगता है कि आप केवल एक ही ज्यामिति कॉलम को जियोडेटाफ़्रेम पर असाइन कर सकते हैं। मुझे लगता है कि आपका line_gdf डेटा फ़्रेम दो ज्यामिति कॉलम जोड़ने की कोशिश करता है। की जाँच करें geopandas.org/data_structures.html#geodataframe
पॉल

@ मेरा माफ़ी मांगना, print(line.intersects(polygon))एक टाइपो था। मैंने प्रश्न को अद्यतन करने के लिए कहा line1है कि मैं मूल रूप से किसका मतलब है।
बेगार्डन

@Paul मैं प्रलेखन से देख सकता हूं कि दो ज्यामिति कॉलम होने से कोई समस्या पैदा होगी, लेकिन मुझे पूरा यकीन नहीं है कि दो ज्यामिति स्तंभों को पहले स्थान पर क्यों जोड़ा जाएगा।
बेगार्डन

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विधि से चिपके रहने की होगी ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.