4 votos

Encontrar puntos lat y long csv en un polígono shapefile con índice espacial geopandas

Tengo un csv con dos conjuntos de puntos de latitud y longitud, y un shapefile con espg 4326. Quiero encontrar qué puntos están dentro del shapefile. He seguido la guía aquí que utiliza un índice espacial para acelerar la búsqueda, pero me encuentro con un error.

El csv tiene el siguiente aspecto:

e6ed541a288f13745d2755a79372c0c4,fc707fee61baa13b40278a70c679b9a7,3fe94a002317b5f9259f82690aeea4cd,1,2016-11-01T02:03:18.000Z,2,2016-11-01T03:01:13.000Z,2,51.456,0.146,51.506,-0.125,false,false,EE,2,3,2,,,,
36e6a9d201be3957fb78be4dfaacb932,d3cbd057ca3bf69f6805d054b4a228c5,52720e003547c70561bf5e03b95aa99f,1,2016-11-01T16:21:45.467Z,2,2016-11-01T16:43:01.627Z,2,51.499,-0.008,51.506,-0.101,false,false,EE,1,1,1,,,,
f15a4077cc79217e620270a24c127ed4,581c63e4232ae5208f3ae23a09fff3ea,13f9896df61279c928f19721878fac41,1,2016-11-01T20:31:36.000Z,2,2016-11-01T21:21:10.000Z,2,51.529,-0.124,51.512,-0.092,false,false,EI,2,2,1,,,,
bcd71b06e56e2e023fa055a40ee03f20,0ed657e42b4d820eed2affd146067623,3fe94a002317b5f9259f82690aeea4cd,1,2016-11-01T22:58:42.000Z,2,2016-11-01T23:27:24.000Z,2,51.503,-0.113,51.505,-0.086,false,false,EE,2,3,2,,,,

Mi código hasta ahora es:

trip = pd.read_csv(r'test\TripRecordsReporttrips.csv', sep=',',header=None, usecols=[0, 4, 8, 9, 10, 11],names=['TripID', 'Date', 'StartLat', 'StartLon','EndLat','EndLon'])
geometry = [Point(xy) for xy in zip(trip['StartLon'], trip['StartLat'])]
geometry2 = [Point(xy) for xy in zip(trip['EndLon'], trip['EndLat'])]
trip = trip.drop(['StartLon', 'StartLat','EndLon','EndLat'], axis=1)
starts = GeoDataFrame(trip, crs=crs, geometry=geometry) #turn dataframe into geodataframe
ends = GeoDataFrame(trip, crs=crs, geometry=geometry2)
FRC1  = geopandas.GeoDataFrame.from_file('FRC1Shapefile.shp') # import FRC1 polygon

spatial_index = starts.sindex
possible_matches_index = list(spatial_index.intersection(FRC1.bounds))
possible_matches = starts.iloc[possible_matches_index]
precise_matches = possible_matches[possible_matches.intersects(FRC1)]

el error que estoy recibiendo es de RTree:

RTreeError: Coordinates must be in the form (minx, miny, maxx, maxy) or (x, y) for 2D indexes

EDITAR: Aquí hay una imagen de los puntos que sjoin está seleccionando. enter image description here

0 votos

Te sugiero que subas un pequeño conjunto de datos de muestra para plantear más respuestas potenciales porque reproducirlo no podría ser muy rápido...

1 votos

He añadido a mi pregunta original

3voto

GreyCat Puntos 146

Hay formas más fáciles, mira Una unión espacial más eficiente en Python sin QGIS, ArcGIS, PostGIS, etc. o Comprobar si un punto está dentro de un multipolígono con Python .

1) Utilizar directamente un GeoPandas spatial-join con el comando sjoin que incorpora un índice espacial (rtree, línea 29 de sjoin.py )

import pandas as pd
trip = pd.read_csv('TripRecordsReporttrips.csv', sep=',',header=None, usecols=[0, 4, 8, 9, 10, 11],names=['TripID', 'Date', 'StartLat', 'StartLon','EndLat','EndLon'])
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(trip['StartLon'], trip['StartLat'])]
geometry2 = [Point(xy) for xy in zip(trip['EndLon'], trip['EndLat'])]
trip = trip.drop(['StartLon', 'StartLat','EndLon','EndLat'], axis=1)
crs = {'init' :'epsg:4326'}
import geopandas as gp
starts = gp.GeoDataFrame(trip, crs=crs, geometry=geometry)
ends  = gp.GeoDataFrame(trip, crs=crs, geometry=geometry2)
starts.head()

enter image description here

 FRC1  = gp.read_file('polygons.shp')

enter image description here

2) Ahora utilice sjoin

from geopandas.tools import sjoin
pointInPolys = sjoin(starts, FRC1, how='left',op="within")

enter image description here

El punto 0 está dentro del polígono 2, los puntos 2, 3 están dentro del polígono 1, el punto 1 no está en un polígono

Eliminar los valores Nan: los puntos no están en un polígono

pointInPolys = pointInPolys.dropna()
pointInPolys 

enter image description here

3) Conclusión

Estos 3 puntos están dentro del shapefile

0 votos

Tengo un problema usando tu código, no se seleccionan todos los puntos dentro del polígono. He añadido una imagen a mi pregunta original. ¿Alguna idea sobre lo que podría estar causando el problema?

0 votos

No importa, era un problema con el final lat y lon, lo he arreglado ahora

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