20 votos

¿Obtener la extensión de las capas en PyQGIS?

Estoy tratando de escribir un script utilizando la hierba r.neighbors algoritmo para los rasters. Cuando se utiliza la Gui para este algoritmo, se puede dejar el campo de extensión de la capa de GRASS en blanco para utilizar la extensión mínima. Por el contrario, cuando se usa en la consola de python, no encuentro cómo introducir este tipo de valor "por defecto". enter image description here

He visto en https://docs.qgis.org/2.2/en/docs/user_manual/processing/console.html que parece ser obligatorio introducir las cuatro coordenadas para un parámetro de extensión. He intentado utilizar iface.mapCanvas().extent() pero el objeto devuelto no se acepta como parámetro y no encuentro cómo obtener sus coordenadas..

¿Hay alguna manera de obtener el xmin, ymin, xmax, ymax de la capa en PyQGIS para introducirlos en el algoritmo? ¿Lo estoy haciendo totalmente mal?

29voto

Geoffrey Puntos 228

La respuesta está casi completamente contenida en un Correo electrónico: Hace poco escribí.

La extensión se devuelve como un QgsRectangle() con el siguiente código:

layer = iface.activeLayer() # load the layer as you want
ext = layer.extent()

Para obtener las coordenadas de los vértices de la capa actual, puede ejecutar este código:

xmin = ext.xMinimum()
xmax = ext.xMaximum()
ymin = ext.yMinimum()
ymax = ext.yMaximum()
coords = "%f,%f,%f,%f" %(xmin, xmax, ymin, ymax) # this is a string that stores the coordinates

Por último, puede ejecutar el siguiente código para utilizar el r.neighbors desde la consola de Python:

processing.runalg("grass7:r.neighbors",layer,0,3,False,False,"",coords,0,None)

10voto

bretddog Puntos 210

Estabas en el camino correcto sólo tienes que ir un paso más allá. Vea el Documentación de QGIS para QgsRectangle

Básicamente, sí:

  • obtener la capa actual

    layer = iface.activeLayer()
  • obtener la extensión que es un objeto QgsRectangle

    ex = layer.extent()
  • y allí extraer los Valores con:

    xmax = ex.xMaximum()
    ymax = ex.yMaximum()
    xmin = ex.xMinimum()
    ymin = ex.yMinimum()

0voto

Noam D. Elkies Puntos 17729

Para dar un paso más: obtenga la extensión, y construya un nuevo polígono rectangular a partir de ella.

Esto funciona como la herramienta "Extraer la extensión de la capa" en QGIS 3.8 (puede ser una manera más rápida, pero esto funciona para mí. Hay algunas cosas extra aquí también, como añadir y rellenar nuevos campos a una capa de otra manera vacía, y cambiar la opacidad).

En este ejemplo, sourceLayer sería su capa de puntos, líneas o polígonos de entrada.

vLayer = QgsProject.instance().mapLayersByName("sourceLayerNameHere")[0]
print(vLayer.extent())
uri = "Polygon?crs=epsg:4326&field=id:integer&field=name:string(50)&index=yes"
emptyPolyLayer = QgsVectorLayer(uri, "PolyLayer_00", "memory")

if emptyPolyLayer.isValid():
  print("Layer is valid.")
else:
  print("Layer is NOT valid; exiting...")

# Add some new fields here
prov = emptyPolyLayer.dataProvider()  # get provider
prov.addAttributes([QgsField("Label", QVariant.String)])
prov.addAttributes([QgsField("someNumbers", QVariant.Double)])

emptyPolyLayer.updateFields() # updates the vector layer's schema from provider
field_names = [field.name() for field in prov.fields()]
for count, f in enumerate(field_names):
  print("{} {}".format(count, f))
caps = prov.capabilities()
if caps & prov.EditingCapabilities:
  print('The layer is editable!')
  emptyPolyLayer.startEditing()
  feat = QgsFeature() # instantiate the feature object
  feat.setFields(emptyPolyLayer.fields()) # Important step for a new, empty layer
  print("Attributes are: {}".format(feat.attributes()))
  field_names = [field.name() for field in feat.fields()]
  for count, f in enumerate(field_names):
    print("{} {}".format(count, f)) 
  feat.setGeometry(QgsGeometry.fromRect(vLayer.extent()))   # for polygon feature
  index = feat.fieldNameIndex('Label')
  print("index is: {}".format(index))
  exp = "hello_there" 
  qExp = QgsExpression(exp) # Not needed for a simple string, but good practice for more complex stuff
  print(qExp)
  feat.setAttribute(index, exp)
  emptyPolyLayer.addFeatures([feat]) # add feature 
  emptyPolyLayer.updateFeature(feat)
  emptyPolyLayer.commitChanges()

print("Feature added, layer updated.")
print("Attributes are: {}".format(feat.attributes()))
emptyPolyLayer.updateExtents()

s = QgsSymbol.defaultSymbol(emptyPolyLayer.geometryType()) # grabs the default symbol 
s.setOpacity(0.3)
emptyPolyLayer.renderer().setSymbol(s)

QgsProject.instance().addMapLayer(emptyPolyLayer)
print("{} added to map.".format(emptyPolyLayer.name()))

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