Densificación
La densificación de los límites de polígonos o segmentos de polilíneas es una tarea común.
En una versión anterior, escribí sobre densificar geometría basada en un "factor", es decir, duplicar, triplicar... el número de puntos a lo largo de un segmento.
La densificación planar se puede realizar en Herramientas de Edición, con varias opciones. Es no disponible en el nivel de licencia Básica por alguna razón.
Densificar (Edición)—ArcGIS Pro | Documentación
Este escrito se concentra en la densificación basada en un paso de distancia planar a lo largo de la línea/perímetro. Es el uso más común.
Incluye un par de mis conjuntos de herramientas (listados abajo).
El código ilustra el poder de numpy en el geoprocesamiento.
def _pnts_on_line_(a, spacing=1, is_percent=False): # densificar por distancia
"""Agregar puntos, a un espaciado fijo, a un arreglo que representa una línea.
Parámetros
----------
a : arreglo
Una secuencia de `puntos`, pares x,y, que representan los límites de un polígono
u objeto polilínea.
spacing : número
Espaciado entre los puntos que se agregarán a la línea.
is_percent : booleano
Expresa la densificación como un porcentaje del largo total.
"""
a = _get_base_(a)
N = len(a) - 1 # segmentos
dxdy = a[1:, :] - a[:-1, :] # diferencias de coordenadas
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # longitudes de segmentos
if is_percent: # como porcentaje
spacing = abs(spacing)
spacing = min(spacing / 100, 1.)
steps = (sum(leng) * spacing) / leng # distancia del paso
else:
steps = leng / spacing # distancia del paso
deltas = dxdy / (steps.reshape(-1, 1)) # pasos de coordenadas
pnts = np.empty((N,), dtype='O') # construir un arreglo `O`
for i in range(N): # recorrer los segmentos y crear
num = np.arange(steps[i]) # los nuevos puntos
pnts[i] = np.array((num, num)).T * deltas[i] + a[i]
a0 = a[-1].reshape(1, -1) # agregar el punto final y concatenar
return np.concatenate((*pnts, a0), axis=0)
Creo que mis 2 líneas favoritas son ...
dxdy = a[1:, :] - a[:-1, :] # diferencias de coordenadas
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # longitudes de segmentos
Einstein era un tipo inteligente.
Su sintaxis de notación está implementada en muchos lenguajes y causa confusión mental hasta que te acostumbras (material para otro blog).
En resumen, dxdy representa las diferencias secuenciales en las coordenadas de un arreglo (lee coordenadas de polígono/polilínea).
Nada de leer la geometría y restar cada coordenada x e y por separado. Una línea y listo.
Ahora a[1:, :] significa desde el segundo par de coordenadas en adelante y a[:-1, :] significa desde la primera coordenada hasta pero sin incluir la última (el índice comienza en cero).
¿Cabeza dando vueltas? Has estado usando Pandas o shapely demasiado tiempo.
Así es como se ve un polígono simple representado como un arreglo (incluso un arcpy.Array)
a # ---- un arreglo de coordenadas x, y... el primero y último son iguales
array([[ 0.00, 0.00],
[ 2.00, 8.00],
[ 8.00, 10.00],
[ 10.00, 10.00],
[ 10.00, 8.00],
[ 9.00, 1.00],
[ 0.00, 0.00]])
dxdy # ---- delta x y delta y secuenciales entre los pares
array([[ 2.00, 8.00],
[ 6.00, 2.00],
[ 2.00, 0.00],
[ 0.00, -2.00],
[ -1.00, -7.00],
[ -9.00, -1.00]])
leng # ---- la distancia entre pares de puntos consecutivos
array([ 8.25, 6.32, 2.00, 2.00, 7.07, 9.06])
Ahora que la magia está hecha, el resto es solo para determinar si quieres densificar basado en una distancia absoluta o como porcentaje del total.
La sección 'for loop' , sin embargo puede simplificarse; la mantuve así porque muestra cómo cada segmento se densifica y los resultados se recopilan para luego ensamblarse en el resultado final.
¿Y cómo se ve? El polígono simple mostrado arriba y su versión densificada son los siguientes.
'Plots' hechos en 'Spyder' 'usando' 'Matplotlib' .
'Finalmente', agregaré esta capacidad a mis herramientas 'Polyline/Polygon' 'y' 'Free Tools' 'pronto'.
'Free_Tools' en 'Tools_for_ARCGIS_PRO' (github.com)
'PolygonLine Tools' en 'Tools_for_ARCGIS_PRO' (github.com)
'Si te interesa la geometría, geometría computacional y numpy y su interfaz con arcpy y arcgis pro, entonces mi enlace Numpy Geometry puede ser de interés. Es la base para todo el conjunto de herramientas en mi sitio.'
'numpy_geometry: Una clase y funciones numpy geometry que funcionan con arcpy y ESRI featureclasses'
'Eso es todo por ahora. Avísame si necesitas algo que quieras agregar... especialmente si requiere una licencia Advance' '<<EMOJI-0>>' .'
'--------------------------' Previous work
Densification.... sometimes being dense is a good ... - GeoNet, The Esri Community