Đặt phạm vi cho bản đồ QGIS bằng python


8

Tôi đang viết một ứng dụng độc lập bằng Python / QGIS chỉ đơn giản là tạo bản đồ.

Tôi muốn tải các lớp vectơ / raster, thiết lập ký hiệu, đặt phạm vi

Hiện tại, đó là tất cả!

Hiện tại tôi chỉ đang sử dụng kỹ thuật kết xuất đơn giản được nêu ở đây: http://www.qgis.org/pyqgis-cookbook/composer.html#simple-rendering

Tôi đã thất bại, tuy nhiên, trong việc điều chỉnh mã này để xác định một phạm vi cụ thể. Tôi cung cấp mã dưới đây.

Các ví dụ duy nhất mà tôi có thể tìm thấy cho thấy cách thay đổi phạm vi liên quan đến việc tạo MapCanvas. ... Nhưng tôi không chắc chắn rằng đây là điều tôi muốn làm vì tôi chỉ tạo ra những bản đồ rất đơn giản ... và nó dường như giới thiệu một loạt các biến chứng mới. Chắc chắn có một cách dễ dàng để xác định phạm vi thông qua kỹ thuật 'kết xuất đơn giản'?

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

Bạn đã thử tạo QSSR chữ nhật với tọa độ bản đồ thay vì tọa độ pixel chưa?
Matthias Kuhn

Các bộ dữ liệu nằm trong WGS84 UTM36S .... và các giá trị tôi đã đặt là mét có chính xác không?
Becky

Đầu ra bạn nhận được từ chương trình của bạn là gì - nó có hiển thị toàn bộ phạm vi của tất cả các lớp không?
til_b

Có - mức độ đầy đủ. Nhưng tôi muốn tạo các bản đồ hiển thị các khu vực 'phóng to' ... để hiển thị chi tiết về một người raster
Becky

Hãy thử gọi renderer.setDestinationCrs () để thông báo cho trình kết xuất trong phạm vi CRS được chỉ định.
Matthias Kuhn

Câu trả lời:


4

Có lẽ nó sẽ đủ cho bạn chỉ cần lưu khung vẽ bản đồ dưới dạng hình ảnh sau khi phóng to đến mức độ quan tâm. Việc sử dụng mapCanvas () không thêm quá nhiều dòng mã và sẽ xuất một PNG đơn giản.

Từ bảng điều khiển python, mã này sẽ tạo ra một bản chụp màn hình đơn giản của khu vực được định hướng xung quanh một tính năng được chọn, tất cả các lớp hoạt động và bất kỳ nhãn được kích hoạt nào:

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

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

2

Nếu bạn biết tọa độ của hình chữ nhật, bạn có thể sử dụng mã sau:

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

ở đây, cho bạn, chỉ cần sử dụng

self.canvas.setExtent(rect)

Và chỉ cho chính xác:

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

hoặc tương tự cho plugin, không phải giao diện điều khiển pyqgis

self.canvas = self.iface.mapCanvas()

0

Quốc gia 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.