Schema reference
Two layers, both delivered as GeoPackage and CSV. Geometry is WGS84, EPSG:4326; in CSV it appears as latitude and longitude columns.
Address points
Identity
| Column | Type | Null | Description |
|---|---|---|---|
address_id | text | no | Persistent identifier. Survives a street rename or a re-survey, so joins hold between releases. |
Address components
| Column | Type | Null | Description |
|---|---|---|---|
civic_number | integer | yes | Primary number. Null on named-only and rural addresses. |
civic_suffix | text | yes | Letter or fraction, e.g. A, 1/2. |
unit | text | yes | Unit, suite or apartment designator where the source supplied one. |
street_name | text | yes | Standardised name, without type or direction. |
street_type | text | yes | Standardised type, e.g. AVE, CRES. |
street_direction | text | yes | Standardised direction, e.g. NW. |
full_address | text | no | Assembled single-line form, for display only. |
source_address | text | yes | The original string as received, kept for audit. |
Location
| Column | Type | Null | Description |
|---|---|---|---|
geom | geometry(Point, 4326) | no | GeoPackage only. |
latitude | numeric | no | WGS84 decimal degrees. |
longitude | numeric | no | WGS84 decimal degrees. |
position_class | text | no | A under 5 m, B 5 to 25 m, C over 25 m. |
Administrative
| Column | Type | Null | Description |
|---|---|---|---|
province | text | no | Two-letter code. |
cd_uid | text | yes | Census division identifier. |
csd_uid | text | yes | Census subdivision identifier. |
csd_name | text | yes | Census subdivision name. |
postal_code | text | yes | Six characters, no space. |
All administrative attribution is spatial. Nothing is matched by name.
Provenance
| Column | Type | Null | Description |
|---|---|---|---|
source_id | text | no | Which source contributed the record. |
release | text | no | Release it belongs to, e.g. 2026Q3. |
change_flag | text | yes | added, moved, retired, attribute_change. |
Postal code points
| Column | Type | Null | Description |
|---|---|---|---|
postal_code | text | no | Six characters, no space. The key. |
geom | geometry(Point, 4326) | no | Calculated position for the member addresses. |
latitude | numeric | no | WGS84 decimal degrees. |
longitude | numeric | no | WGS84 decimal degrees. |
address_count | integer | no | Addresses carrying this code in this release. |
spread_m | numeric | yes | Distance from the point to the furthest member address, in metres. |
number_unique | boolean | no | True when every civic number under this code appears exactly once. |
province | text | no | Two-letter code. |
csd_uid | text | yes | Census subdivision of the point. |
release | text | no | Release it belongs to. |
number_unique is what makes two-field matching safe
Where it is true, civic number plus postal code identifies an address without a street name, so the whole class of Ave versus Avenue matching failures does not arise. Where it is false — typically a rural code covering several roads — the same two fields can return more than one address and you need the street.
Check the flag rather than inferring it from the code format. See geocoding with postal codes.
Use address_count and spread_m together
They are how you tell a usable point from a misleading one.
A code with 60 addresses and a spread of 200 m is a city block, and the point means something. A code with 4 addresses and a spread of 14 km is a rural route, and the point is the middle of nowhere in particular. Both are in the file; only one should go on a map without comment.
Notes on nulls
A null civic_number is meaningful, not missing — rural and named addresses exist. Filtering on civic_number IS NOT NULL quietly drops them.
A null postal_code on an address means no code could be attributed, not that the address has none. Those addresses contribute to no postal point.