Background
In 2023, New Brunswick (Canada) underwent a province-wide restructuring of their municipal boundaries. This consisted of 77 Incorporated Municipalities and 12 Unincorporated Rural Districts. Between 2023 and 2025, only a small handful of these boundaries were actually imported into OSM. Thus, I took it upon myself to begin what was my largest project ever, a full import of the updated boundaries across the province.
I saw it fit to write up a post summarizing the work that was done, along with some of the rationales for certain tagging methods used in this project, in order to maintain consistency both now and into the future. It should be noted that this was not an automated import, every kilometer of boundary was manually reviewed. The data used was from GeoNB, under the Open Government License – New Brunswick.
Pre-Import Phase/Admin Level Restructuring
When I started this project, New Brunswick’s existing boundary data was a complete mess, some larger cities had admin_level=6 boundaries, while other incorporated municipalities were tagged admin_level=8, and parishes were sharing admin_level=6, leading to overlaps. For instance, Saint-François Parish and Haut-Madawaska were both tagged admin_level=6, despite them occupying the same geographical area.
To fix this problem, I decided to shift all Parish boundaries to admin_level=8, and assign admin_level=6 to all municipal boundaries. The new admin level hierarchy is logical because Parishes are not incorporated government entities and have no modern-day purpose. Furthermore, it more closely resembles data in other provinces in Canada (such as Alberta, Quebec, and Nova Scotia), which prioritize admin_level=6 for municipal districts. Both the New Brunswick wiki as well as the Canada admin level wiki pages were updated to reflect these changes.
Below are some examples of the admin_level tagging schema before and after my updates:
Example 1 [Before]:
- admin_level=4 = New Brunswick
- admin_level=5 = Madawaska County
- admin_level=6 = Saint-François Parish
- admin_level=6 = Haut-Madawaska (Municipality)
Example 1 [After]:
- admin_level=4 = New Brunswick
- admin_level=5 = Madawaska County
- admin_level=6 = Haut-Madawaska (Municipality)
- admin_level=8 = Saint-François Parish
Example 2 [Before]:
- admin_level=4 = New Brunswick
- admin_level=5 = Queens County
- admin_level=6 = Gagetown Parish
- admin_level=8 = Village of Gagetown (Municipality)
Example 2 [After]:
- admin_level=4 = New Brunswick
- admin_level=5 = Queens County
- admin_level=6 = Village of Arcadia (Municipality)
- admin_level=8 = Gagetown Parish
Import Workflow
The import process consisted of importing the shapefile data directly from GeoNB, One municipality at a time, and downloading all data within a few metres of the new boundary. This revealed any pre-existing boundaries (County, Parish, and Village boundaries). Any areas where the new municipal boundary was directly overlapped with existing boundaries, it was split and joined to them. As such, boundary members may be part of county, parish, and municipal boundary relations (or any combination of those) simultaneously. After each new Municipality was imported, I removed any old village boundaries & relations which no longer have legal bearing.
While importing the data, I also fixed many instances of pre-existing data quality issues, particularly with overlapping parish boundaries. In some cases, I noted up to 3 different boundaries all overlapping together. After meticulous work across the province, virtually all of these issues have been resolved.
Keeping Boundary Members Neutral
Another issue that came up during my work was the tagging of individual boundary members (the actual ways that are members of the boundary relations). Most of the time, these labels only referred to one side of the region they were splitting. For example, boundary members surrounding Sackville Parish were all labelled “Sackville Parish”, despite the adjacent parishes (eg. Dorchester Parish) sharing the same member.
Mapping best practice would be to label them as “Sackville Parish – Dorchester Parish” to indicate that the boundary seperates two different regions, however in many cases these boundary members were simultaneously part of County and Municipal level boundaries, making this tagging overly complex.
As a result, I decided that it would be easiest to simply leave the boundary members untagged altogether, as their membership within the boundary relations already provides all relevant data. The only exception I made was to First Nation Reserves. Furthermore, leaving these boundary members untagged makes future modifications far easier, as the only things that need to be changed are the boundary relations themselves.
Admin Levels on Coastal Islands
Something peculiar I discovered during my work was certain coastal islands having been tagged with admin_level=6, admin_level=8, and admin_level=9. It’s unclear to me why exactly these boundaries were added to begin with, because these random islands have no administrative structure that would lend itself to requiring an admin level. In my opinion, this is superfluous data that should be removed, however for the short-term, I changed all of them to admin_level=9 to maintain consistency, and avoid overlaps with other administrative regions.
Machias Seal Island
Machias Seal Island is disputed territory with the United States. The government of New Brunswick acknowledges this island as being within Grand Manan Parish, Southwest Rural District, Charlotte County. I did add these administrative regions to the Island as per the GeoNB dataset, however I’m not 100% sure if this is mapping best practice with respect to disputed territory on OSM. To me, It would be equally appropriate to include the county and municipality level information from the United States side, but that decision would have to be made by someone other than myself.
Rural Districts
It should be noted that while New Brunswick’s 12 Rural Districts aren’t technically incorporated Municipalities, they occupy the same geographical/administrative tier, and therefore have also been assigned admin_level=6. This could potentially be changed if somebody thought differently, however my rationale on this was based on Alberta’s admin level structure which tags everything admin_level=6 even for those regions which are technically unincorporated (eg. Special Areas, Improvement Districts).
National Parks & Protected Natural Areas
Generally speaking, I left most of these boundaries separated from the municipal boundaries in order to avoid needlessly complicating things.
Federal Constituency Boundaries
Federal Constituency Boundaries were joined to Municipal level boundary members wherever I came across them, however I did not do a detailed review of these province-wide, and some adjustments may still be required.
Bilingual & Wikidata Tags
As part of this project, all Counties, Municipalities, Parishes, and First Nations Reserves were brought into compliance with the bilingual tagging schema (name:en, name:fr, and name= corresponding to the language most used in that particular region). Additionally, Wikidata tags were added to all 152 parishes, and website links added to all municipalities.
Conclusion
Closing the chapter on this 3 month long project is bittersweet, Despite being very tedious at times, it was a great opportunity to improve my mapping skills and get to know New Brunswick in great detail from the top down. If you would like to view the boundaries on Overpass Turbo, you can use the following queries:
To view all Municipalities & Rural Districts:
[out:json][timeout:25];// gather results
nwr["type"="boundary"]["admin_level"="6"]["name:en"]["name:fr"]({{bbox}});
// print results
out geom;
To view all Parishes:
[out:json][timeout:25];// gather results
nwr["type"="boundary"]["admin_level"="8"]["name:en"]["name:fr"]({{bbox}});
// print results
out geom;
Do not hesitate to contact me with questions, comments, or concerns. Cheers :)