Definindo a extensão de um mapa QGIS usando python

8

Estou escrevendo um aplicativo independente em Python / QGIS que simplesmente cria mapas.

Quero carregar camadas vetor / raster, definir simbologia, definir extensão

No momento, isso é tudo!

Atualmente, estou apenas usando a técnica de renderização simples descrita aqui: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

No entanto, falhei ao adaptar esse código para definir uma extensão específica. Eu forneço o código abaixo.

Os únicos exemplos que posso encontrar que mostram como alterar a extensão envolvem a criação de um MapCanvas. ... Mas não tenho certeza de que isso é algo que quero fazer, considerando que estou apenas fazendo mapas muito simples ... e parece introduzir um novo conjunto de complicações. Certamente existe uma maneira fácil de definir extensão através da técnica de 'renderização simples'?

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
fonte
Você tentou criar o QgsRectangle com coordenadas de mapa em vez de coordenadas de pixel?
Matthias Kuhn
Os conjuntos de dados estão em WGS84 UTM36S .... e os valores que inseri são metros, o que está correto?
Becky
Qual é o resultado que você obtém do seu programa - mostra toda a extensão de todas as camadas?
til_b 26/07
Sim - extensão total. Mas eu gostaria de fazer mapas mostrando áreas 'zoom-in' ... para mostrar os detalhes de um raster
Becky
Tente chamar renderer.setDestinationCrs () para informar ao representante em que CRS a extensão está especificada.
Matthias Kuhn

Respostas:

4

Talvez seja suficiente salvar a tela do mapa como uma imagem depois de aumentar o zoom de acordo com o interesse. Usar mapCanvas () não adiciona muitas linhas de código e exportaria um PNG simples.

No console python, esse código produziria uma captura de tela simples da área orientada em torno de um recurso selecionado, todas as camadas ativas e quaisquer rótulos ativados:

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

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

Se você conhece as coordenadas dos seus retângulos, pode usar o seguinte código:

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

aqui, para você, basta usar

self.canvas.setExtent(rect)

E apenas por precisão:

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

ou igualmente para o plugin, não o console pyqgis

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