Created
March 13, 2023 19:57
-
-
Save AndrewTheTM/ae5540a3e2501249a7be1b2d3e5aeb86 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
# NOTE: There's a post that will be on siliconcreek.net about this someday soon. | |
import os | |
map_list = [ | |
{'fieldname': 'final_accessibility_auPkRetail', 'Legend Name': 'Peak Auto Accessibility to Retail', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_auPkTotal', 'Legend Name': 'Peak Auto Accessibility to Total Emp.', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_auOpRetail', 'Legend Name': 'Off-Peak Auto Accessibility to Retail', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_auOpTotal', 'Legend Name': 'Off-Peak Auto Accessibility to Total Emp.', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_trPkRetail', 'Legend Name': 'Peak Transit Accessibility to Retail', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_trPkTotal', 'Legend Name': 'Peak Transit Accessibility to Total Emp', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_trPkHH', 'Legend Name': 'Peak Transit Accessibility to Households', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_trOpRetail', 'Legend Name': 'Off-Peak Transit Accessibility to Retail', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_trOpTotal', 'Legend Name': 'Off-Peak Transit Accessibility to Total Emp.', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_nmRetail', 'Legend Name': 'Non-motorized Accessibility to Retail', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'final_accessibility_nmTotal', 'Legend Name': 'Non-motorized Accessibility to Total Emp', 'qryZero': False, 'tablename': 'final_accessibility', 'precision': 4}, | |
{'fieldname': 'land_use_HH', 'Legend Name': 'Number of Households', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_GQPOP', 'Legend Name': 'Group Quarters Population', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_TOTEMP', 'Legend Name': 'Total Employment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_INDEMP', 'Legend Name': 'Industrial Employment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_RETEMP', 'Legend Name': 'Retail Employment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_OFFEMP', 'Legend Name': 'Office Employment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_OTHEMP', 'Legend Name': 'Other Employment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_K_8', 'Legend Name': 'Primary School Enrollment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_G9_12', 'Legend Name': 'High School Student Enrollment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}, | |
{'fieldname': 'land_use_COLLEGE', 'Legend Name': 'College Enrollment', 'qryZero': True, 'tablename': 'land_use', 'precision': 0}] | |
{'fieldname': 'land_use_AREATYPE', 'Legend Name': 'Area Type', 'qryZero': True, 'tablename': 'land_use', 'or_classes': 6, 'cat_legend': True, 'precision': 0} | |
{'fieldname': 'final_land_use_density_index', 'Legend Name': 'Density Index', 'qryZero': False, 'tablename': 'final_land_use', 'precision': 4} | |
] | |
export_map_location = "C:\\MAKE\\A\\PATH\\HERE" | |
extents = [xmin, ymin, xmax, ymax] | |
cb_colors = ['#8dd3c7','#ffffb3','#bebada','#fb8072','#80b1d3','#fdb462','#b3de69','#fccde5','#d9d9d9','#bc80bd','#ccebc5','#ffed6f'] | |
layer_list = QgsProject.instance().mapLayers().values() | |
for layer in layer_list: | |
if layer.source().find("TAZ_FILE_NAME_PART_THAT_IS_UNIQUE") > 0: | |
break | |
layer.setSubsetString("") | |
for map in map_list: | |
fieldname = map['fieldname'] | |
print(f"Building {fieldname}") | |
query = map['qryZero'] | |
table_name = map['tablename'] | |
target_query = "" | |
legend_name = map['Legend Name'] | |
num_classes = 10 | |
if 'or_classes' in map.keys(): | |
num_classes = map['or_classes'] | |
categorical = False | |
if 'cat_legend' in map.keys(): | |
categorical = map['categorical'] | |
precision = 0 | |
if 'precision' in map.keys(): | |
precision = map['precision'] | |
if query: | |
layer_join = layer.vectorJoins() | |
for joined_layer_name in layer_join: | |
if joined_layer_name.joinLayer().name() == table_name: | |
joined_layer = joined_layer_name.joinLayer() | |
key_field = joined_layer_name.joinFieldName() | |
select_tazs = f"Select {key_field} from {joined_layer} where {fieldname} > 0" | |
expected_fields = [key_field] | |
request = QgsFeatureRequest() | |
request.setFlags(QgsFeatureRequest.NoGeometry) | |
taz_list_feat_iter = list(joined_layer.getFeatures(request)) | |
target_query = f"\"{joined_layer_name.targetFieldName()}\" in (" | |
for taz_feat in taz_list_feat_iter: | |
if taz_feat.attribute(fieldname[len(table_name) + 1:]) > 0: | |
target_query += str(taz_feat.attribute(key_field)) + "," | |
target_query = target_query[:-1] + ")" | |
break | |
layer.setSubsetString(target_query) | |
format = QgsRendererRangeLabelFormat() | |
format.setFormat("%1 - %2") | |
format.setPrecision(precision) | |
format.setTrimTrailingZeroes(True) | |
if not categorical: | |
groupRenderer = QgsGraduatedSymbolRenderer() | |
groupRenderer.setClassAttribute(fieldname) | |
groupRenderer.setClassificationMethod(QgsClassificationJenks()) | |
groupRenderer.setSourceColorRamp(QgsStyle().defaultStyle().colorRamp('Spectral')) | |
groupRenderer.updateColorRamp(QgsStyle().defaultStyle().colorRamp('Spectral')) | |
groupRenderer.setLabelFormat(format) | |
groupRenderer.updateClasses(layer, num_classes) | |
layer.setRenderer(groupRenderer) | |
layer.setOpacity(0.4) | |
layer.setName(legend_name) | |
layer.triggerRepaint() | |
else: | |
fni = layer.fields().indexFromName(fieldname) | |
unique_values = list(layer.uniqueValues(fni)) | |
# fill categories | |
categories = [] | |
for unique_value in unique_values: | |
# initialize the default symbol for this geometry type | |
symbol = QgsSymbol.defaultSymbol(layer.geometryType()) | |
# configure a symbol layer | |
layer_style = {} | |
layer_style['color'] = cb_colors[unique_values.index(unique_value)] | |
layer_style['outline'] = '#000000' | |
symbol_layer = QgsSimpleFillSymbolLayer.create(layer_style) | |
# replace default symbol layer with the configured one | |
if symbol_layer is not None: | |
symbol.changeSymbolLayer(0, symbol_layer) | |
# create renderer object | |
category = QgsRendererCategory(unique_value, symbol, str(unique_value)) | |
# entry for the list of category items | |
categories.append(category) | |
# create renderer object | |
renderer = QgsCategorizedSymbolRenderer(fieldname, categories) | |
# assign the created renderer to the layer | |
if renderer is not None: | |
layer.setRenderer(renderer) | |
layer.setOpacity(0.4) | |
layer.setName(legend_name) | |
layer.triggerRepaint() | |
projectLayoutManager = QgsProject.instance().layoutManager() | |
layout = projectLayoutManager.layoutByName('Landscape') | |
refmap = layout.referenceMap() | |
bb = QgsRectangle(extents[0], extents[1], extents[2], extents[3]) | |
refmap.setExtent(bb) | |
layout.update() | |
exporter = QgsLayoutExporter(layout) | |
export_settings = QgsLayoutExporter.ImageExportSettings() | |
export_settings.cropToContents = False | |
export_settings.dpi = 300 | |
exporter.exportToImage(os.path.join(export_map_location,fieldname + '.png'), export_settings) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment