Establecer la extensión para un mapa QGIS usando python

8

Estoy escribiendo una aplicación independiente en Python / QGIS que simplemente crea mapas.

Quiero cargar capas vectoriales / ráster, establecer simbología, establecer extensión

Por el momento, eso es todo!

Actualmente solo estoy usando la técnica de representación simple que se describe aquí: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

Sin embargo, he fallado al adaptar este código para definir una extensión específica. Proporciono el código a continuación.

Los únicos ejemplos que puedo encontrar que muestran cómo cambiar la extensión implican crear un MapCanvas. ... Pero no estoy seguro de que esto sea algo que quiero hacer teniendo en cuenta que solo estoy haciendo mapas muy simples ... y parece presentar un conjunto completamente nuevo de complicaciones. ¿Seguramente hay una manera fácil de definir la extensión a través de la técnica de 'representación simple'?

Becky

from qgis.core import *
from qgis.utils import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtCore import QFileInfo, QSettings

QgsApplication.setPrefixPath('/Applications/QGIS-1.9.app/Contents/MacOS', True)
QgsApplication.initQgis()

province = QgsVectorLayer('/filepath/Province_studyUTM36S.shp' , 'layer', 'ogr')
town = QgsVectorLayer('/filepath/TownPolygons_UTM36S.shp' , 'layer', 'ogr')
road = QgsVectorLayer('/filepath/Roads_UTM36S.shp' , 'layer', 'ogr')

QgsMapLayerRegistry.instance().addMapLayer(province)
QgsMapLayerRegistry.instance().addMapLayer(road)
QgsMapLayerRegistry.instance().addMapLayer(town)

rasterFile = '/filepath/Landsat.tif'
fileInfo = QFileInfo(rasterFile)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(rasterFile, baseName)


QgsMapLayerRegistry.instance().addMapLayer(rlayer)

img = QImage(QSize(800,600), QImage.Format_ARGB32_Premultiplied)  

color = QColor(255,255,255) 
img.fill(color.rgb())  

p = QPainter() 
p.begin(img) 
p.setRenderHint(QPainter.Antialiasing)  
render = QgsMapRenderer()  
ID = [  rlayer.getLayerID(), town.getLayerID(), road.getLayerID(), province.getLayerID()] 
render.setLayerSet(ID)  


rect = QgsRectangle(render.fullExtent()) 
rect.scale(1.1) 
render.setExtent(rect)  

render.setOutputSize(img.size(), img.logicalDpiX())  

render.render(p)  
p.end()  

img.save("/filepath/first_render.png","png")
Becky
fuente
¿Has intentado crear el QgsRectangle con coordenadas de mapa en lugar de coordenadas de píxeles?
Matthias Kuhn
Los conjuntos de datos están en WGS84 UTM36S ... y los valores que he puesto son metros, ¿cuál es el correcto?
Becky
¿Cuál es el resultado que obtiene de su programa? ¿Muestra el alcance total de todas las capas?
til_b
Sí, en toda su extensión. Pero me gustaría hacer mapas que muestren áreas 'ampliadas' ... para mostrar los detalles de una trama
Becky
Intente llamar a renderer.setDestinationCrs () para decirle al procesador en qué CRS se especifica la extensión.
Matthias Kuhn

Respuestas:

4

Quizás sea suficiente para usted simplemente guardar el lienzo del mapa como una imagen después de hacer zoom hasta el punto de interés. Hacer uso de mapCanvas () no agrega demasiadas líneas de código y exportaría un simple PNG.

Desde la consola de Python, este código produciría una captura de pantalla simple del área orientada alrededor de una característica seleccionada, todas las capas activas y cualquier etiqueta activada:

qgis.utils.iface.actionZoomToSelected().trigger()
qgis.utils.iface.mapCanvas().zoomScale(1000)

qgis.utils.iface.mapCanvas().saveAsImage('test.png', None, 'PNG') 
usuario25976
fuente
2

Si conoce las coordenadas de sus rectángulos, puede usar el siguiente código:

zoomRectangle = QgsRectangle(pos[0]-offset, pos[1]-offset,pos[0]+offset,pos[1]+offset)
self.canvas.setExtent(zoomRectangle)
self.canvas.refresh()

aquí, para ti, solo usa

self.canvas.setExtent(rect)

Y solo por precisión:

self.canvas = qgis.utils.iface.mapCanvas()

o igualmente para el complemento, no la consola pyqgis

self.canvas = self.iface.mapCanvas()
GilliM
fuente
0

QGIS 3

project_path = "D://my_project.qgs"

# load the project, load project instance (pi)
pi = QgsProject.instance()
pi.read(project_path)

# get the project's layout
plm = pi.layoutManager()
layout = plm.layoutByName("my_layout") # your layout name

#get reference map
refmap = layout.referenceMap()

xmin = ...you
ymin = ...provide
xmax = ...these coordinates
ymax = ...in your maps CRS

# set extent
bb = QgsRectangle(xmin, ymin, xmax, ymax )
refmap.setExtent(bb)
cm1
fuente