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()
}));

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

相关推荐
JohnYan几秒前
Bun技术评估 - 22 Stream
javascript·后端·bun
Mr_chiu几秒前
AI加持的交互革新:手把手教你用Vue3打造智能模板输入框
前端
精神状态良好2 分钟前
告别聊天式编程:引入 OpenSpec,构建结构化的 AI 开发工作流
前端
Aevget4 分钟前
界面控件DevExpress JS & ASP.NET Core v25.1 - 全新的Stepper组件
javascript·asp.net·界面控件·devexpress·ui开发
WangHappy6 分钟前
出海不愁!用Vue3 + Node.js + Stripe实现全球支付
前端·node.js
林希_Rachel_傻希希10 分钟前
手写Promise最终版本
前端·javascript·面试
visnix12 分钟前
AI大模型-LLM原理剖析到训练微调实战(第二部分:大模型核心原理与Transformer架构)
前端·llm
老妪力虽衰13 分钟前
零基础的小白也能通过AI搭建自己的网页应用
前端
该用户已不存在14 分钟前
Node.js后端开发必不可少的7个核心库
javascript·后端·node.js
褪色的笔记簿16 分钟前
在 Vue 项目里管理弹窗组件:用 ref 还是用 props?
前端·vue.js