Définition de l'étendue d'une carte QGIS à l'aide de python

8

J'écris une application autonome en Python / QGIS qui crée simplement des cartes.

Je veux charger des couches vectorielles / raster, définir la symbologie, définir l'étendue

Pour le moment, c'est tout!

Actuellement, j'utilise simplement la technique de rendu simple décrite ici: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

J'ai cependant échoué à adapter ce code pour définir une étendue spécifique. Je fournis le code ci-dessous.

Les seuls exemples que je peux trouver qui montrent comment changer l'étendue impliquent la création d'un MapCanvas. ... Mais je ne suis pas certain que c'est quelque chose que je veux faire étant donné que je fais juste des cartes très simples ... et cela semble introduire un tout nouvel ensemble de complications. Il existe certainement un moyen facile de définir l'étendue via la technique du «rendu 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
la source
Avez-vous essayé de créer le QgsRectangle avec des coordonnées de carte au lieu de coordonnées de pixel?
Matthias Kuhn
Les jeux de données sont en WGS84 UTM36S .... et les valeurs que j'ai entrées sont des mètres, ce qui est correct?
Becky
Quelle est la sortie que vous obtenez de votre programme - montre-t-elle l'étendue complète de toutes les couches?
til_b
Oui - pleine mesure. Mais je voudrais faire des cartes montrant des zones "zoomées" ... pour montrer les détails d'un raster
Becky
Essayez d'appeler renderer.setDestinationCrs () pour indiquer au moteur de rendu dans quel CRS l'étendue est spécifiée.
Matthias Kuhn

Réponses:

4

Il vous suffira peut-être simplement d'enregistrer le canevas de carte en tant qu'image après avoir zoomé dans la mesure souhaitée. L'utilisation de mapCanvas () n'ajoute pas trop de lignes de code et exporterait un simple PNG.

À partir de la console python, ce code produirait une capture d'écran simple de la zone orientée autour d'une entité sélectionnée, de toutes les couches actives et de toutes les étiquettes activées:

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

qgis.utils.iface.mapCanvas().saveAsImage('test.png', None, 'PNG') 
user25976
la source
2

Si vous connaissez les coordonnées de vos rectangles, vous pouvez utiliser le code suivant:

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

ici, pour vous, utilisez simplement

self.canvas.setExtent(rect)

Et juste pour la précision:

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

ou également pour le plugin, pas la console pyqgis

self.canvas = self.iface.mapCanvas()
GilliM
la source
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
la source