종의 분포지도를 수백 개 만들어야합니다. 각 종에 대한 분포를 포함하는 shapefile이 있으며 각 종에 대한 분포를 포함하고 있으며 관련 종의 이름, 범례 (영역을 구별하기 위해)를 포함하는 이미지 (jpg, png 또는 기타)로 맵을 얻고 싶습니다. 연간 분포, 번식, 비 사육 등 ...).
QGIS를 사용하여이 작업을 수행하고 싶습니다.
종의 분포지도를 수백 개 만들어야합니다. 각 종에 대한 분포를 포함하는 shapefile이 있으며 각 종에 대한 분포를 포함하고 있으며 관련 종의 이름, 범례 (영역을 구별하기 위해)를 포함하는 이미지 (jpg, png 또는 기타)로 맵을 얻고 싶습니다. 연간 분포, 번식, 비 사육 등 ...).
QGIS를 사용하여이 작업을 수행하고 싶습니다.
답변:
비슷한 요구 사항이 있었고 QGIS 플러그인을 조합하여 모든 종에 대한 점 위치가있는 shapefile을 기반으로 맵을 생성했습니다 (속성 테이블의 공통 분류 이름을 공통 식별자로 가정). 요구 사항이 복잡하지 않았습니다. 계절 정보, 제목 또는 범례가 필요하지 않았지만 유용한 출발점이 될 수 있습니다. 더 복잡한 측면을 위해서는 맵 작성기를 사용해야합니다. 자세한 내용은 PyQGIS 요리 책 을 참조하십시오 .
플러그인
플러그인은 맵 생성을 자동화하고 범위, 해상도 및 기타 측면을 구성 할 수 있습니다. 그리드 오버레이와 동일한 스타일을 출력에 적용합니다. 현재 QGIS 개발 버전 (1.9 이상)에서만 실행됩니다.
Sextante 스크립트
플러그인을 만들기 전에 SEXTANTE를 사용하여 논리를 해결했습니다. 이 사용자 스크립트는 1.8에서 작동해야합니다 (테스트하지는 않았습니다). 배포 스타일 파일 (.qml)은 출력 배포의 스타일입니다 (배포 오버레이의 스타일은 무시 함). 현재 운영 체제 기본값 (Linux의 경우 / tmp 및 Windows의 다양한 위치-TEMP 환경 변수로 정의 됨)을 기준으로 temp 디렉토리에 출력 맵을 배치합니다. 코드에서 직접 쉽게 정의 할 수 있습니다. 또한 코드에서 범위와 출력 해상도를 편집해야합니다 (바다에 다른 색을 원할 경우 배경색).
#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)
selectbylocation
단계, 그리고 추가로 추가 selectbyattribute
하고 saveselectedfeatures
각 시즌 (변경 단계 grid_layer
로 all_localities
). 그런 다음 더 많은 .qml 파일을로드하고 계절별 모양 파일을 추가하십시오 (맨 위 레이어가 먼저 추가됨). 잘 모르겠다면 위의 스크립트를 편집하여 더 많은 작업을 할 수 있습니다.
오늘이 일을하는 데 시간이 조금 걸렸습니다. 그래서 나는 당신의 스크립트를 약간 변경했습니다. .qml 파일을 사용하고 계절 필드가 동일한 쉐이프 파일에 있으므로 추가 selectbytribute 및 saveselected 기능 단계를 추가 할 필요가 없습니다. 아래에서 내가 한 일을 볼 수 있습니다.
#Definition of inputs and outputs
#==================================
##[Scratch]=group
##all_localities=vector
##taxon_field=field all_localities
##seasonal_field=field all_localities
##countries_map=vector
##distribution_style_file=file
##output_folder=folder
#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(221,249,254) # blue sea
img.fill(color.rgb())
# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)
render = QgsMapRenderer()
# create layer set
countries_layer = QGisLayers.getObjectFromUri(countries_map)
taxon_layer = QGisLayers.getObjectFromUri(taxon_shp)
lst = []
lst.append(taxon_layer.id())
lst.append(countries_layer.id())
render.setLayerSet(lst)
# set extent (xmin,ymin,xmax,ymax)
rect = QgsRectangle(-11,32,39,71)
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 = output_folder
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)
filename = os.path.join(tempdir,"taxon.shp") #memory file better?
sextante.runalg('qgis:saveselectedfeatures', all_localities, filename)
print_map(taxon,filename)
개선을위한 언급이나 조언이 있으시면 망설이지 마십시오.
그것을 개선하기 위해, 우리가 범위를 선택할 때 (예를 들어 유럽의 경우) 가장 좋을 것입니다.이 범위를 사용 하여이 범위 안에 포함 된 종만 선택합니다. 예를 들어 유럽 이외의 지역에서도 모든 종에 대한지도를 얻을 수 있기 때문에 (빈지도가 많이 있습니다). 가능하다고 생각하십니까?
건배,
오네 심