1 votos

Recortar o intersecar líneas en polígonos con QGIS

En QGIS 2.16.2, tengo una capa poligonal de estados y una capa lineal de calles. Lo que quiero son todas las calles que se encuentran dentro de un determinado estado, ya sea como un atributo adicional o como una subcapa.

Al final, sólo quiero mostrar las calles de un determinado estado.

Extensión: Algunos polígonos se solapan entre sí. En estos casos, las líneas deben mostrarse para ambos polígonos.

2voto

deaan Puntos 11

Aquí tienes una solución usando un script de python para que no tengas que hacer ninguna de las molestas operaciones de clic y selección con el ratón.

  1. Abra la consola de comandos pulsando "Plugins/Consola Python" o ctrl-alt-P
  2. Haga clic en el icono "mostrar editor" (parece un bloc de notas con un bolígrafo)
  3. haga clic en el icono "Nuevo editor" (parece un signo más de color verde)
  4. Copia y pega el código de abajo y edítalo para que apunte a la ruta de sus archivos relevantes.
  5. Guarde su script pulsando el botón guardar como (disco azul con un lápiz)
  6. Ejecute su script pulsando el botón icono "ejecutar script" (es una flecha azul)
  7. Si desea que se ejecute más rápido, este proceso es embarazosamente paralelo, y puede ser paralelizado siguiendo la discusión en ¿Cómo puedo paralelizar operaciones SIG vergonzosamente paralelas en QGIS python?

Este es el código de tu script (recuerda editar las rutas a tus archivos reales)

import processing
import os
input_file="/path/to/input_file.shp"
clip_polygons_file="/path/to/polygon_file.shp"
output_folder="/tmp/test/"
input_layer = QgsVectorLayer(input_file, "input file", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(input_layer)
tile_layer  = QgsVectorLayer(clip_polygons_file, "clip_polys", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(tile_layer)
tile_layer_dp=input_layer.dataProvider()
EPSG_code=int(tile_layer_dp.crs().authid().split(":")[1])
tile_no=0
clipping_polygons = tile_layer.getFeatures()
for clipping_polygon in clipping_polygons:
    print "Tile no: "+str(tile_no)
    tile_no+=1
    geom = clipping_polygon.geometry()
    clip_layer=QgsVectorLayer("Polygon?crs=epsg:"+str(EPSG_code)+\
    "&field=id:integer&index=yes","clip_polygon", "memory")
    clip_layer_dp = clip_layer.dataProvider()
    clip_layer.startEditing()
    clip_layer_feature = QgsFeature()
    clip_layer_feature.setGeometry(geom)
    (res, outFeats) = clip_layer_dp.addFeatures([clip_layer_feature])
    clip_layer.commitChanges()
    clip_file = os.path.join(output_folder,"tile_"+str(tile_no)+".shp")
    write_error = QgsVectorFileWriter.writeAsVectorFormat(clip_layer, \
    clip_file, "system", \
    QgsCoordinateReferenceSystem(EPSG_code), "ESRI Shapefile")
    QgsMapLayerRegistry.instance().addMapLayer(clip_layer)
    output_file = os.path.join(output_folder,str(tile_no)+".shp")
    processing.runalg("qgis:clip", input_file, clip_file, output_file)
    QgsMapLayerRegistry.instance().removeMapLayer(clip_layer.id())

1voto

Junhua He Puntos 8
  • Seleccione el estado que desea interconectar con las calles
  • Guarda la selección como una nueva capa con la tecla derecha del ratón
  • A continuación, puede utilizar la función "extraer por ubicación" de los geoalgoritmos de QGIS en la categoría de herramientas de selección de vectores. A continuación, ejecute la función poniendo la primera posición street.shp en la segunda posición state.shp y marque la opción "within". Ejecute

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