Tengo un marco de datos de encuestas sanitarias con geoetiquetas, llamado momdata
. He convertido el marco de datos en un marco de datos GeoPandas y he utilizado las geoetiquetas como columna de geometría dentro del marco de datos, por ejemplo:
momdata['geometry']
0 POINT (-0.0893 51.4735)
1 POINT (-0.0894 51.4732)
2 POINT (-0.0898 51.4717)
3 POINT (-0.0907 51.4727)
4 POINT (-0.0901 51.4723)
5 POINT (-0.0816 51.4742)
Quiero filtrar el marco de datos para que sólo aparezcan los puntos del Reino Unido. Tengo las coordenadas del Reino Unido en una Geoserie separada, llamada uk_geom, que simplemente tomé del mapa mundial incorporado en GeoPandas:
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
uk_index = world[world.name == "United Kingdom"].index
uk_geom = world.loc[uk_index, 'geometry']
Devuelve uk_geom como GeoSeries de GeoPandas:
type(uk_geom) # geopandas.geoseries.GeoSeries
Simplemente quiero filtrar momdata
para todos los puntos de momdata.geometry que caen dentro de uk_geom, devolviendo un marco de datos de sólo observaciones de encuestas basadas en el Reino Unido. Esto debería ser sencillo.
Lo intenté:
uk_momdata = momdata[momdata.geometry.within(uk_geom)]
pero esto devuelve un marco de datos vacío, cuando sé que algunas de las observaciones de la encuesta se encuentran con seguridad en el Reino Unido.
Por ejemplo:
p1 = momdata.geometry.loc[0]
p2 = momdata.geometry.loc[1]
print(uk_geom.contains(p1)) # returns TRUE
print(uk_geom.contains(p2)) # returns TRUE
Lo he intentado al revés, comprobando qué puntos momdata contiene uk_geom:
uk_geom.contains(momdata.geometry).value_counts() #2040 false points
También cuando pruebo la función 'within' en un punto que sé que está dentro de momdata
Obtengo un error:
print(point8.within(uk_geom)) # AttributeError: 'GeoSeries' object has no attribute '_geom'
He asignado el sistema de referencia de coordenadas correcto:
assert uk_geom.crs == momdata.crs # no problem
También he intentado una función básica "aplicar" utilizando un predicado, pero esto devuelve un error:
momdata[momdata.geometry.apply(lambda p: uk_geom.contains(p))] # Null geometry supports no operations
También he intentado una unión espacial, pero entonces me sale el error de que una de las columnas de la unión no es un DataFrame, ya que por supuesto está intentando unirse en la columna de geometría:
from geopandas.tools import sjoin
join_left_df = sjoin(momdata, uk_geom, how="left")
join_left_df
¿Cómo lo resuelvo?
No consigo que funcione.