11 votos

Eliminar las geometrías vacías del geodataframe

Como las geopandas no pueden realizar la superposición/intersección con las líneas, he encontrado una solución:

import geopandas as gpd
import fiona
from shapely.geometry import shape, MultiPolygon, LineString, MultiLineString

lines = gpd.read_file('lines.shp')
polyons= gpd.read_file('polygons.shp')
pol_f = fiona.open('polygons.shp')

pol_shp = MultiPolygon([shape(x["geometry"]) for x in pol_f])

lines2 = lines.geometry.apply(lambda x: x.intersection(pol_shp))
lines2.to_file('lines_int.shp')

Pero no me deja porque hay las geometrías vacías son GeometryCollections.

He intentado filtrar esto, pero no funciona.

lines3 = lines2[lines2.geometry != np.nan]
lines3 = lines2[lines2.geometry == LineString]
lines3 = lines2[lines2.geometry == LineString()]
lines3 = lines2[lines2.geometry == MultiLineString()]
lines3 = lines2[lines2.geometry == MultiLineString]
lines3 = lines2[lines2.geometry != GeometryCollection]

¿Alguna idea?

13voto

J.J. Puntos 131

El GeoDataFrame y GeoSeries tener un is_empty similar al de los objetos de geometría de forma. Puedes utilizarlo para filtrar los vacíos:

In [7]: lines = geopandas.GeoSeries([
   ...:     LineString([(0, 0), (1, 1)]), LineString([]), LineString([(1, 1), (2, 2)])])

In [8]: lines                             
Out[8]: 
0       LINESTRING (0 0, 1 1)
1    GEOMETRYCOLLECTION EMPTY
2       LINESTRING (1 1, 2 2)
dtype: object

In [9]: lines.is_empty                                      
Out[9]: 
0    False
1     True
2    False
dtype: bool

In [10]: lines[~lines.is_empty]                                            
Out[10]: 
0    LINESTRING (0 0, 1 1)
2    LINESTRING (1 1, 2 2)
dtype: object

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X