Maps Source & Processing - Lemoncode/simplechart GitHub Wiki
Maps Source & Processing
This application is built around Maps as its foundation. Map data has been obtained from official sources, processed, transformed and optimized to be consumed efficiently in a web environment. Let's explain below the processing flow followed to obtain the final result and its format.
Data Source
As a first approach, we will focus our scope to Spain, and thus we will need map data for Spain at 3 different levels:
- Regions.
- Provinces.
- Municipalities.
CNIG is the Spanish official source for Geographic Information. Maps are easily accessible and available for free and provide enough detail for our purposes. You can get them in 2 ways:
- Please go to CNIG Download Center and refer to the product called
Líneas Límite Municipales
. - Or, you can also donwload the sources from the repository simplechart-maps-source, folder
[CNIG] Spain - Original Source
.
Data Description
Source:That source contains either boundaries or regions for the 3 levels mentioned before:
- Folders that start with
recintos_
contain multipolygon SHP files representing areas of the regions. - Folders that start with
ll_
contain multiline SHP files representing boundaries of the regions.
Territories: Canary island and the iberian peninsula come in separated SHP files:
- Folder with the tag
canarias
refer to the Canary Islands SHP. - Folder with the tag
peninbal
refer to the Peninsula SHP.
SRS: Both, Canary and Peninsula, come in geographical coordinates (GCS/unprojected), but with different datum:
- Canary Island maps come in REGCAN95, a WGS84 compatible datum.
- Peninsula maps come in ETRS89.
Feature Attribute Table: Find below the attributes for each feature.
- INSPIREID: Temporary INSPIRE ID.
- COUNTRY: country ID (
ES
constant). - NATLEVEL: hierarchy level (URL).
- NATCODE: national code ID.
- NAMEUNIT: name of the feature (string UTF-8).
- CODNUT1: NUT1 Level this feature belongs to. NUT1 corresponds to large regions.
- CODNUT2: NUT2 Level this feature belongs to. NUT2 corresponds to Autonomous Communities.
- CODNUT3: NUT3 Level this feature belongs to. NUT3 corresponds to Provinces.
As we can see, the format of the data is SHP, splitted in 2 different files for Canary Islands and the Peninsula, features come with plenty of attributes that we won't use and add unnecessary extra weight. So, a processing is mandatory to optimize the maps to be consumed by our application use case.
Processing Workflow
A minimun knowledge of GIS concepts and tools is required to follow these steps. For any doubt, please contact us.
- Let's start from the original map data that we saw in the previous section as our baseline.
- Discard the SHPs that represents boundaries. We are only interested in areas (multipolygon SHP files).
- Now repeat these steps for the 3 levels available (regions, provinces and municipalities):
-
[QGIS] Merge both SHP layers (Canary and Peninsula) into a single vector file. You can use your favorite GIS edition tool, we will do it with QGIS. The simplest solution is to copy/paste the Canary Island features into the peninsula layer. This method will keep features attribute table intact. Remember to activate OTF-Reprojection so the features coordinates are transformed accordingly.
-
[QGIS] Select EPSG:4326 as your OTF target coordinate system. Let's reproject all the features into GCS WGS84 datum. This is a widely used and supported coordinate system.
-
[QGIS] Save this resulting layer, merged and reprojected, as SHP format. This will be our SHP of reference. Name suggested:
Spain-[01/02/03]-[Regions/Provinces/Municipalities]-EPSG-4326.shp
. -
[QGIS] Now, Remove unnecessary attributes, this will be specially useful in municipalities for a considerable space saving. For instance, we can unambiguously identify a feature with its NATCODE, although CODNUT is also desirable as it is a more friendly ID. CODENUT1, however, won't be useful for us. So we can let only NATCODE, CODENUT2, CODENUT3 and NAMEUNIT as our feature attributes.
-
[QGIS] Save it in GeoJSON format. This will be our GeoJSON of reference. Name suggested:
Spain-[01/02/03]-[Regions/Provinces/Municipalities]-EPSG-4326.geojson
. -
Let's transform the format from GeoJSON to TopoJSON. Install globally the
topojson
library with npm like this:npm install -g topojson
-
[geo2topo] Run the transformation with the following command, using the proper index and name for each case:
geo2topo regions=Spain-01-Regions-EPSG-4326.geojson > Spain-01-Regions-EPSG-4326.topojson
geo2topo provinces=Spain-02-Provinces-EPSG-4326.geojson > Spain-02-Provinces-EPSG-4326.topojson
geo2topo municipalities=Spain-03-Municipalities-EPSG-4326.geojson > Spain-03-Municipalities-EPSG-4326.topojson
-
[toposimplify] Now that we have created our maps in TopoJSON format, let's do an important optimization by simplifying the polygon shapes (reducing the number of points that conform them by a given threshold). For our application, where the maps are gonna be viewed as a whole, precision in the rendering is not that important. This optimization will bring huge space saving and will allow faster load times.
toposimplify -f -p 0.0001 Spain-01-Regions-EPSG-4326.topojson > Spain-01-Regions-EPSG-4326.MIN.topojson
toposimplify -f -p 0.0001 Spain-02-Provinces-EPSG-4326.topojson > Spain-02-Provinces-EPSG-4326.MIN.topojson
toposimplify -f -p 0.0001 Spain-03-Municipalities-EPSG-4326.topojson > Spain-03-Municipalities-EPSG-4326.MIN.topojson
-
You can find all these files already processed in the repository the repository simplechart-maps-source.
Glossary
- QGIS: Free, Open Source and cross platform GIS desktop application to create, edit, visualize, analize and publish geospatial information.
- SRS: Spatial Reference System.
- GCS vs PCS: Geographical Coordinate System (unprojected) vs Projected Coordinate System.
- SHP: ESRI Shapefile. Vector format widely used in GIS.
- OTF-Reprojection: On The Fly Reprojection.
- GeoJSON: a format for enconding vector data structures (geometries of different types) in JSON notation.
- TopoJSON: an extension to GeoJSON that encodes topology rather than discrete geometries. Geometries may share a part with any other geometry but these parts are not duplicated and, therefore, redundancy is removed.