6 votos

¿Cómo hacer snapping en Geopandas?

Quiero realizar el ajuste en todas las líneas de un archivo de forma que no se conectan a la más cercana de otras líneas. Sería bueno tener una tolerancia de 0,5 metros. Así que entre el 0,5 debe conectarse a cerca de las líneas. He hecho esto:

import geopandas as gpd
from shapely.ops import snap
s=gpd.read_file(r'C:\Users\user\Desktop\ag_eus')
result=snap(s,s,0.5)

Da:

AttributeError: 'GeoDataFrame' object has no attribute '_geom'

Algo más de información sobre el shapefile:

s.columns

Index(['Layer', 'SubClasses', 'ExtendedEn', 'Linetype', 'EntityHand', 'Text',
       'geometry'],
      dtype='object')

ACTUALIZACIÓN de la respuesta que proporcionó:

for index, row in s.iterrows():
    tmp_gdf = s.copy()
    tmp_gdf['distance'] = tmp_gdf.distance(row['geometry'])
    closest_geom = list(tmp_gdf.sort_values('distance')['geometry'])[1]
    # I took 1 because index 0 would be the row itself
    snapped_geom = snap(row['geometry'], closest_geom, 0.5)
    s.set_value(index, 'geometry', snapped_geom)


    #new addition  
    o = r'C:\Users\user\Desktop\ag_eus'
    s.to_file(o+ '\\new')

y el archivo es exactamente el mismo con el primero?

5voto

eskhool Puntos 31

shapely.ops.snap(geom1, geom2, tolerance) como en los documentos, realiza el ajuste entre 2 objetos de geometría de tipos, lo que significa que debe encontrar los 2 objetos más cercanos en sus datos y luego ajustarlos.

Combinando GeoDataFrame.distance(geom) y GeoDataFrame.sort_values(...) puedes obtener tus 2 objetos más cercanos.

 for index, row in your_gdf.iterrows():
    tmp_gdf = your_gdf.copy()
    tmp_gdf['distance'] = tmp_gdf.distance(row['geometry'])
    closest_geom = list(tmp_gdf.sort_values('distance')['geometry'])[1]
    # I took 1 because index 0 would be the row itself
    snapped_geom = snap(row['geometry'], closest_geom, your_tolerance)
    your_gdf.loc[index, 'geometry'] = snapped_geom
 

Editar: tenga en cuenta que snap no crea vértices donde no los hay, solo mueve vértices ubicados dentro de la tolerancia.

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