最近在学习cesium的使用,所以调研了几种使用的方法
GDAL是一个用于栅格和矢量地理空间数据格式的转换库。我们主要使用其中的一个工具gdal2tiles
,这是一个生成包含TMS瓦片、KML文件和简单网页查看器的目录的工具。
进入网址根据不同系统查看
这里以macos为例,直接使用brew安装
brew install gdal
例如有一个hf.tif
,我们使用gdal2tiles
对他进行切片
gdal2tiles --zoom=0-10 --xyz hf.tif output
0-10
生成后的切片,通过nginx提供服务就行了
server {
listen 8889;
server_name localhost;
location /map {
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT';
add_header 'Access-Control-Allow-Headers' '*';
alias html/tiles;
if ($request_method = 'OPTIONS') {
return 200;
}
}
}
const tmsLayer = viewer.scene.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
url: 'http://localhost:8889/map/{z}/{x}/{y}.png',
credit: layer.name
})
)
用来在Cesium中加载GeoTIFF/COG(Cloud optimized GeoTIFF)的插件。是一个GitHub上的开源插件,前往仓库查看。插件核心基于geotiff.js,从各种不同的(Geo) TIFF 文件类型读取(地理空间)元数据和原始数组数据。
具体可以查看插件的文档
安装依赖
#npm
npm install --save tiff-imagery-provider
#yarn
yarn add tiff-imagery-provider
#pnpm
pnpm add tiff-imagery-provider
下面示例是渲染一个tif,并使用单波段伪彩色对其进行上色。如果遇到坐标不兼容问题,可以使用proj4
将tif坐标系转换成EPSG:4326
。
const providertif = await TIFFImageryProvider.fromUrl('/hf.tif', {
renderOptions: {
single: {
"colors": [
[1, "rgb(154, 206, 127)"],
[2, "rgb(163, 214, 245)"],
[3, "rgb(255, 251, 177)"],
[4, "rgb(193, 114, 97)"],
[5, "rgb(220, 100, 120)"],
[6, "rgb(49, 173, 105)"]
],
type: "discrete",
useRealValue: true // use real value in colors stops
}
},
projFunc: (code) => {
// 坐标系转换事例
if (code === 32649) {
proj4.defs("EPSG:32649", "+proj=utm +zone=49 +datum=WGS84 +units=m +no_defs +type=crs");
return {
project: proj4("EPSG:4326", "EPSG:32649").forward,
unproject: proj4("EPSG:4326", "EPSG:32649").inverse
}
}
}
})
// 由于库的类型定义冲突,所以暂时忽略https://github.com/hongfaqiu/TIFFImageryProvider/issues/42
// @ts-ignore
const tifLayer = viewer.scene.imageryLayers.addImageryProvider(providertif)
GeoServer是一款用来采用Java编写的,允许用户分享与编辑地理空间数据的开源软件。
这里使用podman进行安装(docker同理)
podman run -it -p8080:8080 \
--mount type=bind,src=~/geoserver,target=/opt/geoserver_data \
docker.osgeo.org/geoserver:2.25.4
配置路径/opt/geoserver_data
映射到~/geoserver
,方便后续将tif放入系统中。
镜像启动后访问链接 http://localhost:8080/geoserver
默认用户名/密码:admin / geoserver
由于geoserver的服务需要浏览器调用使用,所以需要解决跨域问题
podman exec -it 镜像id /bin/bash
chmod 777 /tmp && apt-get update && apt install vim -y
vim /usr/local/tomcat/webapps/geoserver/WEB-INF/web.xml
直接到文件中粘贴
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>chainPreflight</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
a. 访问对应geoserver版本的pom文件,查看jetty版本,我这里是2.25.4
https://github.com/geoserver/geoserver/blob/2.25.4/src/pom.xml
b. 下载指定jetty的jar包
https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlets/9.4.55.v20240627
https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-util/9.4.55.v20240627
右键获取链接,到镜像中wget下载即可
cd /usr/local/tomcat/webapps/geoserver/WEB-INF/lib
wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/9.4.55.v20240627/jetty-servlets-9.4.55.v20240627.jar
wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/9.4.55.v20240627/jetty-util-9.4.55.v20240627.jar
podman restart 7f8b0dedd3d3
例如起名test
,url可以暂时随便写
数据源选择GeoTIFF - Tagged Image File Format with Geographic information
工作空间选择刚刚创建的test
,数据源名称填写例如hftest
,将hf.tif
放置到刚刚镜像映射的目录~/geoserver
下,例如我创建了个tif
文件夹存放,这样连接参数浏览文件时就可以查看到。
点击保存后,进行发布
进入到编辑图层页面,可以先直接点击保存即可
可以在图层预览页面看到刚刚发布的图层
可以点击常用格式下的OpenLayers
预览图层
const tifLayer = new Cesium.WebMapServiceImageryProvider({
url: 'http://localhost:8080/geoserver/test/wms', // geoserver服务地址
layers: 'test:hf', // 工作区名:图层名
parameters: {
service: 'WMS',
format: 'image/png',
srs: 'EPSG:4326',
transparent: true,
}
})
viewer.imageryLayers.addImageryProvider(tifLayer)
几种方法各有利弊,
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。