About the data¶

To get a copy of the planning data you'll need to contact the data broker information specified here on this page.

Unfortunately there is no self service process, but all you need to do is just ask and provide some context on why you're using it. If you're looking to use it to better understand how the planning system works and educational purposes you'll have no trouble getting access, but I have no doubt for any other reasons you can get access as well.

Extracting the data¶

In my case I placed a file called All_EPI_Data_Shapefile_GDA2020_08052025.zip in a directory called byo_planning_data. If you're using this notebook, feel free to update that to whereever you've stored your data.

In [1]:
import zipfile
import shutil
import os

shutil.rmtree('out_planning_data', ignore_errors=True)
os.makedirs('out_planning_data', exist_ok=True)
os.makedirs('images', exist_ok=True)

zip_src = 'byo_planning_data/All_EPI_Data_Shapefile_GDA2020_08052025.zip'
zip_out = 'out_planning_data'

with zipfile.ZipFile('byo_planning_data/All_EPI_Data_Shapefile_GDA2020_08052025.zip', 'r') as zip_ref:
    zip_ref.extractall(zip_out)

Representing files as data¶

Personally I like to represent data I'm interacting with some kind of interface, so I've created a dataclass called Resource, which we'll have some basic methods for interacting with maniulating file paths. As well as hacky method that supresses warnings if you're opening a dataframe after sanitising it. Speaking of:

Shapefile sanitisation¶

I have a function that sanitises the data overwrite_with_ogr2ogr, it doesn't really do a great job to be honest, beyond avoiding some encoding issues. I mostly added it to address a warning "... contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.". Unforunately my use of ogr2ogr didn't really fix that.

Speaking of, you'll want to install ogr2ogr (or maybe you want to update my code to remove this step seeing as it doesn't really address the issue), but on macos you can install it via GDAL like so:

brew install gdal
In [2]:
from dataclasses import dataclass
import geopandas as gpd
import warnings
import os

def overwrite_with_ogr2ogr(fname_in, fname_out):
    import subprocess
    GDA2020 = "EPSG:7844"
    
    subprocess.run([
        "ogr2ogr", "-f", "ESRI Shapefile", fname_out, fname_in, 
        "-nlt", "MULTIPOLYGON", "-lco", "ENCODING=UTF-8",
        "-t_srs", GDA2020,
    ])

should_skip = {
    'EPI_Acid_Sulfate_Soils', 
    'EPI_Foreshore_Building_Line',
}

should_fix = {
    'EPI_CSG_Exclusions',
    'EPI_Floor_Space_Ratio',
    'EPI_Flood',
    'EPI_Height_Of_Building',
    'EPI_Land_Zoning',
    'EPI_Local_Provisions',
}

@dataclass
class Resource:
    dir_name: str
    _file_name: str
    skip: bool = False
    should_fix: bool = False
    corrected: bool = False

    def get_df(self):
        """
        I'm aware of the issues, and kind of don't care.
        """
        if self.corrected:
            with warnings.catch_warnings():
                warnings.filterwarnings("ignore", category=RuntimeWarning)
                return gpd.read_file(self.database_file)
        else:
            return gpd.read_file(self.database_file)

    @property
    def file_name(self):
        return f'{self._file_name}_fix' if self.corrected else self._file_name

    @property
    def shapefile(self):
        return f'{self.dir_name}/{self.file_name}.shp'
        
    @property
    def shapefile_fixed(self):
        return f'{self.dir_name}/{self.file_name}_fix.shp'

        
    @property
    def database_file(self):
        return f'{self.dir_name}/{self.file_name}.dbf'

    def __lt__(self, other):
        return self.shapefile < other.shapefile

    @staticmethod
    def create(dir_name: str, file_name: str):
        _fname =  file_name[:file_name.rfind('.')]
        return Resource(dir_name, _fname, 
                        skip=_fname in should_skip,
                        should_fix=_fname in should_fix)

File system discovery¶

Basically lets traverse the files in the directory and lift the relevant information into our Resource data structure to represent the data of the output of unziped zip.

In [3]:
epi_data = sorted(
    Resource.create(zip_out, file_name)
    for file_name in os.listdir(zip_out) 
    if file_name.endswith('dbf') and not file_name.endswith('_fix.dbf')
)

Display contents of files¶

Here lets just inspect the shapefiles to see what columns and data they contain, we'll also "Fix" the files in the process. Hopefully I can revisit this and actually meaningful fix the warnings being output here, but this won't really prevent us from proceeding. IMO, it's probably isolated to a few shapes, but I haven't really meaningful looked that deep into it.

In [4]:
import pandas as pd
import geopandas as gpd

def create_summary_df(resources):
    for item in resources:
        if item.skip:
            continue
        
        if item.should_fix and not item.corrected:
            print(f'Fixing {item.shapefile}')
            overwrite_with_ogr2ogr(item.shapefile, item.shapefile_fixed)
            item.corrected = True       
        df = item.get_df()
        print('🩹' if item.corrected else '👍', 'loaded', item.file_name)    
        yield (item.file_name, list(df.columns))

file_names, columns = zip(*create_summary_df(epi_data))
pd.set_option('display.max_colwidth', None)
metadata_df = pd.DataFrame.from_dict({ 'file_name': file_names, 'columns': columns })
metadata_df
👍 loaded EPI_Active_Street_Frontages
👍 loaded EPI_Additional_Permitted_Uses
👍 loaded EPI_Additional_Rural_Village_Land
👍 loaded EPI_Bulk_Water_Supply
Fixing out_planning_data/EPI_CSG_Exclusions.shp
Warning 1: out_planning_data/EPI_CSG_Exclusions.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_CSG_Exclusions_fix
👍 loaded EPI_Critical_Habitat
👍 loaded EPI_Drinking_Water_Catchments
👍 loaded EPI_Dwelling_Density
👍 loaded EPI_Environmental_Cons_Area
👍 loaded EPI_Environmentally_Sensitive_Land
Fixing out_planning_data/EPI_Flood.shp
Warning 1: out_planning_data/EPI_Flood.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_Flood_fix
Fixing out_planning_data/EPI_Floor_Space_Ratio.shp
Warning 1: out_planning_data/EPI_Floor_Space_Ratio.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_Floor_Space_Ratio_fix
👍 loaded EPI_Future_Residential_Growth_Area
👍 loaded EPI_Geotechnical
👍 loaded EPI_Gross_Floor_Area
👍 loaded EPI_Groundwater_Vulnerability
👍 loaded EPI_Growth_Centres
Fixing out_planning_data/EPI_Height_Of_Building.shp
Warning 1: out_planning_data/EPI_Height_Of_Building.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_Height_Of_Building_fix
👍 loaded EPI_Heritage
👍 loaded EPI_Heritage_Points
👍 loaded EPI_Industrial_Release_Area
👍 loaded EPI_Key_Sites
👍 loaded EPI_Land_Application
👍 loaded EPI_Land_Reclassification
👍 loaded EPI_Land_Reservation_Acquisition
Fixing out_planning_data/EPI_Land_Zoning.shp
Warning 1: out_planning_data/EPI_Land_Zoning.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_Land_Zoning_fix
👍 loaded EPI_Landslide_Risk
👍 loaded EPI_Lease_Area
👍 loaded EPI_Local_Complying_Exclusion
👍 loaded EPI_Local_Exempt_Exclusion
Fixing out_planning_data/EPI_Local_Provisions.shp
Warning 1: out_planning_data/EPI_Local_Provisions.shp contains polygon(s) with rings with invalid winding order. Autocorrecting them, but that shapefile should be corrected using ogr2ogr for example.
🩹 loaded EPI_Local_Provisions_fix
👍 loaded EPI_Lot_Size
👍 loaded EPI_Map_Tiles
👍 loaded EPI_Mineral_And_Extractive
👍 loaded EPI_Native_Veg_Protection
👍 loaded EPI_Noise_Exposure_Forecast
👍 loaded EPI_Obstacle_Limitation_Surface
👍 loaded EPI_Precinct_Boundaries
👍 loaded EPI_Reduced_Level
👍 loaded EPI_Referral_Area
👍 loaded EPI_Riparian_Lands_Watercourses
👍 loaded EPI_Salinity
👍 loaded EPI_Scenic_Protection
👍 loaded EPI_Special_Areas
👍 loaded EPI_Special_Provision
👍 loaded EPI_State_Significant_Dev_Sites
👍 loaded EPI_Strategic_Agricultural_Land
👍 loaded EPI_Strategic_Foreshore_Sites_Points
👍 loaded EPI_Terrestrial_Biodiversity
👍 loaded EPI_Transport_Arterial_Rd_Infra
👍 loaded EPI_Urban_Release_Area
👍 loaded EPI_Water_Zoning
👍 loaded EPI_Wetlands
👍 loaded EPI_Wetlands_Protection_Area
Out[4]:
file_name columns
0 EPI_Active_Street_Frontages [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
1 EPI_Additional_Permitted_Uses [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, APU_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
2 EPI_Additional_Rural_Village_Land [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, Shape_Leng, Shape_Area, geometry]
3 EPI_Bulk_Water_Supply [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, SYM_CODE, EPI_TYPE, VerDate, Shape_Leng, Shape_Area, geometry]
4 EPI_CSG_Exclusions_fix [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, EPI_TYPE, LGA_NAME, LGA_CODE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
5 EPI_Critical_Habitat [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_US, CREATED_DA, VerDate, Shape_Leng, Shape_Area, geometry]
6 EPI_Drinking_Water_Catchments [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, COMMENTS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
7 EPI_Dwelling_Density [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, RESTRICTED, MIN_DWELLI, LABEL, SYM_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
8 EPI_Environmental_Cons_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, Shape_Leng, Shape_Area, geometry]
9 EPI_Environmentally_Sensitive_Land [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
10 EPI_Flood_fix [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, COMMENT, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
11 EPI_Floor_Space_Ratio_fix [EPI_NAME, LGA_NAME, LGA_CODE, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, FSR, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, d_EPI_NAME, d_LGA_NAME, d_LGA_CODE, d_LAY_CLAS, d_SYM_CODE, d_FSR, d_PCO_REF_, d_EPI_TYPE, geometry]
12 EPI_Future_Residential_Growth_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, Shape_Leng, Shape_Area, geometry]
13 EPI_Geotechnical [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_US, CREATED_DA, VerDate, Shape_Leng, Shape_Area, geometry]
14 EPI_Gross_Floor_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, SYM_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, UNITS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, Shape_Leng, Shape_Area, geometry]
15 EPI_Groundwater_Vulnerability [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
16 EPI_Growth_Centres [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PRECINCT, AREA_HA, AREA_SQM, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, SYM_CODE, EPI_TYPE, VerDate, Shape_Leng, Shape_Area, geometry]
17 EPI_Height_Of_Building_fix [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, MAX_B_H, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, UNITS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, CADID, MAX_B_H_M, MAX_B_H_RL, VerDate, SHAPE_Leng, SHAPE_Area, d_EPI_NAME, d_LGA_CODE, d_LGA_NAME, d_LAY_CLAS, d_SYM_CODE, d_MAX_B_H, d_UNITS, d_PCO_REF_, d_EPI_TYPE, d_MAX_B_H_, d_MAX_B_H1, geometry]
18 EPI_Heritage [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, H_ID, H_NAME, SIG, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
19 EPI_Heritage_Points [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_US, CREATED_DA, VerDate, geometry]
20 EPI_Industrial_Release_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, SYM_CODE, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
21 EPI_Key_Sites [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, KEYSITE_ID, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
22 EPI_Land_Application [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, PRECINCT, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
23 EPI_Land_Reclassification [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, COMMENTS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
24 EPI_Land_Reservation_Acquisition [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, AUTHORITY, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, LRA_TYPE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
25 EPI_Land_Zoning_fix [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, SYM_CODE, PURPOSE, COMMENTS, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
26 EPI_Landslide_Risk [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
27 EPI_Lease_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, SYM_CODE, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
28 EPI_Local_Complying_Exclusion [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, SYM_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
29 EPI_Local_Exempt_Exclusion [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, SYM_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
30 EPI_Local_Provisions_fix [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, SUGGESTED_, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, CLASS_DESC, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
31 EPI_Lot_Size [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, LOT_SIZE, UNITS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, CADID, PRECINCT, VerDate, SHAPE_Leng, SHAPE_Area, d_EPI_NAME, d_LGA_CODE, d_LGA_NAME, d_UNITS, d_PCO_REF_, d_EPI_TYPE, geometry]
32 EPI_Map_Tiles [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, MAP_SCALE, LEP_TYPE, MAP_SHEET, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, MAP_REF_ID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
33 EPI_Mineral_And_Extractive [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, COMMENTS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
34 EPI_Native_Veg_Protection [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
35 EPI_Noise_Exposure_Forecast [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, ANEF_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
36 EPI_Obstacle_Limitation_Surface [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, HEIGHT_RAN, MINIMUM_HE, MAXIMUM_HE, COMMENTS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
37 EPI_Precinct_Boundaries [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PRECINCT, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
38 EPI_Reduced_Level [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, SYM_CODE, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, UNITS, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
39 EPI_Referral_Area [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
40 EPI_Riparian_Lands_Watercourses [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
41 EPI_Salinity [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
42 EPI_Scenic_Protection [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
43 EPI_Special_Areas [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
44 EPI_Special_Provision [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, AREA_HA, AREA_SQM, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
45 EPI_State_Significant_Dev_Sites [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
46 EPI_Strategic_Agricultural_Land [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
47 EPI_Strategic_Foreshore_Sites_Points [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_DA, CREATED_US, VerDate, geometry]
48 EPI_Terrestrial_Biodiversity [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, COMMENTS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
49 EPI_Transport_Arterial_Rd_Infra [EPI_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, EPI_TYPE, SYM_CODE, VerDate, Shape_Leng, Shape_Area, geometry]
50 EPI_Urban_Release_Area [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, COMMENTS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
51 EPI_Water_Zoning [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_US, CREATED_DA, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
52 EPI_Wetlands [EPI_NAME, LGA_CODE, LGA_NAME, PUBLISHED_, COMMENCED_, CURRENCY_D, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, CREATED_US, CREATED_DA, LAST_EDITE, LAST_EDI_1, PCO_REF_KE, EPI_TYPE, SYM_CODE, CADID, VerDate, SHAPE_Leng, SHAPE_Area, geometry]
53 EPI_Wetlands_Protection_Area [EPI_NAME, AMENDMENT, MAP_TYPE, MAP_NAME, LAY_NAME, LAY_CLASS, SYM_CODE, LABEL, LEGIS_REF_, LEGIS_REF1, LEGIS_RE_1, PCO_REF_KE, PUBLISHED_, COMMENCED_, CURRENCY_D, EPI_TYPE, LAST_EDITE, LAST_EDI_1, CREATED_US, CREATED_DA, VerDate, SHAPE_Leng, SHAPE_Area, geometry]

Check out the unique LGA names¶

Sometimes LGA names are not represented how you'd expect, so lets just see what the naming convention is within these files.

In [5]:
df = next(epi.get_df() for epi in epi_data if 'Land_Zoning' in epi.file_name)
df['LGA_NAME'].unique()
Out[5]:
array(['KIAMA', 'CAMDEN', 'WOLLONGONG', 'SHOALHAVEN', 'TENTERFIELD',
       'SHELLHARBOUR', 'SYDNEY', 'BREWARRINA', 'SUTHERLAND SHIRE',
       'FEDERATION', 'INVERELL', None, 'YASS VALLEY',
       'LORD HOWE ISLAND - UNINCORPORATED AREA', 'THE HILLS SHIRE',
       'BLUE MOUNTAINS', 'PENRITH', 'BALRANALD', 'HILLTOPS',
       'CITY OF PARRAMATTA', 'ALBURY CITY', 'BATHURST REGIONAL',
       'BAYSIDE', 'BEGA VALLEY', 'BELLINGEN', 'BERRIGAN', 'BLACKTOWN',
       'BLAND', 'BLAYNEY', 'BOGAN', 'SNOWY MONARO REGIONAL', 'BOURKE',
       'BROKEN HILL', 'BURWOOD', 'CANADA BAY', 'CARRATHOOL',
       'CENTRAL COAST', 'CENTRAL DARLING', 'CLARENCE VALLEY', 'COBAR',
       'COOLAMON', 'COONAMBLE', 'COOTAMUNDRA-GUNDAGAI REGIONAL', 'COWRA',
       'CUMBERLAND', 'DUNGOG', 'EUROBODALLA', 'FORBES', 'GEORGES RIVER',
       'GILGANDRA', 'GLEN INNES SEVERN', 'GOULBURN MULWAREE',
       'GREATER HUME SHIRE', 'GRIFFITH', 'GUNNEDAH', 'GWYDIR', 'HAY',
       'HORNSBY', 'HUNTERS HILL', 'MURRUMBIDGEE', 'JUNEE', 'KEMPSEY',
       'KU-RING-GAI', 'KYOGLE', 'LANE COVE', 'LEETON', 'LISMORE',
       'LITHGOW CITY', 'LIVERPOOL', 'LIVERPOOL PLAINS', 'LOCKHART',
       'MAITLAND', 'NORTHERN BEACHES', 'MID-WESTERN REGIONAL',
       'MOREE PLAINS', 'MOSMAN', 'MURRAY RIVER', 'MUSWELLBROOK',
       'NAMBUCCA VALLEY', 'NARRABRI', 'NARRANDERA', 'NARROMINE',
       'NEWCASTLE', 'NORTH SYDNEY', 'OBERON', 'PARKES',
       'PORT MACQUARIE-HASTINGS', 'QUEANBEYAN-PALERANG REGIONAL', 'RYDE',
       'SINGLETON', 'STRATHFIELD', 'TEMORA', 'SNOWY VALLEYS', 'TWEED',
       'UPPER HUNTER', 'UPPER LACHLAN SHIRE', 'URALLA', 'WAGGA WAGGA',
       'WALCHA', 'WALGETT', 'WARREN', 'WARRUMBUNGLE', 'WEDDIN',
       'WENTWORTH', 'WINGECARRIBEE', 'WOOLLAHRA', 'RICHMOND VALLEY',
       'COFFS HARBOUR', 'WAVERLEY', 'ORANGE', 'LAKE MACQUARIE',
       'FAIRFIELD', 'CABONNE', 'PORT STEPHENS', 'LACHLAN', 'CESSNOCK',
       'CANTERBURY-BANKSTOWN', 'WILLOUGHBY', 'HAWKESBURY', 'RANDWICK',
       'DUBBO REGIONAL', 'CAMPBELLTOWN', 'WOLLONDILLY',
       'ARMIDALE REGIONAL', 'MID-COAST', 'BALLINA', 'BYRON',
       'TAMWORTH REGIONAL', 'EDWARD RIVER', 'INNER WEST'], dtype=object)

Plot an LGA¶

Now wrap up by using the data to plot an LGA. Lets do the the Inner West Council, judging by the output about it's just represented as "INNER WEST".

What kind of plot do we want to do?¶

Let just show the zoning, as well along with heritage information such as heritage conservation areas and such. Apparently there's also "Archaeological" and "Landscape" items, but I'm not quite sure what to make of those.

In [6]:
from matplotlib import pyplot as plt, patches

df_h = next(epi for epi in epi_data if 'EPI_Heritage' in epi.file_name).get_df()
df_z = next(epi for epi in epi_data if 'Land_Zoning' in epi.file_name).get_df()

df_h = df_h[df_h['LGA_NAME'] == 'INNER WEST']
df_z = df_z[df_z['LGA_NAME'] == 'INNER WEST']

zone_color_map = {
    'DM': 'black',
    'E1': '#ffff99',
    'E2': '#ffff66',
    'E3': '#ffff33',
    'E4': '#ffff00',
    'MU1': '#ff00ff',
    'R1': '#ff9999',
    'R2': '#ff6666',
    'R3': '#ff3333',
    'R4': '#ff0000',
    'RE1': '#00ff00',
    'RE2': '#99ff99',
    'SP1': '#999999',
    'SP2': '#666666',
    'W1': '#9999ff',
    'W2': '#6666ff',
    'W3': '#3333ff',
    'W4': '#0000ff',
}

h_color_map = {
    'Conservation Area - General': dict(edgecolor='#ff0000', facecolor='none', hatch='//', linewidth=1), 
    'Item - General': dict(edgecolor='black', facecolor='#C3B091', hatch=None, linewidth=0.75),
    # 'Item - Archaeological': None,   
    # 'Item - Landscape': None
}

fig, ax = plt.subplots(figsize=(16, 18))
df_z.plot(ax=ax, color=df_z['SYM_CODE'].map(zone_color_map), alpha=0.5)

for layer_type, style in h_color_map.items():
    subset = df_h[df_h['LAY_CLASS'] == layer_type]
    if not subset.empty:
        subset.plot(
            ax=ax,
            color=style['facecolor'],
            edgecolor=style['edgecolor'],
            hatch=style['hatch'],
            linewidth=style['linewidth'],
            label=layer_type,
        )

# Manually construct the legend
zone_elements = [
    patches.Patch(facecolor=color, edgecolor='black', label=f'{zone} (zone)')
    for zone, color in zone_color_map.items()
]
heritage_elements = [
    patches.Patch(facecolor=h_color_map[id]['facecolor'], 
                  edgecolor=h_color_map[id]['edgecolor'], 
                  label=name)
    for name, id in [
        ('Conservation Area', 'Conservation Area - General'),
        ('Heritage Item', 'Item - General'),
    ]
]
ax.legend(handles=[*zone_elements, *heritage_elements], loc='lower right', title="Legend")
ax.text(
    0.01, 0.01,  # x, y in figure coords (0–1)
    "© State Government of NSW and NSW Department of Planning, Housing and Infrastructure 2025",
    transform=ax.transAxes,
    fontsize=9,
    ha='left',
    va='bottom',
)
fig.suptitle("Inner West Council Land Use\n", fontsize=24) 
fig.tight_layout()
fig.savefig('images/iwc.png')

plt.show()
No description has been provided for this image