es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forma rápida de verificar si una lista de puntos está cerca de una lista de cadenas de líneas en Python con shapely y geopandas.

Tengo una gran lista de puntos shapely (alrededor de 150k) y una gran lista de linestrings shapely (alrededor de 240k). Me preguntaba si había una manera rápida de verificar si estos puntos están cerca de alguno de los linestrings.

Este fue el código que utilicé para 300 puntos y tardó 387 segundos.

on_road = []

for point in noisePoints.geometry:
    if (roads_df.geometry.distance(point) < 1e-4).any():
        on_road.append(point)

Este método es demasiado lento, así que espero encontrar un método más rápido.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existen formas más rápidas de verificar si los puntos están cerca de alguna de las líneas utilizando las librerías geopandas y shapely. Una forma es utilizar la función de índice espacial de geopandas para acelerar la consulta. Aquí hay un ejemplo de código para manejar una gran lista de puntos y líneas shapely:

    from shapely.geometry import Point
    import geopandas as gpd
    
    # Crear un dataframe geopandas para las líneas
    line_gdf = gpd.GeoDataFrame(geometry=linestrings)
    
    # Crear un índice espacial para las líneas
    line_sindex = line_gdf.sindex
    
    # Definir el umbral de distancia para la proximidad
    threshold = 1e-4
    
    # Crear una lista vacía para almacenar los puntos en la carretera
    on_road = []
    
    # Iterar a través de cada punto y verificar su proximidad a las líneas
    for point in shapely_points:
        # Crear un punto shapely para cada elemento en la lista
        p = Point(point)
        # Obtener una lista de índices de líneas candidatas basadas en el índice espacial
        candidate_indices = list(line_sindex.intersection(p.buffer(threshold).bounds))
        # Verificar cada línea candidata para proximidad al punto
        for index in candidate_indices:
            if line_gdf.geometry.iloc[index].distance(p) < threshold:
                on_road.append(point)
                break  # Salir del bucle después de encontrar una coincidencia
    

    Este código utiliza un índice espacial para restringir la búsqueda a líneas cercanas, reduciendo la cantidad de cálculos de distancia necesarios. También utiliza el método buffer de shapely para crear una región espacial alrededor de cada punto y buscar líneas candidatas. La instrucción break sale del bucle cuando se encuentra una coincidencia, mejorando aún más la eficiencia. Este enfoque debería ser mucho más rápido que el método anterior y escalar bien para un gran número de puntos y líneas.

Comments are closed.