Mengatur tingkat untuk peta QGIS menggunakan python

8

Saya menulis aplikasi yang berdiri sendiri dalam Python / QGIS yang hanya membuat peta.

Saya ingin memuat layer vektor / raster, mengatur simbologi, mengatur batas

Saat ini, itu saja!

Saat ini saya hanya menggunakan teknik rendering sederhana yang diuraikan di sini: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

Namun saya gagal mengadaptasi kode ini untuk menentukan batas tertentu. Saya berikan kode di bawah ini.

Satu-satunya contoh yang dapat saya temukan yang menunjukkan bagaimana mengubah tingkat melibatkan pembuatan MapCanvas. ... Tapi saya tidak yakin bahwa ini adalah sesuatu yang ingin saya lakukan mengingat saya hanya membuat peta yang sangat sederhana ... dan sepertinya memperkenalkan serangkaian komplikasi yang sama sekali baru. Tentunya ada cara mudah untuk mendefinisikan tingkat melalui teknik 'rendering sederhana'?

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
sumber
Sudahkah Anda mencoba membuat QgsRectangle dengan koordinat peta alih-alih koordinat piksel?
Matthias Kuhn
Kumpulan data dalam WGS84 UTM36S .... dan nilai yang saya masukkan adalah meter yang benar?
Becky
Apa output yang Anda dapatkan dari program Anda - apakah ini menunjukkan seluruh lapisan?
til_b
Ya - sepenuhnya. Tapi saya ingin membuat peta yang menunjukkan area 'diperbesar' ... untuk menampilkan detail raster
Becky
Coba panggil renderer.setDestinationCrs () untuk memberi tahu renderer berapa CRS yang ditentukan.
Matthias Kuhn

Jawaban:

4

Mungkin cukup bagi Anda untuk hanya menyimpan kanvas peta sebagai gambar setelah melakukan zooming sejauh yang diinginkan. Memanfaatkan mapCanvas () tidak menambahkan terlalu banyak baris kode dan akan mengekspor PNG sederhana.

Dari konsol python, kode ini akan menghasilkan tangkapan layar sederhana dari area yang berorientasi pada fitur yang dipilih, semua lapisan aktif, dan label yang diaktifkan:

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

qgis.utils.iface.mapCanvas().saveAsImage('test.png', None, 'PNG') 
pengguna25976
sumber
2

Jika Anda tahu koordinat persegi panjang Anda, Anda bisa menggunakan kode berikut:

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

di sini, untuk Anda, gunakan saja

self.canvas.setExtent(rect)

Dan hanya untuk presisi:

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

atau sama untuk plugin, bukan konsol pyqgis

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