Tôi đã có một yêu cầu tương tự và kết hợp một plugin QGIS để tạo các bản đồ, dựa trên một shapefile với các địa phương điểm cho tất cả các loài (nó giả sử một tên đơn vị phân loại duy nhất trong bảng thuộc tính làm định danh chung). Yêu cầu của tôi không phức tạp - tôi không cần thông tin theo mùa, tiêu đề hoặc huyền thoại, nhưng nó có thể là điểm khởi đầu hữu ích cho bạn. Đối với các khía cạnh phức tạp hơn, bạn sẽ cần sử dụng trình soạn thảo bản đồ. Xem sách dạy nấu ăn PyQGIS để biết thêm về điều đó.
Cắm vào
Plugin tự động hóa việc tạo các bản đồ và cho phép bạn định cấu hình phạm vi, độ phân giải và các khía cạnh khác. Nó áp dụng cùng một kiểu cho đầu ra như lớp phủ lưới của bạn. Hiện tại, nó chỉ chạy trên phiên bản phát triển của QGIS (1.9 trở lên).
Kịch bản Sextante
Trước khi tôi tạo plugin, tôi đã xử lý logic bằng SEXTANTE. Tập lệnh người dùng này cũng sẽ hoạt động trong 1.8 (chưa được kiểm tra). Tệp kiểu phân phối (.qml) là kiểu của các bản phân phối đầu ra (nó bỏ qua kiểu của lớp phủ phân phối). Hiện tại, nó đặt các bản đồ đầu ra trong thư mục tạm thời dựa trên mặc định của hệ điều hành của bạn (/ tmp trong Linux và các vị trí khác nhau trong Windows - được xác định bởi biến môi trường TEMP). Bạn có thể dễ dàng xác định rằng trong mã. Bạn cũng sẽ cần chỉnh sửa phạm vi và độ phân giải đầu ra trong mã (và màu nền nếu bạn muốn một màu khác cho biển).
#Definition of inputs and outputs
#==================================
##[Scratch]=group
##all_localities=vector
##taxon_field=field all_localities
##africa_map=vector
##sa_map=vector
##grid_layer=vector
##distribution_style_file=file
#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.QGisLayers import QGisLayers
from sextante.core.SextanteVectorWriter import SextanteVectorWriter
import tempfile
import os
def print_map(taxon,taxon_shp):
#load taxon layer (necessary?)
#QGisLayers.load(taxon_shp,name = "taxon",style = distribution_style_file)
taxon_layer = QgsVectorLayer(taxon_shp,"taxon","ogr")
QgsMapLayerRegistry.instance().addMapLayer(taxon_layer)
taxon_layer.loadNamedStyle(distribution_style_file)
# create image (dimensions 325x299)
img = QImage(QSize(325,299), QImage.Format_ARGB32_Premultiplied)
# set image's background color
color = QColor(192,192,255) # blue sea
img.fill(color.rgb())
# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)
render = QgsMapRenderer()
# create layer set
africa_layer = QGisLayers.getObjectFromUri(africa_map)
sa_layer = QGisLayers.getObjectFromUri(sa_map)
#taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)
lst = []
lst.append(taxon_layer.id())
lst.append(sa_layer.id())
lst.append(africa_layer.id())
render.setLayerSet(lst)
# set extent (xmin,ymin,xmax,ymax)
rect = QgsRectangle(14.75,-36.00,34.00,-21.00)
render.setExtent(rect)
# set output size
render.setOutputSize(img.size(), img.logicalDpiX())
# do the rendering
render.render(p)
p.end()
# save image
#outdir = os.path.dirname(os.path.abspath(output))
tempdir = tempfile.gettempdir()
img.save(os.path.join(tempdir,taxon+".png"),"png")
# remove taxon layer from project
QgsMapLayerRegistry.instance().removeMapLayers([taxon_layer.id()])
tempdir = tempfile.gettempdir()
taxa = sextante.runalg('qgis:listuniquevalues', all_localities, taxon_field, None)['UNIQUE_VALUES'].split(";")
for taxon in taxa:
sextante.runalg('qgis:selectbyattribute', all_localities, taxon_field, 0, taxon)
sextante.runalg('qgis:selectbylocation', grid_layer, all_localities, 0)
filename = os.path.join(tempdir,"taxon.shp") #memory file better?
sextante.runalg('qgis:saveselectedfeatures', grid_layer, filename)
print_map(taxon,filename)