Pythonを使用してQGISマップの範囲を設定する


8

Python / QGISで、マップを作成するだけのスタンドアロンアプリケーションを作成しています。

ベクター/ラスターレイヤーを読み込み、シンボルを設定し、範囲を設定したい

現時点ではそれだけです!

現在、私はここで概説されている単純なレンダリング手法を使用しています:http : //www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

しかし、私はこのコードを特定の範囲を定義するように適合させることに失敗しました。以下のコードを提供します。

範囲を変更する方法を示す唯一の例は、MapCanvasの作成です。...しかし、これが非常に単純なマップを作成しているだけであることを考慮して、これが私がしたいことであるかどうかはわかりません...そして、それはまったく新しい複雑なセットを導入するようです。「シンプルなレンダリング」技術を介して範囲を定義する簡単な方法は確かにありますか?

ベッキー

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")

ピクセル座標ではなくマップ座標でQgsRectangleを作成しようとしましたか?
Matthias Kuhn

データセットはWGS84 UTM36S ...にあり、私が入力した値はメートルですか?
ベッキー

あなたのプログラムから得られる出力は何ですか-それはすべての層の全範囲を示していますか?
til_b 2013

はい-全範囲。しかし、ラスターの詳細を示すために、「ズームイン」領域を示すマップを作成したいと思います
Becky

renderer.setDestinationCrs()を呼び出して、レンダラーに指定されているCRSの範囲を指定してください。
Matthias Kuhn

回答:


4

興味のある範囲にズームした後、マップキャンバスを画像として保存するだけで十分でしょう。mapCanvas()を使用しても、コードの行が多すぎず、単純なPNGがエクスポートされます。

Pythonコンソールから、このコードは、選択された機能、すべてのアクティブなレイヤー、およびアクティブ化されたラベルを中心とした領域の単純なスクリーンキャプチャを生成します。

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

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

2

長方形の座標がわかっている場合は、次のコードを使用できます。

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

ここでは、あなたのために、単に使用してください

self.canvas.setExtent(rect)

そして正確さのために:

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

または同様に、pyqgisコンソールではなくプラグインの場合

self.canvas = self.iface.mapCanvas()

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.