Geopandalarda sınırlayıcı kutuya göre filtrele?


11

EPSG: 4326'da bir geopandas veri çerçevesi var ve belirli bir sınırlayıcı kutunun içine giren tüm satırlardan oluşan yeni bir veri çerçevesi yapardım.

İlk ben (aslında başka bir veri çerçevesinin sınırlayıcı kutusu) umurumda sınırlayıcı kutu olsun:

print df_sussex.total_bounds
[ -1.57239292  50.57467674   0.14528384  51.27465152]

Sonra sadece bu sınırlama kutusundan oluşan bir veri çerçevesi yapmak:

pts = gpd.GeoDataFrame(df_sussex.total_bounds)

Ve son olarak bu sınırlayıcı kutu ile kesişen tüm özellikleri almaya çalışıyorum:

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

Ama bu bana veriyor AttributeError: No geometry data set yet (expected in column 'geometry'.

Neyi yanlış yapıyorum?


Sorun 'total_bounds' yöntemini kullanmanızdır. Sadece sınırlama kutusunun maksimum ve minimum noktalarına sahip bir demet oluşturur. Kullanılacak yöntem 'zarf'tır; önceki GeoDataFrame oluşturmak için .
xunilk

Yanıtlar:


6

Sorun 'total_bounds' yöntemini kullanmanızdır. Sadece sınırlama kutusunun maksimum ve minimum noktalarına sahip bir demet oluşturur. Kullanılacak yöntem 'zarf'tır; önceki 'GeoDataFrame' oluşturmak için. Örneğin, şekil dosyalarımı GeoDataFrame olarak okuma :

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

Pol1 sınırlama kutusu oluşturma ve ilgili GeoDataFrame oluşturma :

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

Her iki GeoDataFrame'i de kesişen :

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

Sonuçları çizme:

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

resim açıklamasını buraya girin

Beklendiği gibi çalıştı.

Düzenleme Notu:

'Total_bounds' yöntemini kullanarak ('zarf' yöntemi çokgenlerin her bir özelliği için sınırlama kutusunu döndürdüğü için) bu yaklaşım kullanılabilir:

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

ve sonuç aynıdır.


21

cxBir sınırlama kutusundaki satırları seçmek için bir coğrafi veri çerçevesindeki yöntemi kullanabilirsiniz . Örnek çerçeveleriniz için:

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

Http://geopandas.org/indexing.html adresinden :

Standart panda yöntemlerine ek olarak, GeoPandas ayrıca bir sınırlama kutusu kullanarak dilimleyen cx indeksleyicisi ile koordinat tabanlı indeksleme de sağlar . GeoSeries veya GeoDataFrame içindeki sınırlama kutusuyla kesişen geometriler döndürülür.


Bu çözüm benim için çalıştı. Teşekkür ederim. Ancak, uygulamanın daha hızlı bir yolu olup olmadığını merak ediyordum. OSM arazi kullanımını ve bir eyaletin sınırlayıcı kutusuna giren yerleri filtreleme.
EFL

Bunun çözümden .cxbiraz farklı bir şey yaptığını unutmayın gpd.overlay: sınırlayıcı kutuyla kesişen satırları seçer, ancak geometrileri olduğu gibi bırakır, ancak gpd.overlayçözüm yalnızca sınırlayıcı kutudaki geometrilerin parçalarını döndürür. Duruma bağlı olarak birini ya da diğerini isteyebilirsiniz.
danvk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.