JSAPITHREE-自定义瓦片服务加载

本章将介绍如何使用 GeoServer 发布 GeoTIFF 栅格瓦片服务,并通过 Baidu JSAPI THREE(MapVThree)加载并展示这些瓦片服务。我们将从服务发布、跨域配置,到前端接入一步一步详解。


🧱 一、瓦片服务发布(基于 GeoServer)

1. 环境准备

安装 GeoServer

请根据你的 Java 版本选择合适的 GeoServer 版本:

  • 如果你使用 Java 8 ,推荐使用 GeoServer 2.18.0
  • 2.19.0 起 GeoServer 不再支持 Java 8,Java 11+ 可选 2.26.0+

安装教程参考:

👉 GeoServer 安装教程


启动 GeoServer

GeoServer 安装目录下的 bin 文件夹中包含两个脚本:

  • startup.bat:启动 GeoServer(双击即可运行)
  • shutdown.bat:关闭服务

启动成功后访问:

bash 复制代码
http://localhost:8080/geoserver

2. 准备 GeoTIFF 数据

推荐使用公开的 GeoTIFF 数据源:

平台 内容
NASA Earthdata MODIS/Landsat 遥感数据
Natural Earth 简化世界地图、自然地理数据
OpenTopography 高精度全球/区域 DEM 数据

本示例使用的是 Natural Earth 提供的全球栅格图:

👉 10m Natural Earth II Raster


3. 在 GeoServer 中发布 GeoTIFF

第一步:创建工作区

  1. 管理后台 → 「工作区」 →「添加新的工作区」
  2. 名称:myws
  3. 命名空间 URI:http://example.com/myws

第二步:添加 GeoTIFF 数据存储

  1. 左侧菜单 →「数据存储」→「添加新的存储」

  2. 选择类型:GeoTIFF

  3. 配置:

    • 工作区:myws

    • 数据源名称:mytiff

    • 文件路径:

      javascript 复制代码
      file:C:/GeoData/my.tif
  4. 点击「保存」


第三步:发布图层

  1. 保存数据存储后,点击「发布」
  2. 图层名称将自动生成(如:geotiff_coverage
  3. 设置边界和坐标系(建议使用 EPSG:4326 或 EPSG:3857)
  4. 点击「保存」

此时图层已成功发布,可在「图层预览」中查看。


4. 获取 XYZ 瓦片服务地址

GeoServer 默认会通过 GeoWebCache 提供瓦片服务,我们可以直接访问以下链接:

ruby 复制代码
http://localhost:8080/geoserver/gwc/service/tms/1.0.0/myws:geotiff_coverage@EPSG:900913@png/{z}/{x}/{y}.png

注:EPSG:900913 等价于 EPSG:3857(Web Mercator)

测试示例:

ruby 复制代码
http://localhost:8080/geoserver/gwc/service/tms/1.0.0/myws:geotiff_coverage@EPSG:900913@png/1/1/1.png

5. 跨域访问设置(CORS)

浏览器默认会阻止不同端口或域名之间的请求,因此我们需要手动开启跨域:

修改 web.xml(路径):

bash 复制代码
<GeoServer安装目录>/webapps/geoserver/WEB-INF/web.xml

添加以下配置:

xml 复制代码
<filter>
  <filter-name>cross-origin</filter-name>
  <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
  <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>

然后 重启 GeoServer,CORS 设置即可生效。

瓦片服务加载展示(mapvthree)

官方文档:

👉 JSAPI THREE - 加载瓦片底图教程

1. 自定义 TileProvider

笔者注意到JSAPI THREE文档中关于底图加载上有XYZ加载支持,但是并没有找到相关的API,所以这里基于ImageryTileProvider自己实现了一个TileProvider, 主要是参考BingImageryTileProvider的加载逻辑(编译混淆后的代码,阅读起来废了一些功夫),改写了一下,主要是重写getTileURL方法

js 复制代码
class MyTileProvider extends mapvthree.ImageryTileProvider {

  // 这两个目前不知道有什么用,但是不配置会报错和报警,提示没有配置,报错信息如上
  _supportAllProjections = true;
  _useWebMeractorProjectionAndGrid = true;
  // 瓦片最大级别
  _defaultMaxLevel = 18;

  getTileURL(z, x, y) {
    return `http://localhost:8080/geoserver/gwc/service/tms/1.0.0/myws:geotiff_coverage@EPSG:900913@png/${z}/${x}/${y}.png`
  }
}

2. 添加图层到引擎中

csharp 复制代码
js
const myTiff = engine.add(new mapvthree.MapView({
  imageryProvider: new MyTileProvider()
}));

搞定,现在就能看到效果了

相关推荐
暴怒的代码3 分钟前
解决Vue2官网Webpack源码泄露漏洞
前端·webpack·node.js
老刘忙Giser17 分钟前
C# Process.Start多个参数传递及各个参数之间的空格处理
java·前端·c#
阿珊和她的猫42 分钟前
组件之间的双向绑定:v-model
前端·javascript·vue.js·typescript
爱分享的程序员1 小时前
Node.js 实训专栏规划目录
前端·javascript·node.js
阿迪州1 小时前
iframe作为微前端方案的几个问题
前端·面试
我就是避雷针小鬼啊1 小时前
vue2组件库规划
前端
Burt2 小时前
#🎉 unibest 3.0 发布了!看看都更新了啥好用的功能\~
前端·uni-app
星垂野2 小时前
JavaScript 执行栈和执行上下文详解
前端·javascript
水冗水孚2 小时前
express使用node-schedule实现定时任务,比如定时清理文件夹中的文件写入日志功能
javascript·node.js·express