Deseo recortar un conjunto de polilíneas (líneas negras en la imagen a continuación) en el límite exterior de un polígono. Cualquier vacío dentro del polígono debe ser ignorado. Mi salida ideal son las líneas amarillas discontinuas. Las líneas iniciales pueden o no ser rectas. La imagen es un ejemplo simplificado, en realidad el polígono es mucho más complejo y hay cientos de líneas. No creo que un casco convexo funcione (pero podría estar equivocado). Estoy abierto a soluciones en arcgis, qgis, arcpy, shapely, etc. La codificación preferiblemente estaría en python porque estoy abierto a otras opciones si es necesario. Arcgis también sería preferible para facilitar a mis compañeros de trabajo compartir la herramienta, pero no es un requisito.
Lo mejor que puedo pensar en este momento es intersectar una línea individual con el polígono creando un conjunto de puntos en todas las intersecciones de límites. Ordenar los puntos por distancia al inicio de la línea. Los puntos más lejanos y más cercanos (FAC) serán el límite exterior del polígono. Luego use los puntos FAC para seleccionar los vértices apropiados de la línea original y cree la línea punteada amarilla a partir de los puntos apropiados. Debería funcionar, pero parece más complicado de lo necesario.
Algunas reflexiones adicionales:
- Las líneas son lineales "suficientes" para que un simple cálculo de distancia entre puntos funcione, no debería ser necesaria una referencia lineal.
- Esto sería fácil en arcpy si hubiera una herramienta para dividir una línea en un punto, pero no puedo encontrar una.
¿Alguien piensa?
fuente
Respuestas:
Quiero lanzar mi solución pyQGIS, nada más.
Mi caso de prueba - antes del recorte:
Después del recorte:
Para obtener el conjunto completo de atributos de las líneas originales, creo que sería mejor unirlos con el resultado. De lo contrario, debe crearse en la sección de preparación y establecerse en el bucle más interno. Pero no he probado si pasan el proceso de disolución o si se pierden, porque en principio podrían tener valores diferentes.
fuente
Si ejecuta Integrar con los polígonos y líneas como entradas, agregará un vértice a cada uno donde se cruzan. (Cuidado, ya que Integrate modifica las entradas en lugar de producir nuevas salidas).
Una vez que esté seguro de que hay vértices coincidentes, puede iterar sobre los vértices de la línea y probar para ver si cada uno toca la otra entidad. De la lista ordenada de vértices que se tocan, tome el mínimo y el máximo del conjunto. Luego, haga dos líneas de cada característica, A: (inicio, ..., mínimo) y B: (máximo, ..., final).
Otra opción, aunque no estoy seguro de si ArcPy conserva el orden de las partes de la entidad en función del orden de los vértices en el objeto de entrada, sería ejecutar el clip tal como está. Para la línea media en su ejemplo, debería resultar en una característica de varias partes con tres partes. Dependiendo del orden, puede iterar sobre cada línea multiparte producida por Clip y eliminar todas las partes excepto la primera y la última parte de la función multiparte.
fuente
Hay tres problemas con los que lidiar en este caso:
Agujeros
Como se mantendrá cualquier línea dentro de un agujero, elimine los agujeros de los polígonos. En la secuencia de comandos a continuación lo hago mediante el uso de cursores y geometrías.
Líneas entre polígonos
Las líneas que tocan dos polígonos deben eliminarse. En el siguiente script, lo hago realizando una unión espacial de
one to many
, con mis líneas como mi clase de entidad de entrada y mis polígonos como mi clase de entidad de unión. Cualquier línea que se genera dos veces toca dos polígonos y se elimina.Lineas finales
Para eliminar líneas que solo tocan un polígono en un extremo, convierto líneas en puntos finales. Luego hago uso de capas y selecciones de entidades para determinar qué puntos finales son flotantes. Selecciono los puntos finales que se cruzan con los polígonos. Luego cambio mi selección. Esto selecciona puntos finales que no se cruzan con polígonos. Selecciono cualquier línea que intersecte estos puntos seleccionados y los elimino.
Resultado
Supuestos
erase
y afeature vertices to points
)Guión
El siguiente script genera una clase de entidad con el nombre de su clase de entidad de línea plus
_GreedyClip
, en la misma geodatabase que su clase de entidad de línea. También se necesita una ubicación del espacio de trabajo.fuente