Created
May 27, 2019 07:29
-
-
Save NyakudyaA/ebadd89d86728af9989012c03dbb285b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##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