参考:https://baremaps.apache.org/documentation/
一、基础环境
1、安装 JDK
版本需要至少 Java 17
下载:https://www.oracle.com/cn/java/technologies/downloads/
tar -zxf jdk-17_linux-x64_bin.tar.gz -C /usr/local
cd /usr/local
mv jdk-17.0.11 jdk
vi /etc/profile
# 文件末尾添加
JAVA_HOME=/usr/local/jdk
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
2、安装 PostGIS
为了插入和生成矢量图块,需要设置 PostGIS 数据库。该数据库将托管生成矢量图块所需的所有数据。
# docker镜像安装 PostGIS
docker run \
--name baremaps \
--publish 5432:5432 \
-e POSTGRES_DB=baremaps \
-e POSTGRES_USER=baremaps \
-e POSTGRES_PASSWORD=baremaps \
-d postgis/postgis:latest
3、安装 Maven
版本至少 3.xx
下载:https://maven.apache.org/download.cgi
cd /usr/local/
tar -zxvf apache-maven-3.9.6-bin.tar.gz
mv apache-maven-3.9.6 maven
vim /etc/profile
# 末尾新增
export PATH=$PATH:/usr/local/maven/bin
4、安装 gradle
下载:https://gradle.org/releases/
或者:https://services.gradle.org/distributions/
cd /usr/local/
unzip gradle-8.7-all.zip
vim /etc/profile
# 末尾新增
export PATH=$PATH:/usr/local/gradle/bin
source /etc/profile
gradle -v
二、使用 Maven 构建 Baremaps
下载:https://baremaps.apache.org/documentation/examples/
# 更新 hosts
vi /etc/hosts
# 新增
140.82.113.3 github.com
# 下载
git clone https://github.com/apache/incubator-baremaps.git
#构建
mv incubator-baremaps baremaps
cd baremaps/
./mvnw clean package -DskipTests
上面输出红圈中指出了baremaps-cli
二进制文件所在的位置。参考二进制baremaps-cli
文件的位置,你可以运行以下命令来解压 Baremaps 并将其放入你的PATH
。
tar -xvf ./baremaps-cli/target/apache-baremaps-<version>-SNAPSHOT-incubating-bin.tar.gz -C target/
export PATH=$PATH:`pwd`/target/apache-baremaps-<version>-SNAPSHOT-incubating-bin/bin
三、将 OSM 数据导入 PostGIS
cd examples/openstreetmap
# 下载并导入示例 OSM 数据到 Postgres 中。
baremaps workflow execute --file workflow.json
https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/openstreetmap/workflow.json
四、预览和编辑带有示例配置文件的地图
参考:https://baremaps.apache.org/documentation/examples/serve-and-export-vector-tiles/
# 在命令后加 & 可以后台运行
baremaps map dev \
--tileset 'tileset.json' \
--style 'style.json'
本地开发服务器应该已经启动了。现在可以在浏览器中可视化矢量图片:http://localhost:9000
五、生成等值线
等高线是地形图中的关键元素,因为它们使我们能够直观地看到某个区域的海拔。在本教程中,将展示如何从数字高程模型 (DEM) 创建等高线并使用矢量图块显示它们。
5.1、安装 gdal
sudo apt-get install gdal-bin
5.2、下载 DEM 数据
下载:https://search.earthdata.nasa.gov/search/granules?p=C1711961296-LPCLOUD&pg[0][v]=f&pg[0][gsk]=-start_date&q=aster%20v3&tl=1691157297!3!!
登录账户:liuxin666/Liu773528514.0
示例文件:ASTGTMV003_N03E008_dem.tif
5.3、重新投影 GeoTiff
本教程中提供的 geotiff
文件已采用所需的投影 (WebMercator),但如果您想使用不同的 geotiff 文件,可以使用 gdalwarp 命令重新投影它。以下是如何执行此操作的示例:
gdalwarp -rc \
-s_srs epsg:4326 -t_srs epsg:3857 \
-dstnodata 0 -of GTiff -co tiled=yes \
ASTGTMV003_N03E008_dem.tif \
ASTGTMV003_N03E008_dem-3857.tif
参数解释:
-rc
: 表示使用逐行分块(row-by-row)处理。-s_srs epsg:4326
: 指定输入文件的投影为 EPSG 4326。-t_srs epsg:3857
: 指定输出文件的投影为 EPSG 3857(WebMercator)。-dstnodata 0
: 指定输出文件中的无数据值为 0。-of GTiff
: 指定输出文件格式为 GeoTiff。-co tiled=yes
: 将输出 GeoTiff 文件设置为分块存储以提高效率。ASTGTMV003_N03E008_dem.tif
: 是输入 GeoTiff 文件的名称。ASTGTMV003_N03E008_dem_3857.tif
: 是输出重新投影后的 GeoTiff 文件的名称。
5.4、生成等值线
现在我们在所需的投影中有了 GeoTiff
,我们可以使用 gdal_contour
命令来生成等高线。参数-a
指定包含高程数据的列,-i
参数指定应生成等值线的间隔(在本例中,我们使用 10 米),参数-nln
命名将包含数据的表。
在名为 ASTGTMV003_N03E008_dem_3857.tif 的 GeoTiff 文件上生成等值线,等值线间隔为 10 米,并将结果存储到 PostgreSQL 数据库中:(数据库user和password注意不要错)
gdal_contour \
-a elevation -nln aster_dem -i 10 \
-f PostgreSQL \
ASTGTMV003_N03E008_dem-3857.tif "PG:host=localhost user=baremaps password=baremaps dbname=baremaps"
参数解释:
-a elevation
:指定包含高程数据的列名。-nln aster_dem
:指定表的名称,这里命名为 aster_dem。-i 10
:指定等值线的间隔为 10 米。-f PostgreSQL
:指定输出格式为 PostgreSQL。reprojected_dem_utm33n.tif
:输入的 GeoTiff 文件名。"PG:host=localhost user=baremaps password=baremaps dbname=baremaps"
:PostgreSQL 数据库连接信息,包括主机、用户名、密码和数据库名。
5.5、使用索引提高性能
为了提高等高线的性能,可以在数据库中添加一些索引。以下是如何创建索引的示例SPGIST
:
docker exec -it [containerID or NAMES] psql -U baremaps -d baremaps
DROP INDEX IF EXISTS aster_dem_gix;
CREATE INDEX IF NOT EXISTS aster_dem_gix ON aster_dem USING SPGIST(wkb_geometry);
5.6、显示等高线
最后,我们可以使用 Baremaps 在 Web 浏览器中显示等高线。为此,请运行以下命令:
# 本命令用于执行一个名为 "dev" 的地图操作,并指定了一个瓦片集(tileset)文件和一个样式(style)文件
baremaps map dev \
--tileset 'tileset.json' \
--style 'style.json'
baremaps map dev --log-level DEBUG --tileset 'tileset.json' --style 'style.json'
# "tileset.json":瓦片集文件,该文件可能包含有关瓦片的配置信息,如瓦片的范围、缩放级别、瓦片格式等。
# "style.json":样式文件,该文件可能包含关于地图样式的信息,如图层样式、颜色、标签等。
这将启动图块服务器并在您进行更改时自动重新加载配置文件。然后您可以在 Web 浏览器中预览地图。
问题:执行命令后无法展示等值线。
原因:baremaps执行命令的时候,指定的瓦片集是OSM数据的瓦片集,不是生成等值线的瓦片集。从Github中查找生成等值线的瓦片集,下载之后替换添加到该目录下。如果遇到字段不存在问题根据输出信息修改SQL语句。
5.7、平滑轮廓线(可选)
如果要改善轮廓线的渲染,可以使用平滑函数,例如 ST_ChaikinSmoothing。此函数以几何图形作为输入,并返回该几何图形的平滑版本。以下是如何使用它的一个示例:
UPDATE aster_dem
SET wkb_geometry = ST_ChaikinSmoothing(wkb_geometry, 0.1)
请记住,此步骤是可选的,根据输入数据的质量,可能不是必需的。您可以尝试不同的平滑参数,以找到平滑度和保留原始特征之间的最佳平衡。
例子
1、将自然地球数据导入 PostGIS
使用 Baremaps 在 PostGIS 数据库中导入 Natural Earth 数据。
自然地球是公共领域地图数据集,比例尺为 1:10 米、1:50 米和 1:1.1 亿。
# 以下工作流程将下载 Natural Earth 数据、解压缩并最终将其导入数据库。
cd examples/naturalearth
baremaps workflow execute --file workflow.json
2、构建三维伦敦地图
在数据库中导入伦敦数据。
cd examples/extrusion
baremaps workflow execute --file workflow.json
在 tileset.json
中文件中,请注意与建筑层相关的 SQL 查询。这里,OSM 中存储的层数乘以 3,这大致相当于层的高度(以米为单位)。
...
select
id,
tags || jsonb_build_object('building:height',
(case when tags ->> 'building:levels' ~ '^[0-9\\.]+$'
then tags ->> 'building:levels'
else '1' end)::real * 3), -- OSM 中存储的层数乘以 3
geom
from
osm_ways
where
tags ? 'building'
然后在 style.json
中使用此属性文件来挤压建筑物。
{
...
"layers": [
{
"id": "building",
"type": "fill-extrusion",
"source": "baremaps",
"source-layer": "building",
"paint": {
"fill-extrusion-color": "rgb(152, 174, 221)",
"fill-extrusion-height": [
"get",
"building:height"
],
"fill-extrusion-base": 0,
"fill-extrusion-opacity": 0.9
}
}
],
...
}
要预览此示例,请启动图块查看器。此处,缓存指令是Caffeine 规范(在新标签页中打开) 用于 100MB 的瓦片缓存。
baremaps map dev \
--tileset 'tileset.json' \
--style 'style.json'
现在你的浏览器中应该会出现一张带有挤压建筑物的伦敦地图。http://localhost:9000