Data acquisition
To acquire elevation data for terrain mesh generation, we utilize cURL in conjunction with the provided API key to query the Mapbox Terrain-RGB v1 API. The URL structure used to request this data is as follows:
"https://api.mapbox.com/v4/mapbox.terrain-rgb/" + std::to_string(zoom) + "/" +
std::to_string(x) + "/" + std::to_string(y) + ".png?access_token=" + api_key;
Explanation of URL components:
-
Base URL:
"https://api.mapbox.com/v4/mapbox.terrain-rgb/"
This base URL specifies the Mapbox service and dataset (terrain-rgb
) used to retrieve elevation data. It forms the foundation of the request. -
Zoom level:
std::to_string(zoom)
The zoom level determines the detail of the map tile requested. Higher zoom levels provide more detailed data for smaller geographic areas. -
Tile coordinates:
std::to_string(x)
andstd::to_string(y)
These represent the x and y coordinates of the map tile, corresponding to the specified latitude and longitude. Together with the zoom level, they identify the exact tile to be retrieved. -
Image format:
".png"
The data is requested in PNG format, which is used by Mapbox to encode elevation data into RGB values. -
API key:
"access_token=" + api_key
The API key is appended to the URL to authenticate the request with the Mapbox API, enabling access to the required data.
Reading and decoding elevation data
Once the correct tile is downloaded, the elevation data is extracted from the
PNG image returned by the Mapbox Terrain-RGB v1 API. The following C++ code
demonstrates how to read the PNG data using the libpng
library:
std::vector<std::vector<std::tuple<int, int, int>>> readPNG(const std::vector<char> &data)
{
std::vector<std::vector<std::tuple<int, int, int>>> image;
png_image image_struct;
memset(&image_struct, 0, (sizeof image_struct));
image_struct.version = PNG_IMAGE_VERSION;
if (png_image_begin_read_from_memory(&image_struct, data.data(), data.size()))
{
png_bytep buffer;
image_struct.format = PNG_FORMAT_RGB;
buffer = (png_bytep)malloc(PNG_IMAGE_SIZE(image_struct));
if (buffer != NULL)
{
if (png_image_finish_read(&image_struct, NULL, buffer, 0, NULL))
{
for (unsigned y = 0; y < image_struct.height; ++y)
{
std::vector<std::tuple<int, int, int>> row;
for (unsigned x = 0; x < image_struct.width; ++x)
{
int r = buffer[3 * (y * image_struct.width + x) + 0];
int g = buffer[3 * (y * image_struct.width + x) + 1];
int b = buffer[3 * (y * image_struct.width + x) + 2];
row.emplace_back(r, g, b);
}
image.push_back(row);
}
}
free(buffer);
}
}
return image;
}
This function reads the PNG image from memory, parses the RGB values for each pixel, and stores them in a 2D vector of tuples. Each tuple corresponds to a pixel and contains the red, green, and blue color values.
Decoding elevation values
To convert these RGB values into actual elevation data, the decodeElevation
function is used:
double decodeElevation(int r, int g, int b)
{
return -10000 + (r * 256 * 256 + g * 256 + b) * 0.1;
}
The decodeElevation
function decodes the RGB values into a single elevation
value. Mapbox encodes elevation data in the RGB channels, where:
-
Red (r) represents the most significant part of the value.
-
Green (g) represents the middle part.
-
Blue (b) represents the least significant part.
The formula combines these three components into a single value and applies a scale factor of 0.1 to achieve the actual elevation in meters. The result is an accurate representation of the elevation for each pixel in the map tile.
By integrating these functions, the program can efficiently retrieve and decode elevation data from Mapbox, providing detailed topographical information for any specified location.
References
-
[cemosis] Cemosis. Center for Modeling and Simulation in Strasbourg. 2024. (www.cemosis.fr)
-
[irma] IRMA. Institut de recherche mathématique avancée. 2024 (irma.math.unistra.fr)
-
[unistra] University of Strasbourg. 2024. (en.unistra.fr)
-
[numpex] PEPR Numpex. Priority Research Program and Equipment for Numerical Exascale computing. 2024. (numpex.org/numpex-program)
-
[exama] Exa-MA. Methods and Algorithms for Exascale. 2024. (numpex.org/exama-methods-and-algorithms-for-exascale)
-
[ktirio] Ktirio Urban Building application. Prud’homme Christophe. Expanding horizons: Ktirio and the urban building vision in Hidalgo2. October 2023. 2024. (github.com/orgs/feelpp/discussions/2167)
-
[hidalgo2] CoE Hidalgo2. HPC and big data technologies for global challenges. 2024. (www.hidalgo2.eu/about)
-
[ubm] CoE Hidalgo2. The Urban Building Model 2024. (www.hidalgo2.eu/urban-building-model)
-
[inria] Inria. National Institute for Research in Digital Science and Technology. 2024. (www.inria.fr/en)
-
[eea1] European Environment Agency. Greenhouse gas emissions from energy use in buildings in Europe. Octber 2023. 2024. (www.eea.europa.eu/en/analysis/indicators/greenhouse-gas-emissions-from-energy?activeAccordion=546a7c35-9188-4d23-94ee-005d97c26f2b)
-
[eea2] European Environment Agency. Accelerating the energy efficiency renovation of residential buildings — a behavioural approach. June 2023. 2024. (www.eea.europa.eu/publications/accelerating-the-energy-efficiency)
-
[ec1] European Commission. 2050 long-term strategy. 2024. (climate.ec.europa.eu/eu-action/climate-strategies-targets/2050-long-term-strategy_en#:~:text=Striving%20to%20become%20the%20world’s%20first%20climate%2Dneutral%20continent%20by%202050.&text=The%20EU%20aims%20to%20be,to%20the%20European%20Climate%20Law%20.)
-
[ec2] European Commission. The European Green Deal. 2024. (commission.europa.eu/strategy-and-policy/priorities-2019-2024/european-green-deal_en)
-
[ec3] European Commission. European Climate Law. 2024. (climate.ec.europa.eu/eu-action/european-climate-law_en)
-
[ubp] Urban Building Pilot. Prud’homme Christophe. CoE Hidalgo2 Urban Building Pilot at NumPEx workshop on Discretization@Exascale. November 2023. 2024. (github.com/orgs/feelpp/discussions/2188)
-
[eurohpc] EuroHPC JU. The European High Performance Computing Joint Undertaking. 2024. (eurohpc-ju.europa.eu/index_en)
-
[mapbox] Wikipedia contributors. Mapbox. Wikipedia, The Free Encyclopedia. August 2024. 2024. (en.wikipedia.org/wiki/Mapbox)
-
[mapbox-terrain-rgb] Mapbox. Mapbox Terrain-RGB v1. Mapbox Documentation. 2024. (docs.mapbox.com/data/tilesets/reference/mapbox-terrain-rgb-v1)
-
[mapbox-raster-tiles] Mapbox. Mapbox Raster Tiles API. Mapbox Documentation. 2024. (docs.mapbox.com/api/maps/raster-tiles)
-
[json-nlohmann] Lohmann, Niels. JSON for Modern C++. 2024. (json.nlohmann.me)
-
[curl] Stenberg, Daniel. cURL: A Command Line Tool and Library for Transferring Data with URLs. 2024. (curl.se)
-
[libpng] libpng: The Official PNG Reference Library. 2024. (www.libpng.org/pub/png/libpng.html)
-
[cgal] CGAL: The Computational Geometry Algorithms Library. 2024. (www.cgal.org)
-
[stl] STL (STereoLithography) File Format Specification. 2024. (www.fabbers.com/tech/STL_Format)
-
[gmsh] Geuzaine Christophe, and Jean-François Remacle. Gmsh: A 3D Finite Element Mesh Generator with Built-in Pre- and Post-Processing Facilities. Version 4.10, 2024. (gmsh.info)
-
[msh] MSH: The Gmsh Mesh File Format. 2024. (gmsh.info/doc/texinfo/gmsh.html#MSH-file-format)
-
[img:lat-lon] Latitude and Longitude. BBC Bitesize. 2024. (www.bbc.co.uk/bitesize/guides/ztqtyrd/revision/1)
-
[world-geodetic-system] Wikipedia contributors. World Geodetic System. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/World_Geodetic_System)
-
[marcator-projection] Wikipedia contributors. Mercator projection. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Mercator_projection)
-
[web-marcator-projection] Wikipedia contributors. Web Mercator projection. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Web_Mercator_projection)
-
[cdt1] Wikipedia contributors. Constrained Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Constrained_Delaunay_triangulation)
-
[cdt2] L. Paul Chew. Constrained Delaunay Triangulations. Dartmouth College. 1987. 2024. (www.cs.jhu.edu/~misha/Spring16/Chew87.pdf)
-
[dt] Wikipedia contributors. Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Voronoi_diagram)
-
[voronoi] Wikipedia contributors. Voronoi diagram. Wikipedia, The Free Encyclopedia. 2024. ()
-
[tiled-web-map] Wikipedia contributors. Tiled web map. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Tiled_web_map)
-
[img:tiles-coordinates] XYZ Tiles coordinate numbers. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/File:XYZ_Tiles.png)
-
[img:tiled-web-map] Tiled Web Map. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Tiled_web_map#/media/File:Tiled_web_map_Stevage.png)
-
[img:dt] Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_circumcircles_vectorial.svg)
-
[img:dt-centers] Delaunay triangulation with all the circumcircles and their centers. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_circumcircles_centers.svg)
-
[img:dt-voronoi] Delaunay triangulation and its Voronoi diagram. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_Voronoi.svg)
-
[img:constrained-mesh] Pierre Alliez, Senior Researcher and Team Leader at Inria, Image provided during personal communication. 2024.
-
[img:constrained-refined-mesh] Pierre Alliez, Senior Researcher and Team Leader at Inria, Image provided during personal communication. 2024.