Skip to content

SDK 指南 ​

GeoBridge JS SDK 让网页和 Node 程序只用「平台地址 + API Key(或公开服务)」就能把平台的地图服务放进 MapLibre 地图,并做属性与空间查询。

  • 零运行时依赖,目标 ES2020,只用浏览器与 Node 18+ 都有的 fetch、URL、AbortController。
  • 不打包 MapLibre,只按 MapLibre 的公开接口生成样式与图层,maplibre-gl 5 与 6 都可以使用。OpenLayers 等其他库可以用 SDK 生成的地址,见 OpenLayers 对照。
  • 当前版本 0.1.0。完整的方法列表见 API 参考。
在沙箱里运行快速开始示例

引入方式 ​

从在线系统下载(推荐) ​

在线系统自带 SDK 的浏览器版本(UMD):https://map-demo.geobridge.cn/geobridge-mapserver/sandbox/vendor/geobridge-sdk.umd.js。把它下载到自己网站的静态目录,用 <script> 引入,全局变量名为 GeoBridge:

html
<script src="./vendor/geobridge-sdk.umd.js"></script>
<script>
  const client = new GeoBridge.GeoBridgeClient({ baseUrl: 'https://map-demo.geobridge.cn/geobridge-mapserver', apiKey: 'gb_xxx…' })
</script>

同一目录下的 maplibre-gl/ 是 MapLibre GL JS 的浏览器版本,可以一并下载使用。请不要在生产页面中直接引用在线系统上的脚本地址,下载到自己的站点更稳定。

离线包与在线沙箱 ​

  • 本地部署的平台同样在 /sandbox/vendor/geobridge-sdk.umd.js 提供这个文件。
  • 在线沙箱的「下载」按钮得到的 HTML 通过 ./vendor/… 引用 SDK 与 MapLibre,见在线沙箱。

许可与 npm ​

SDK 以 MIT 许可开源,可以自由用于商业项目、修改和再分发,只需保留许可声明。SDK 暂未发布到 npm。在使用打包工具的项目里,可以把 UMD 文件放进项目目录后按路径导入,或继续用 <script> 引入并使用全局变量 GeoBridge。

快速开始 ​

js
// 页面已用 <script> 引入 SDK(全局 GeoBridge)与 MapLibre(maplibregl)
const client = new GeoBridge.GeoBridgeClient({
  baseUrl: 'https://map-demo.geobridge.cn/geobridge-mapserver', // 平台根地址;不带查询串与片段
  apiKey: 'gb_xxx…',          // 只访问公开服务时可以不写
})

const path = 'city-roads' // 服务路径:服务名,或 目录/服务名

const map = new maplibregl.Map({
  container: 'map',
  style: await client.maplibre.serviceStyle(path), // 矢量瓦片服务的样式
  transformRequest: client.transformRequest,       // 给发往平台的请求带上 Key
})

const bounds = await client.services.extent(path) // 服务的数据范围(经纬度)
if (bounds) map.fitBounds(bounds, { padding: 20 })
  • serviceStyle() 取回服务的 MapLibre 样式,其中的数据源、字体、雪碧图都指向平台,可以直接作为地图样式。
  • transformRequest: client.transformRequest 必须传:MapLibre 加载瓦片、字体、雪碧图时,由它给平台地址加上 Key。不传时「API Key」级别的服务瓦片全部 401。
  • 在已有的地图上叠加服务用 client.maplibre.addVectorTileService() 或 addRasterService(),见 API 参考。
  • 一个完整的 HTML 页面(含 MapLibre 的引入方式)见快速开始(在线)。

客户端选项 ​

new GeoBridgeClient(options):

选项默认说明
baseUrl必填平台根地址,http 或 https,含上下文路径(如 https://gis.example.com/geobridge);不能带用户信息、查询串与片段,尾部的 / 会去掉
apiKey无gb_ 开头的 API Key;不给则匿名,只能访问公开服务
keyTransport'header'Key 的传递方式:'header'(请求头)或 'query'(查询参数),见下文
platformUrls无其他也属于本平台的地址前缀,见下文
timeoutMs30000单次尝试的超时毫秒数
retries2GET 请求的重试次数
fetch全局 fetch自定义 fetch 实现,便于测试或在特殊运行环境中使用

选项不合法时构造函数抛 TypeError。

API Key 的传递 ​

keyTransport做法何时用
'header'(默认)请求头 X-GeoBridge-Token一般情况:Key 不出现在地址里,不会进入访问日志与浏览器历史
'query'查询参数 token跨域、瓦片量大、对加载速度敏感的页面:带自定义请求头的跨域请求,浏览器会对每个不同的地址先发一次预检,查询参数没有这个开销;代价是 Key 出现在地址里

Key 只发给 baseUrl 之下的地址。 SDK 先把地址规范化(消解 .. 等路径段),再判断它是否等于 baseUrl(或 platformUrls 中的某一项)或以「前缀/」开头;其他主机的地址(如第三方底图)原样放行,绝不附带 Key。client.request() 遇到不属于平台的绝对地址直接抛 FOREIGN_URL。

不能加请求头的库(<img>、OpenLayers 的 XYZ 与 WMS 源等)用 client.withKey(url) 给平台地址补上 token:

js
const source = new ol.source.XYZ({ url: client.withKey(client.services.tileUrl('city-roads')) })

platformUrls:平台有多个地址时 ​

矢量瓦片服务的样式、WMTS 能力文档里的地址,是平台按自己配置的对外地址拼出来的。如果你填的 baseUrl 与它字面上不同(localhost 与 127.0.0.1、内网与外网域名、经反向代理的端口),这些地址就不被视为平台地址:'header' 模式下不会加 Key,「API Key」级别服务的瓦片全部 401。处理办法二选一:

  • 把 baseUrl 写成与平台对外地址一致;
  • 把平台的对外地址也写进 platformUrls。

serviceStyle() 与 addVectorTileService() 在 'header' 模式且带 Key 时,发现样式中有不属于平台的数据源、字体或雪碧图地址,会在控制台警告一次(只含地址来源,不含 Key)。'query' 模式下平台会自行改写样式中的地址并带上 token,不需要处理。

WARNING

platformUrls 中的地址同样会收到 Key,只填你信任的平台地址。

Key 不会被泄露到日志 ​

  • Key 保存在私有字段中,不出现在 String(client)、JSON.stringify(client) 中。
  • 错误的 message 与 url 中出现的 Key 已替换为 ***,可以放心打印或上报。
  • 在网页里使用的 Key 对访问者是可见的(开发者工具中能看到请求),请给它配置来源域名白名单,见 API Key 与来源白名单。

重试、超时与取消 ​

  • 重试:只重试 GET,且只在网络错误与 HTTP 429、502、503、504 时重试,默认 2 次。等待时间从 300 毫秒起每次翻倍;响应带 Retry-After 时取两者中较大的,单次等待不超过 5 秒。其他 4xx 与 POST 请求不重试。
  • 超时:timeoutMs 对每次尝试单独计时,超时抛 TIMEOUT。
  • 取消:client.request() 接受 signal(AbortController 的信号),中止后抛 ABORTED。
  • 重定向:SDK 不跟随重定向(避免请求头里的 Key 被带到其他主机),遇到 3xx 抛 REDIRECT。常见原因是 http 被重定向到 https,请把 baseUrl 直接写成最终地址。

所有失败都抛 GeoBridgeError,错误码一览见 API 参考 与错误码。

在 Cesium 中使用 ​

实验功能

三维服务(3D Tiles、点云、高斯泼溅、三维模型、网格地形、栅格地形)是实验功能,需要平台开启三维开关(GEOBRIDGE_FEATURE_3D=true,见功能开关)。开关关闭时三维服务的接口不存在,请求得到 404。

client.cesium 在 CesiumJS 中加载平台的三维服务。SDK 本身不包含 Cesium,也不依赖它:

  • 自行引入 CesiumJS 1.146 或更高版本。 高斯泼溅以 3D Tiles 发布,使用 Cesium 1.146 起稳定支持的格式,更早的版本无法显示泼溅;其他三维服务同样按 1.146 验证。
  • 把 Cesium 命名空间对象作为第一个参数传入。 用打包工具时为 import * as Cesium from 'cesium' 得到的对象;用 <script> 引入 Cesium 的构建版本时为全局变量 Cesium。
  • Key 的传递与二维相同:SDK 用 client.cesium.resource() 生成带 Key 的 Cesium.Resource,子瓦片与地形瓦片的请求沿用同样的 Key,不需要另外设置。
  • 平台的三维服务不需要 Cesium ion。若不使用 ion,创建 Viewer 时请自行指定底图(或 baseLayer: false),并关闭依赖 ion 的控件(如 geocoder: false)。
js
// 页面已用 <script> 引入 CesiumJS(全局 Cesium)与 SDK(全局 GeoBridge)
const client = new GeoBridge.GeoBridgeClient({ baseUrl: 'https://map-demo.geobridge.cn/geobridge-mapserver', apiKey: 'gb_xxx…' })

const viewer = new Cesium.Viewer('cesiumContainer', { baseLayer: false, geocoder: false, baseLayerPicker: false })

// 网格地形
viewer.terrainProvider = await client.cesium.terrainProvider(Cesium, 'terrain-mesh')

// 3D Tiles(含点云与高斯泼溅),加载后飞过去
const tileset = await client.cesium.addTileset(Cesium, viewer, 'city-3d', { flyTo: true })

// 点云按分类着色
const cloud = await client.cesium.addTileset(Cesium, viewer, 'pointcloud')
cloud.style = client.cesium.pointCloudStyle(Cesium, cloud, 'classification')

// 三维模型服务:glTF 按默认位置放置,泼溅按 3D Tiles 加载
const { skipped } = await client.cesium.addModels(Cesium, viewer, 'models')
skipped.forEach((s) => console.warn(s.name, s.message))

栅格地形也可以在 MapLibre 中作为三维地形使用,见 maplibre.setRasterTerrain()。各方法的参数与返回值见 API 参考:client.cesium;三维服务的发布与预览见三维概览,可运行的示例见三维示例。

兼容性 ​

  • 浏览器:支持 ES2020 与 fetch 的现代浏览器。
  • Node:18 及以上(内置 fetch);在 Node 中无需 MapLibre,可以只用 services 与 query。
  • MapLibre GL JS:5 与 6。注意 MapLibre GL JS 6 只提供模块脚本,页面要通过 http(s) 打开,不能用 file://。
  • addVectorTileService()、addRasterService()、setRasterTerrain() 需要在地图 load 事件之后调用。
  • CesiumJS(client.cesium,实验功能):1.146 及以上。

下一步 ​

  • API 参考:每个方法的签名、参数与返回值。
  • 示例:37 个可运行的示例,覆盖出图、叠加图层、样式与交互、查询、三维与访问控制。
  • 三维(实验功能):三维服务的发布、预览与在 Cesium 中的用法。
  • 在线沙箱:不安装任何东西,直接改代码看效果。