Festlegen der Ausdehnung für eine QGIS-Karte mithilfe von Python

8

Ich schreibe eine eigenständige Anwendung in Python / QGIS, die einfach Karten erstellt.

Ich möchte Vektor- / Rasterebenen laden, Symbologie und Ausdehnung festlegen

Im Moment ist das alles!

Derzeit verwende ich nur die hier beschriebene einfache Rendering-Technik: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

Ich habe es jedoch versäumt, diesen Code anzupassen, um einen bestimmten Umfang zu definieren. Ich gebe den folgenden Code an.

Die einzigen Beispiele, die zeigen, wie das Ausmaß geändert werden kann, sind das Erstellen eines MapCanvas. ... Aber ich bin mir nicht sicher, ob ich das tun möchte, wenn ich nur sehr einfache Karten mache ... und es scheint eine ganze Reihe neuer Komplikationen mit sich zu bringen. Sicherlich gibt es eine einfache Möglichkeit, das Ausmaß mithilfe der "einfachen Rendering" -Technik zu definieren.

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
quelle
Haben Sie versucht, das QgsRectangle mit Kartenkoordinaten anstelle von Pixelkoordinaten zu erstellen?
Matthias Kuhn
Die Datensätze sind in WGS84 UTM36S ... und die Werte, die ich eingegeben habe, sind Meter, was ist richtig?
Becky
Was ist die Ausgabe, die Sie von Ihrem Programm erhalten - zeigt es den vollen Umfang aller Ebenen?
bis
Ja - in vollem Umfang. Aber ich möchte Karten machen, die "vergrößerte" Bereiche zeigen ... um die Details eines Rasters zu zeigen
Becky
Versuchen Sie, renderer.setDestinationCrs () aufzurufen , um dem Renderer mitzuteilen, in welchem ​​CRS der Umfang angegeben ist.
Matthias Kuhn

Antworten:

4

Vielleicht reicht es für Sie aus, die Kartenleinwand nach dem Zoomen im gewünschten Umfang einfach als Bild zu speichern. Durch die Verwendung von mapCanvas () werden nicht zu viele Codezeilen hinzugefügt und ein einfaches PNG exportiert.

Über die Python-Konsole würde dieser Code eine einfache Bildschirmaufnahme des Bereichs erstellen, der sich an einem ausgewählten Feature, allen aktiven Ebenen und allen aktivierten Beschriftungen orientiert:

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

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

Wenn Sie die Koordinaten Ihrer Rechtecke kennen, können Sie folgenden Code verwenden:

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

hier, für dich, benutze einfach

self.canvas.setExtent(rect)

Und nur zur Präzision:

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

oder gleichermaßen für Plugin, nicht für Pyqgis-Konsole

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