Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2028cbbe61 | ||
|
|
e1a1ff4af3 | ||
|
|
f60b1802d5 | ||
|
|
0a7af5c65b |
No files matched your search
Vendored
+1
-1
@@ -16,7 +16,7 @@
|
|||||||
\****************/
|
\****************/
|
||||||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||||
|
|
||||||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var polylabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! polylabel */ \"./node_modules/polylabel/polylabel.js\");\n\r\n\r\nfunction normaliseCouncilName(str) {\r\n const regex = /(.*?)(?:(?: Rural)?(?: City| Shire) Council)/g;\r\n const matches = str.matchAll(regex);\r\n\r\n // If we get a match, convert to slug format\r\n for (const match of matches) {\r\n return match[1].toLowerCase().replace(\" \", \"-\");\r\n }\r\n\r\n // If we didn't find any matches, try convert input to slug format\r\n return str.toLowerCase().replace(\" \", \"-\");\r\n};\r\n\r\nconst searchParams = new URLSearchParams(window.location.search);\r\nconst councilName = normaliseCouncilName(searchParams.get(\"council\"));\r\nconsole.log(councilName);\r\n\r\nmapboxgl.accessToken = 'pk.eyJ1IjoibWF0dHl3YXkiLCJhIjoiY2x6eG9vMzZyMHY2cDJqb3M1ODZnNjF4cyJ9.IX8CfYQZUaQhSjWgMXmsEA';\r\nconst map = new mapboxgl.Map({\r\n container: 'map',\r\n zoom: 10,\r\n center: [145.00724,-37.79011]\r\n});\r\n\r\nmap.addControl(new mapboxgl.NavigationControl());\r\n\r\nfetch(\"wards_withboundaries.json\")\r\n .then(response => {\r\n response.json()\r\n .then((wardData) => {\r\n const filteredWardData = wardData.filter((ward) => normaliseCouncilName(ward.parentElectorateName) == councilName);\r\n\r\n filteredWardData.forEach(wardData => {\r\n const featureCollection = {\r\n 'type': 'FeatureCollection',\r\n 'features': [\r\n {\r\n 'type': 'Feature',\r\n 'geometry': JSON.parse(wardData.boundaryJson)\r\n }\r\n ]\r\n };\r\n\r\n // Add data\r\n map.addSource(\"data_\"+wardData.electorateId, {\r\n 'type': 'geojson',\r\n 'data': featureCollection\r\n });\r\n\r\n // Add a line along the data\r\n map.addLayer({\r\n 'id': \"outline_\"+wardData.electorateId,\r\n 'type': 'line',\r\n 'source': \"data_\"+wardData.electorateId,\r\n 'layout': {},\r\n 'paint': {\r\n 'line-color': '#0899fe',\r\n 'line-width': 3\r\n }\r\n });\r\n\r\n const centrePoint = (0,polylabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(featureCollection.features[0].geometry.coordinates, 0.000001);\r\n\r\n map.addSource('center_'+wardData.electorateId, {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'FeatureCollection',\r\n 'features': [\r\n {\r\n 'type': 'Feature',\r\n 'properties': {\r\n 'description': wardData.electorateName\r\n },\r\n 'geometry': {\r\n 'type': 'Point',\r\n 'coordinates': centrePoint\r\n }\r\n }\r\n ]\r\n }\r\n });\r\n\r\n map.addLayer({\r\n 'id': 'label_'+wardData.electorateId,\r\n 'type': 'symbol',\r\n 'source': 'center_'+wardData.electorateId,\r\n 'layout': {\r\n 'text-field': ['get', 'description'],\r\n 'text-variable-anchor': ['center', 'top', 'bottom'],\r\n 'text-justify': 'auto',\r\n 'text-allow-overlap': true\r\n }\r\n });\r\n\r\n });\r\n\r\n }).catch(err => {\r\n console.log(err);\r\n });\r\n })\r\n \r\n\r\n\r\nmap.on('style.load', () => {\r\n map.setConfigProperty('basemap', 'showPlaceLabels', false);\r\n map.setConfigProperty('basemap', 'showPointOfInterestLabels', false);\r\n map.setConfigProperty('basemap', 'showRoadLabels', false);\r\n map.setConfigProperty('basemap', 'showTransitLabels', false);\r\n map.setConfigProperty('basemap', 'show3dObjects', false);\r\n});\n\n//# sourceURL=webpack:///./src.js?");
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var polylabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! polylabel */ \"./node_modules/polylabel/polylabel.js\");\n\r\n\r\nfunction normaliseCouncilName(str) {\r\n const regex = /(.*?)(?:(?: Rural)?(?: City| Shire) Council)/g;\r\n const matches = str.matchAll(regex);\r\n\r\n // If we get a match, convert to slug format\r\n for (const match of matches) {\r\n return match[1].toLowerCase().replace(\" \", \"-\");\r\n }\r\n\r\n // If we didn't find any matches, try convert input to slug format\r\n return str.toLowerCase().replace(\" \", \"-\");\r\n};\r\n\r\nconst searchParams = new URLSearchParams(window.location.search);\r\nconst councilName = normaliseCouncilName(searchParams.get(\"council\"));\r\nconsole.log(councilName);\r\n\r\nmapboxgl.accessToken = 'pk.eyJ1IjoibWF0dHl3YXkiLCJhIjoiY2x6eG9vMzZyMHY2cDJqb3M1ODZnNjF4cyJ9.IX8CfYQZUaQhSjWgMXmsEA';\r\nconst map = new mapboxgl.Map({\r\n container: 'map',\r\n zoom: 10,\r\n style: 'mapbox://styles/mattyway/clzy2ozzf004k01pn840h9xdb',\r\n center: [145.00724,-37.79011]\r\n});\r\n\r\nmap.addControl(new mapboxgl.NavigationControl());\r\n\r\nfetch(\"wards_withboundaries.json\")\r\n .then(response => {\r\n response.json()\r\n .then((wardData) => {\r\n const filteredWardData = wardData.filter((ward) => normaliseCouncilName(ward.parentElectorateName) == councilName);\r\n\r\n var bounds = {\r\n \"west\": undefined,\r\n \"south\": undefined,\r\n \"east\": undefined,\r\n \"north\": undefined\r\n }\r\n\r\n var labelFeatures = [];\r\n\r\n filteredWardData.forEach(wardData => {\r\n const featureCollection = {\r\n 'type': 'FeatureCollection',\r\n 'features': [\r\n {\r\n 'type': 'Feature',\r\n 'geometry': JSON.parse(wardData.boundaryJson)\r\n }\r\n ]\r\n };\r\n\r\n featureCollection.features[0].geometry.coordinates[0].forEach(coordinate => {\r\n if (bounds.west == undefined || coordinate[0] < bounds.west) {\r\n bounds.west = coordinate[0];\r\n }\r\n\r\n if (bounds.south == undefined || coordinate[1] < bounds.south) {\r\n bounds.south = coordinate[1];\r\n }\r\n\r\n if (bounds.east == undefined || coordinate[0] > bounds.east) {\r\n bounds.east = coordinate[0];\r\n }\r\n\r\n if (bounds.north == undefined || coordinate[1] > bounds.north) {\r\n bounds.north = coordinate[1];\r\n }\r\n });\r\n\r\n // Add data\r\n map.addSource(\"data_\"+wardData.electorateId, {\r\n 'type': 'geojson',\r\n 'data': featureCollection\r\n });\r\n\r\n // Add a line along the data\r\n map.addLayer({\r\n 'id': \"outline_\"+wardData.electorateId,\r\n 'type': 'line',\r\n 'source': \"data_\"+wardData.electorateId,\r\n 'layout': {},\r\n 'paint': {\r\n 'line-color': '#0899fe',\r\n 'line-width': 3\r\n }\r\n });\r\n\r\n const centrePoint = (0,polylabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(featureCollection.features[0].geometry.coordinates, 0.000001);\r\n\r\n if (wardData.electorateName.includes(' ')) {\r\n // Breaking long names into newlines looks better\r\n const parts = wardData.electorateName.split(' ');\r\n // Special case if a ward starts with \"St\" (like \"St Albans East\")\r\n // Join the first two parts\r\n if (parts[0] == \"St\") {\r\n parts[0] = parts[0] + ' ' + parts[1];\r\n parts.splice(1, 1);\r\n }\r\n const wardNameNewLines = parts.join('\\n');\r\n labelFeatures.push({\r\n 'type': 'Feature',\r\n 'properties': {\r\n 'description': wardNameNewLines\r\n },\r\n 'geometry': {\r\n 'type':
Line truncated
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
# Map Generator
|
# Map Generator
|
||||||
|
|
||||||
This project is displays a map showing the boundaries of wards within a single local government area. Each ward is labelled.
|
This project displays a map showing the boundaries of wards within a single local government area. Each ward is labelled.
|
||||||
|
|
||||||
The data for this comes from the VEC Map API: https://maps.vec.vic.gov.au/api/electorates/4/withboundaries
|
The data for this comes from the VEC Map API: https://maps.vec.vic.gov.au/api/electorates/4/withboundaries
|
||||||
|
|
||||||
To compile the `src.js` file after every edit, run `webpack-cli --mode development --watch` in this folder.
|
To allow the page to download the `wards_withboundaries.json` file, the page needs to be accessed via a `http://` URL (and not a `file:///` URL). One easy way to do this is with the web server built into Python, it can be started by running `python3 -m http.server` in this folder.
|
||||||
|
|
||||||
|
To tell the page which council to load, add a query parameter to the URL eg. `?council=brimbank` or `?council=Melbourne%20City%20Council`
|
||||||
|
|
||||||
|
To automatically compile the `src.js` file after every edit, run `webpack-cli --mode development --watch` in this folder.
|
||||||
|
|
||||||
Changes to `dist/main.js` should be committed so that other users don't need to install node.
|
Changes to `dist/main.js` should be committed so that other users don't need to install node.
|
||||||
+71
-20
@@ -21,6 +21,7 @@ mapboxgl.accessToken = 'pk.eyJ1IjoibWF0dHl3YXkiLCJhIjoiY2x6eG9vMzZyMHY2cDJqb3M1O
|
|||||||
const map = new mapboxgl.Map({
|
const map = new mapboxgl.Map({
|
||||||
container: 'map',
|
container: 'map',
|
||||||
zoom: 10,
|
zoom: 10,
|
||||||
|
style: 'mapbox://styles/mattyway/clzy2ozzf004k01pn840h9xdb',
|
||||||
center: [145.00724,-37.79011]
|
center: [145.00724,-37.79011]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -32,6 +33,15 @@ fetch("wards_withboundaries.json")
|
|||||||
.then((wardData) => {
|
.then((wardData) => {
|
||||||
const filteredWardData = wardData.filter((ward) => normaliseCouncilName(ward.parentElectorateName) == councilName);
|
const filteredWardData = wardData.filter((ward) => normaliseCouncilName(ward.parentElectorateName) == councilName);
|
||||||
|
|
||||||
|
var bounds = {
|
||||||
|
"west": undefined,
|
||||||
|
"south": undefined,
|
||||||
|
"east": undefined,
|
||||||
|
"north": undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
var labelFeatures = [];
|
||||||
|
|
||||||
filteredWardData.forEach(wardData => {
|
filteredWardData.forEach(wardData => {
|
||||||
const featureCollection = {
|
const featureCollection = {
|
||||||
'type': 'FeatureCollection',
|
'type': 'FeatureCollection',
|
||||||
@@ -43,6 +53,24 @@ fetch("wards_withboundaries.json")
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
featureCollection.features[0].geometry.coordinates[0].forEach(coordinate => {
|
||||||
|
if (bounds.west == undefined || coordinate[0] < bounds.west) {
|
||||||
|
bounds.west = coordinate[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bounds.south == undefined || coordinate[1] < bounds.south) {
|
||||||
|
bounds.south = coordinate[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bounds.east == undefined || coordinate[0] > bounds.east) {
|
||||||
|
bounds.east = coordinate[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bounds.north == undefined || coordinate[1] > bounds.north) {
|
||||||
|
bounds.north = coordinate[1];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Add data
|
// Add data
|
||||||
map.addSource("data_"+wardData.electorateId, {
|
map.addSource("data_"+wardData.electorateId, {
|
||||||
'type': 'geojson',
|
'type': 'geojson',
|
||||||
@@ -63,12 +91,28 @@ fetch("wards_withboundaries.json")
|
|||||||
|
|
||||||
const centrePoint = polylabel(featureCollection.features[0].geometry.coordinates, 0.000001);
|
const centrePoint = polylabel(featureCollection.features[0].geometry.coordinates, 0.000001);
|
||||||
|
|
||||||
map.addSource('center_'+wardData.electorateId, {
|
if (wardData.electorateName.includes(' ')) {
|
||||||
'type': 'geojson',
|
// Breaking long names into newlines looks better
|
||||||
'data': {
|
const parts = wardData.electorateName.split(' ');
|
||||||
'type': 'FeatureCollection',
|
// Special case if a ward starts with "St" (like "St Albans East")
|
||||||
'features': [
|
// Join the first two parts
|
||||||
{
|
if (parts[0] == "St") {
|
||||||
|
parts[0] = parts[0] + ' ' + parts[1];
|
||||||
|
parts.splice(1, 1);
|
||||||
|
}
|
||||||
|
const wardNameNewLines = parts.join('\n');
|
||||||
|
labelFeatures.push({
|
||||||
|
'type': 'Feature',
|
||||||
|
'properties': {
|
||||||
|
'description': wardNameNewLines
|
||||||
|
},
|
||||||
|
'geometry': {
|
||||||
|
'type': 'Point',
|
||||||
|
'coordinates': centrePoint
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
labelFeatures.push({
|
||||||
'type': 'Feature',
|
'type': 'Feature',
|
||||||
'properties': {
|
'properties': {
|
||||||
'description': wardData.electorateName
|
'description': wardData.electorateName
|
||||||
@@ -77,36 +121,43 @@ fetch("wards_withboundaries.json")
|
|||||||
'type': 'Point',
|
'type': 'Point',
|
||||||
'coordinates': centrePoint
|
'coordinates': centrePoint
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
]
|
});
|
||||||
|
|
||||||
|
map.addSource('labels', {
|
||||||
|
'type': 'geojson',
|
||||||
|
'data': {
|
||||||
|
'type': 'FeatureCollection',
|
||||||
|
'features': labelFeatures
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
map.addLayer({
|
map.addLayer({
|
||||||
'id': 'label_'+wardData.electorateId,
|
'id': 'labels',
|
||||||
'type': 'symbol',
|
'type': 'symbol',
|
||||||
'source': 'center_'+wardData.electorateId,
|
'source': 'labels',
|
||||||
'layout': {
|
'layout': {
|
||||||
'text-field': ['get', 'description'],
|
'text-field': ['get', 'description'],
|
||||||
'text-variable-anchor': ['center', 'top', 'bottom'],
|
'text-variable-anchor': ['center', 'top', 'bottom'],
|
||||||
|
'text-radial-offset': 0.5,
|
||||||
|
'text-padding': 0,
|
||||||
'text-justify': 'auto',
|
'text-justify': 'auto',
|
||||||
'text-allow-overlap': true
|
'text-allow-overlap': false,
|
||||||
|
'text-ignore-placement': false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
map.fitBounds([
|
||||||
|
[bounds.west, bounds.south],
|
||||||
|
[bounds.east, bounds.north]
|
||||||
|
], {
|
||||||
|
padding: 25,
|
||||||
|
animate: false
|
||||||
});
|
});
|
||||||
|
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
map.on('style.load', () => {
|
|
||||||
map.setConfigProperty('basemap', 'showPlaceLabels', false);
|
|
||||||
map.setConfigProperty('basemap', 'showPointOfInterestLabels', false);
|
|
||||||
map.setConfigProperty('basemap', 'showRoadLabels', false);
|
|
||||||
map.setConfigProperty('basemap', 'showTransitLabels', false);
|
|
||||||
map.setConfigProperty('basemap', 'show3dObjects', false);
|
|
||||||
});
|
|
||||||
Reference in new issue
Block a user