Tengo un archivo CSV de unos 230 millones de filas, que contiene una columna de latitud, una columna de longitud, un sello de fecha y una columna de identificación. Se ve así (he añadido la cabecera en este ejemplo para ayudar a explicar, el archivo no tiene una cabecera):
ID, Date, Lon, lat
46d4089a713082d85452a2af64571644, 2016-11-30T12:57:11.000Z, 53.4529, -2.287
46d4089a713082d85452a2af64571644, 2016-11-30T12:57:26.000Z, 53.4521, -2.2859
46d4089a713082d85452a2af64571644, 2016-11-30T12:57:59.000Z, 53.4522, -2.2878
46d4089a713082d85452a2af64571644, 2016-11-30T12:59:01.000Z, 53.4547, -2.284
a6af7b30dc3ffa0ee7ecea02a2981b7d, 2016-11-30T13:03:01.000Z, 53.4457, -2.2774
693316c8b95e9fb07207400414714180, 2016-11-30T21:18:16.913Z, 53.2887, -2.6687
También tengo dos shapefiles de polígonos ESRI que he creado. Lo que quiero es una lista de todos los ID que tienen al menos una coordenada en ambos shapefiles.
Como el archivo es tan grande y no podía cargarse en la memoria, mi enfoque fue dividir el archivo CSV en 117 CSV de 2 millones de filas. Luego planeé usar geopandas para leer los CSVs más pequeños como un GeodataFrame, y usar sjoin para encontrar todos los waypoints en el shapefile 1.
Entonces tomaría la columna ID de los waypoints dentro del shapefile como una lista, tomaría todos los waypoints en el csv grande con un ID en la lista, y haría lo mismo de nuevo encontrando los puntos en el shapefile 2.
He intentado utilizar la indexación espacial para acelerar el proceso, ya que es un archivo grande
Intenté probar esto usando el primer CSV de 2 millones de filas, usando este código:
import pandas as pd
import geopandas
from geopandas.tools import sjoin
from shapely.geometry import *
waypoints = pd.read_csv(r'largefile_1.csv',sep=',', names=['TripId','lat','lon'],usecols=[0,2,3])
waypoints['geometry'] = waypoints.apply(lambda x: Point((float(x.lon), float(x.lat))), axis=1)
point = geopandas.GeoDataFrame(waypoints, geometry='geometry')
polygon = geopandas.GeoDataFrame.from_file(r'Shapefile1.shp')
point.crs = polygon.crs
spatial_index = point.sindex
possible_matches_index = list(spatial_index.intersection(polygon.bounds))
possible_matches = point.iloc[possible_matches_index]
precise_matches = possible_matches[possible_matches.intersects(polygon)]
¿Hay alguna forma más eficiente de hacerlo, en otro programa o con diferentes plugins?