Eu tenho um quadro de dados de geopandas no EPSG: 4326 e faria um novo quadro de dados que consiste em todas as linhas que se enquadram em uma certa caixa delimitadora.
Primeiro, recebo a caixa delimitadora que me interessa (que na verdade é a caixa delimitadora de outro dataframe):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Então eu faço um quadro de dados que consiste apenas nessa caixa delimitadora:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
E finalmente tento obter todos os recursos que se cruzam com essa caixa delimitadora:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Mas isso me dá AttributeError: No geometry data set yet (expected in column 'geometry'
.
O que estou fazendo de errado?
Respostas:
O problema ocorre porque você está usando o método 'total_bounds'. Produz apenas uma tupla com pontos máximo e mínimo da caixa delimitadora. O método a ser usado é 'envelope'; anterior para criar seu respectivo 'GeoDataFrame'. Por exemplo, lendo meus shapefiles como GeoDataFrame :
Criando caixa delimitadora pol1 e criando seu respectivo GeoDataFrame :
Interseção de ambos GeoDataFrame :
Resultados da plotagem:
Funcionou como esperado.
Nota de edição:
Usando o método 'total_bounds' (como o método 'envelope' retorna a caixa delimitadora para cada recurso dos polígonos), pode-se usar esta abordagem:
e o resultado é idêntico.
fonte
Você pode usar o
cx
método em um quadro de dados geográficos para selecionar linhas dentro de uma caixa delimitadora. Para seus quadros de exemplo:Em http://geopandas.org/indexing.html :
fonte
.cx
faz algo um pouco diferente dagpd.overlay
solução: ele seleciona linhas que cruzam a caixa delimitadora, mas deixa as geometrias intactas, enquanto agpd.overlay
solução retornará apenas as partes das geometrias na caixa delimitadora. Dependendo da situação, você pode querer um ou outro.