Los procesos geoespaciales están presentes en la mayoría de las actividades e investigación de las personas debido a lo cual es importante optimizar el tiempo involucrado por los especialistas y mejorar la calidad de los análisis espaciales. PyQGIS es la extensión de Python en QGIS, este marco de trabajo permite el manejo de las herramientas de QGIS junto con las funciones de Python e incluso paquetes externos de Python mejorando la velocidad y la calidad de nuestro geoproceso y representación espacial.
Este tutorial muestra el procedimiento espacial para determinar las áreas no superpuestas en una región de interés con respecto a 7 capas diferentes. Este tutorial cubre los siguientes puntos como scripts en Python:
- Añadido y representación de las capas y la región de interés
- Corte de todas las capas a la región de interés
- Corrección topológica con Grass GIS
- Disolver las capas cortadas
- Determinar las zonas no superpuestass
Tutorial
Código
El siguiente es el código usado por partes.
Parte 1
import os mainLayerFolder = 'C:\Users\Saul\Documents\Ih_AnalisisdeAreasNoSuperpuestasporMultiplesCapasconQGISyPyQGIS\Shp' listLayers = [] for item in os.listdir(mainLayerFolder + '/Layers/'): if item[-3:]=='shp': listLayers.append(item) dictLayers = {} for layer in listLayers: dictLayers[layer[:-4]] = iface.addVectorLayer(mainLayerFolder + '\\Layers\\' + layer , layer[:-4] , "ogr") areaOfInterest = iface.addVectorLayer(mainLayerFolder + '\\AreaofInterest\\AreaOfInterest.shp' ,'AreaOfInterest',"ogr")
Parte 2
from processing.tools import * dictLayersClip = {} for layer in dictLayers.keys(): general.runalg("qgis:clip",\ dictLayers[layer],\ areaOfInterest,\ mainLayerFolder + '\\LayersClip\\'+layer+'_Clip.shp') dictLayersClip[layer+'_Clip'] = iface.addVectorLayer(mainLayerFolder + '\\LayersClip\\'+layer+'_Clip.shp',layer+'_Clip',"ogr")
Parte 3
from processing.tools import * dictLayersClipClean = {} for layer in dictLayersClip.keys(): if dictLayersClip[layer].featureCount() > 0: extent = dictLayersClip[layer].extent() xmin = extent.xMinimum() xmax = extent.xMaximum() ymin = extent.yMinimum() ymax = extent.yMaximum() outputLayer = mainLayerFolder + '\\LayersClipClean\\'+layer+'_Clean.shp' general.runalg("grass7:v.clean",\ dictLayersClip[layer],\ 0,\ 0.1,\ "%f , %f, %f, %f "% (xmin , xmax , ymin , ymax),\ -1.0,\ 0.0001,\ outputLayer,\ None\ ) dictLayersClipClean[layer+'_Clean'] = iface.addVectorLayer(outputLayer , layer+'_Clean', "ogr")
Parte 4
from processing.tools import * dictLayersClipCleanDiss = {} for layer in dictLayersClipClean.keys(): outputLayer = mainLayerFolder + '\\LayersClipCleanDiss\\'+layer+'_Diss.shp' print(outputLayer) general.runalg("qgis:dissolve",\ #areaOfInterest,\ dictLayersClipClean[layer],\ True,\ None, outputLayer) dictLayersClipCleanDiss[layer+'_Diss'] = iface.addVectorLayer(outputLayer , layer+'_Diss' , "ogr")
Parte 5
from processing.tools import * dictInter = {} layerList = dictLayersClipCleanDiss.keys() for item in range(len(layerList)): outputFolder = mainLayerFolder + '\\LayersClipCleanDissInter\\' #outputLayer = outputFolder + 'Step' + str(item) + '_______' + layerList[item] + '_Inter.shp' outputLayer = outputFolder + 'Step' + str(item) + '.shp' print(outputLayer) if item == 0: general.runalg("qgis:difference",\ areaOfInterest,\ dictLayersClipCleanDiss[layerList[item]],\ True,\ outputLayer) elif item > 0: general.runalg("qgis:difference",\ dictInter['Step' + str(item-1)],\ dictLayersClipCleanDiss[layerList[item]],\ True,\ outputLayer) dictInter['Step' + str(item)]=iface.addVectorLayer(outputLayer , 'Step' + str(item), "ogr")
Datos de ingreso
Puede descargar los datos de entrada para este tutorial de este enlace:
https://www.hatarilabs.com/s/Ih_AnalisisdeAreasNoSuperpuestasporMultiplesCapasconQGISyPyQGIS-7bpf.rar