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

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

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端