前几篇文章介绍了全球12.5m地形高程数据及版本升级,为何要升级,是因为12.5m全球陆地覆盖不全,所以需要使用更高分辨率数据去修补,而如果降低一些分辨率,则会有更多全球级别的地形高程数据,ALOS是其中一个。
在全球30m的地形高程数据中,有SRTM、ASTER、NASA、ALOS等数据,这一众数据中,论数据质量和数据时效性,ALOS是其中最好的。
ALOS(Advanced Land Observing Satellite)是由日本宇航局(JAXA)发射的卫星,提供了一系列的地球观测数据,包括高分辨率的光学影像和数字高程模型(DEM)数据。其DEM数据主要是通过其搭载的PALSAR(Phased Array type L-band Synthetic Aperture Radar)雷达仪器获得的。PALSAR是一种合成孔径雷达,能够在不同的地形和天气条件下获取地表高程信息。DEM数据在许多地理信息和环境研究应用中都得到了广泛的应用,包括地形分析、水资源管理、自然灾害监测等。
基于此,我对ALOS 30m的高程数据进行了处理,生成了能够在Cesium上显示的terrain瓦片数据。
ALOS的数据获取可以通过USGS Earth Explorer或其他相关平台均可免费获取,数据量比较大,处理起来比较费时。下载下来的数据无法直接使用,需要进行重投影、拼接成一整张tif,拼接起来后数据较大,大约有1.4TB,接下来使用瓦片工具对数据进行处理,生产出来的成果能够直接在Cesium上加载显示。生成的数据layer.json配置如下:
可以看到,目前30m高程数据最高能切到14级,生成出来的瓦片数据总共有6.68亿个散列文件!
数据使用分两步:1.数据发布,相当于在后端进行数据发布,供前端调用进行可视化展示;2.Cesium调用CesiumTerrainProvider对数据发布url进行接入;下面分别进行详细介绍。
地形瓦片数据很简单,是terrain格式文件,按照层级和列号以文件夹形式组织;而且数据切好后不需要改动,都是静态文件,因此,使用Nginx进行发布最为方便、简单,也可以使用Tomcat等也可以发布。这里我使用windows环境下Nginx对ALOS全球30m地形瓦片数据发布进行介绍。
首先下载Nginx,我下载的是1.24.0版本,下载解压后,进入conf文件夹,使用notepad++打开nginx.conf文件,对默认server进行配置,如下图所示:
这里监听的是8802端口,也针对跨域进行了相关设置,我们关注的是location部分,root配置的是地形瓦片数据根目录在电脑的绝对路径,我这里配置的是D:/Data/DEM/Data/DEM-30M-WGS84-GLOBAL-ALOS-MESH/,在电脑中打开这个绝对路径,可以看到ALOS全球30m地形瓦片数据的根目录截图:
为了方便大家使用,我把server的配置信息发出来。
server
{
listen 8802;
server_name localhost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Origin "$http_origin";
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS')
{
return 204;
}
location / {
autoindex on;
root D:/Data/DEM/Data/DEM-30M-WGS84-GLOBAL-ALOS-MESH/;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
配置好后,保存nginx.conf文件,然后打开命令行,进入nginx.exe当前目录,输入命令"start nginx"对nginx进行启动,会有一个窗口一闪而过,这样数据就发布了。
数据虽然发布了,为了验证数据是否发布成功,我们可以打开浏览器,输入“http:\localhost:8802”,如果显示地形瓦片数据目录,表示数据发布成功了。
数据发布完成后,我们开始进行数据接入,首先搭建Cesium工程,这里不再展开,我放出加载地形瓦片数据关键代码:
//创建viewer
const viewer = new Cesium.Viewer('cesium-app', {
selectionIndicator: false,
baseLayerPicker: false,
homeButton: false,
infoBox: false,
timeline: false,
navigationHelpButton: false,
navigationInstructionsInitiallyVisible: false,
vrButton: false,
fullscreenButton: false,
geocoder: false,
animation: false,
sceneModePicker: false,
shadows:true,
imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
})
});
viewer.cesiumWidget.creditContainer.style.display = "none";
viewer.scene.globe.enableLighting = false;
viewer.scene.highDynamicRange = true;
viewer.scene.msaaSamples = 16;
viewer.scene.fog.enabled = true;
viewer.scene.fog.enableLighting = true;
//加载地形
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
url:"http://192.168.1.77:8802/",
tilingScheme: new Cesium.GeographicTilingScheme(),
requestVertexNormals:true
});
在上述代码中,首先创建viewer对象,设置大气、雾、光照、抗锯齿等参数增强地形表达效果;再通过CesiumTerrainProvider创建viewer的terrainProvider对象,这样数据就加载到场景当中了。在这里说明一下,我的后端nginx和前端cesium不是一台机器,后端机器ip是192.168.1.77,开放的端口号是8802,因此我们接入的url全称是"http:\192.168.1.77::8802",也需要设置tilingScheme,我们的数据都是wgs84投影,所以设置的是GeographicTilingScheme对象;同时设置requestVertexNormals为true,因为地形瓦片是Mesh格式,在生成Mesh格式terrain数据时,也生成了每个点的法向量,这样开启光照,地形会有光照明暗阴影,效果更加自然。
最后运行程序,数据就能顺利接入cesium里了。下面放几张截图效果
从上面可以看出,整个数据发布和数据接入还是比较容易的。有些公司和开发者将瓦片数据进行打包成紧凑型格式,或者存入sqlite等数据库中,再开发数据发布服务进行数据发布,整个小文件瓦片数据打包成一个或多个大文件,这样便于迁移和权限控制;我个人觉得使用Nginx发布瓦片数据这种方式反而更纯粹、更简单;因为地形瓦片数据我已经压缩成tar.gz或者zip等压缩格式,而且数据不再更改,如果需要迁移,只需要把压缩文件迁移过去后解压,再配置Nginx参数即可。
ALOS是目前覆盖全球范围能够获取到的最高精度,质量和时效性最好的的数据了,这份数据用来做地形显示、地形分析、水文模型等效果和质量都是比较优秀的。对于这份数据,有需要的读者,可以私信联系;我将及时回答大家的问题。