Skip to content

Instantly share code, notes, and snippets.

@NyakudyaA
Created May 27, 2019 07:29
Show Gist options
  • Save NyakudyaA/ebadd89d86728af9989012c03dbb285b to your computer and use it in GitHub Desktop.
Save NyakudyaA/ebadd89d86728af9989012c03dbb285b to your computer and use it in GitHub Desktop.
##Analyis=group
##Raster_layers=multiple raster
##Composer_template=file
##Output_Directory=folder
import datetime
import os
import re
from qgis.core import *
from qgis.core import (
QgsProject, QgsComposition)
from qgis.utils import *
from qgis.utils import *
from qgis.utils import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import QDomDocument
class PrintClass(object):
def __init__(self):
self.now = datetime.datetime.now()
self.template_path = Composer_template
self.output_folder = processing.getObject(Output_Directory)
def get_layer(self):
layers = QgsMapLayerRegistry.instance().mapLayers().values()
for x in layers:
if x.name() == "Grid":
idx = x.fieldNameIndex("name")
farm_name_value = x.uniqueValues(idx)
return farm_name_value
def set_visibility(self):
root = QgsProject.instance().layerTreeRoot()
ppm = root.findGroup("Rasters")
if ppm:
ppm.setVisible(Qt.Unchecked)
# qgis.utils.iface.mapCanvas().refresh()
print "Toggle visibility of group layer"
else:
print "Group layer already not visible or found"
return
def print_map(self, layer, ):
# Activate raster layer
legend = iface.legendInterface()
legend.setLayerVisible(layer, True)
iface.mapCanvas().refresh()
Week = layer.name()[-2:]
print "Layer activated"
mapRenderer = iface.mapCanvas().mapRenderer()
# Load template from file
c = QgsComposition(mapRenderer)
template_file = file(self.template_path)
template_content = template_file.read()
template_file.close()
document = QDomDocument()
document.setContent(template_content)
c.loadFromTemplate(document)
# Add label for farm name
composerLabel = QgsComposerLabel(c)
farm_name_value = self.get_layer()
composerLabel.setText(farm_name_value[0].upper())
composerLabel.setFont(QFont("Arial", 16))
composerLabel.setFontColor(QColor(0, 100, 0, ))
composerLabel.adjustSizeToText()
composerLabel.setBackgroundEnabled(False)
c.addItem(composerLabel)
composerLabel.setItemPosition(15, 4)
composerLabel = QgsComposerLabel(c)
# add label for pest on map
composerLabel = QgsComposerLabel(c)
layerlabel = layer.name().replace(' ', '')[:-8]
composerLabel.setText(layerlabel + " " + 'Week' + " " + Week)
composerLabel.setFont(QFont("Arial", 14))
composerLabel.setFontColor(QColor(30, 85, 26, ))
composerLabel.adjustSizeToText()
composerLabel.setBackgroundEnabled(False)
c.addItem(composerLabel)
composerLabel.setItemPosition(15, 10)
composerLabel = QgsComposerLabel(c)
# Add date and time label
composerLabel.setText(str(self.now.day) + " " + str(self.now.month) + " " + str(self.now.year))
composerLabel.setFont(QFont("Arial", 12))
composerLabel.adjustSizeToText()
composerLabel.setBackgroundEnabled(False)
c.addItem(composerLabel)
composerLabel.setItemPosition(90, 75)
# add an ppm weekly image into the map
spikes = "ppm_weekly"
# Build up path for PPM weekly folder
weekly_dir_ppm = os.path.join(Output_Directory,spikes)
if not os.path.exists(weekly_dir_ppm):
os.makedirs(weekly_dir_ppm)
os.chdir(weekly_dir_ppm)
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if re.match(layer.name(), name):
if os.path.splitext(name)[1] == '.svg':
logo = QgsComposerPicture(c)
image = name
image_path = os.path.join(weekly_dir_ppm, layerlabel, image)
print image_path
logo.setPictureFile(image_path)
logo.setSceneRect(QRectF(0, 80, 140, 110)) # Resize logo
logo.setItemPosition(290, 195)
c.addItem(logo)
else:
pass
# add average bar graph image into the map
ppm_spikes = "ppm_spikes"
# Build up path for PPM spikes folder
weekly_dir_avg = os.path.join(Output_Directory,ppm_spikes)
if not os.path.exists(weekly_dir_avg):
os.makedirs(weekly_dir_avg)
os.chdir(weekly_dir_avg)
pest_avg_name = layerlabel + "_average"
print pest_avg_name
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if re.match(pest_avg_name,name):
if os.path.splitext(name)[1] == '.svg':
logo = QgsComposerPicture(c)
image = name
os.getcwd()
image_path = os.path.join(weekly_dir_avg,layerlabel, image)
print image_path + " is the graph for average"
logo.setPictureFile(image_path)
logo.setSceneRect(QRectF(0, 80, 140, 110)) # Resize logo
logo.setItemPosition(0, 62)
c.addItem(logo)
else:
pass
# add legend
composerLegend = QgsComposerLegend(c)
layerGroup = QgsLayerTreeGroup()
layerGroup.insertLayer(0, layer)
composerLegend.modelV2().setRootGroup(layerGroup)
composerLegend.setTitle('%s'%layerlabel)
c.addItem(composerLegend)
composerLegend.setItemPosition(5, 150)
newFont = QFont("Arial", 8)
composerLegend.setStyleFont(QgsComposerLegendStyle.Title, newFont)
composerLegend.setStyleFont(QgsComposerLegendStyle.Subgroup, newFont)
composerLegend.setStyleFont(QgsComposerLegendStyle.SymbolLabel, newFont)
composerLegend.setBackgroundEnabled(False)
composerLegend.updateLegend()
os.chdir(Output_Directory)
report_name = "reports"
directory = os.path.join(Output_Directory,report_name)
if not os.path.exists(directory):
os.makedirs(directory)
output_pdf = layer.name() + '.pdf'
output_map = os.path.join(directory, output_pdf)
if not os.path.exists(output_map):
c.exportAsPDF(output_map)
else:
os.remove(output_map)
c.exportAsPDF(output_map)
return
def run(self):
layersUri = Raster_layers.split(';')
for i, uri in enumerate(layersUri):
progress.setPercentage(int(100 * i / len(layersUri)))
layer = processing.getObjectFromUri(uri)
print layer.name()
self.set_visibility()
self.print_map(layer)
print 'finished'
reporter = PrintClass()
reporter.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment