Skip to content

Instantly share code, notes, and snippets.

@AndrewTheTM
Created March 13, 2023 19:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrewTheTM/ae5540a3e2501249a7be1b2d3e5aeb86 to your computer and use it in GitHub Desktop.
Save AndrewTheTM/ae5540a3e2501249a7be1b2d3e5aeb86 to your computer and use it in GitHub Desktop.
# 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