Hi Robert,
In 2018 I reached out to FEMA for advice on symbology. They sent me two MXDs they used to symbolize the layer for their own services. In that, they used combinations from two categories in the FEMA flood zones to create a symbol: FLD_ZONE and ZONE_SUBTY. Some of the combinations seemed contraintuitive so I reconfirmed with them, and the result is what you see in the feature and image layers in the Living Atlas.
Every year, sometimes twice a year, a script is run against the FEMA flood layer update to assign the esri_symbology field from these fields: FLD_ZONE, ZONE_SUBTY. Then the layer is updated with that.
You found some of the more unusual combinations which led to symbols receiving a 0.2% flood hazard color, it seemed strange to me too but I got confirmation from the agency August 1, 2018.
The symbols they recommended seemed more about people understanding the layer more than simply assigning a color to a code, so the symbology was well received as a "front end" to the dataset.
Every polygon is put through the following decision tree to determine its esri_symbology value (row[2]). The result is an integer between 0 and 15 and that value is also rasterized to create the image layer:
print("Cursoring through copy of FEMA feature class and populating esri_symbology...")
with arcpy.da.UpdateCursor(incodedfema,["FLD_ZONE","ZONE_SUBTY","esri_symbology"]) as cursor:
for row in cursor:
if row[0] == "A":
if row[1] == 'ADMINISTRATIVE FLOODWAY':
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "A99":
if row[1] == "AREA WITH REDUCED FLOOD RISK DUE TO LEVEE":
row[2] = 7 #Area with Reduced Risk Due to Levee
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "AE":
if row[1] == 'AREA OF SPECIAL CONSIDERATION':
row[2] = 3 ##Special Floodway
elif row[1] == 'COLORADO RIVER FLOODWAY':
row[2] = 3 ##Special Floodway
elif row[1] == "FLOODWAY CONTAINED IN STRUCTURE":
row[2] = 2 #Regulatory Floodway
elif row[1] == "STATE ENCROACHMENT AREA":
row[2] = 2 #Regulatory Floodway
elif row[1] == "FLOODWAY":
row[2] = 2 #Regulatory Floodway
elif row[1] == "1 PCT CONTAINED IN STRUCTURE, COMMUNITY ENCROACHMENT":
row[2] = 2 #Regulatory Floodway
elif row[1] == "1 PCT CONTAINED IN STRUCTURE, FLOODWAY":
row[2] = 2 #Regulatory Floodway
elif row[1] == "FLOODWAY CONTAINED IN CHANNEL":
row[2] = 2 #Regulatory Floodway
elif row[1] == "COMMUNITY ENCROACHMENT AREA":
row[2] = 2 #Regulatory Floodway
elif row[1] == "COMMUNITY ENCROACHMENT":
row[2] = 2 #Regulatory Floodway
elif row[1] == "ADMINISTRATIVE FLOODWAY":
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "AH":
if row[1] == 'FLOODWAY':
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "AO":
if row[1] == 'FLOODWAY':
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "AREA NOT INCLUDED":
row[2] = 15 #nodata
elif row[0] == "D":
row[2] = 4 #Area of Undetermined Flood Hazard
elif row[0] == "NP":
row[2] = 15 #nodata
elif row[0] == "OPEN WATER":
row[2] = 15 #nodata
elif row[0] == "V":
if row[1] == "COMMUNITY ENCROACHMENT AREA":
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "VE":
if row[1] == "COMMUNITY ENCROACHMENT AREA":
row[2] = 2 #Regulatory Floodway
else:
row[2] = 1 #1% Annual Chance Flood Hazard
elif row[0] == "X":
if row[1] == "AREA WITH REDUCED FLOOD RISK DUE TO LEVEE":
row[2] = 7 #Area with Reduced Risk Due to Levee
elif row[1] == "1 PCT FUTURE CONDITIONS":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "1 PCT FUTURE CONDITIONS, FLOODWAY":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "1 PCT FUTURE CONDITIONS, COMMUNITY ENCROACHMENT":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "1 PCT FUTURE CONDITIONS CONTAINED IN STRUCTURE":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "1 PCT FUTURE IN STRUCTURE, COMMUNITY ENCROACHMENT":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "1 PCT FUTURE IN STRUCTURE, FLOODWAY":
row[2] = 6 #Future Conditions 1% Annual Chance Flood Hazard
elif row[1] == "0.2 PCT ANNUAL CHANCE FLOOD HAZARD":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "0.2 PCT ANNUAL CHANCE FLOOD HAZARD CONTAINED IN CHANNEL":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "0.2 PCT ANNUAL CHANCE FLOOD HAZARD CONTAINED IN STRUCTURE":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "1 PCT CONTAINED IN STRUCTURE, COMMUNITY ENCROACHMENT":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "1 PCT DEPTH LESS THAN 1 FOOT":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "1 PCT DRAINAGE AREA LESS THAN 1 SQUARE MILE":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "AREA OF SPECIAL CONSIDERATION":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "1 PCT CONTAINED IN STRUCTURE, FLOODWAY":
row[2] = 2 #Regulatory Floodway
elif row[1] == "0.2 PCT ANNUAL CHANCE FLOOD HAZARD IN COASTAL ZONE":
row[2] = 5 #0.2% Annual Chance Flood Hazard
elif row[1] == "0.2 PCT ANNUAL CHANCE FLOOD HAZARD IN COMBINED RIVERINE AND COASTAL ZONE":
row[2] = 5 #0.2% Annual Chance Flood Hazard
else:
row[2] = 8 #AREA OF MINIMAL FLOOD HAZARD
else:
row[2] = 15
print("missing category in dataset, please check the logic in the script")
cursor.updateRow(row)