从 GeoServer 到商用 GIS:我对 GeoScene 与 SuperMap 架构的理解

0 阅读5分钟

刚开始接触到 GeoScene Enterprise 的时候,说实话我没理解,当时是参加了易智瑞的 C 组开发竞赛,那个时候才大二,我不知道这玩意是啥,同组的也没人懂,最后 Cesium 随便搞点空间分析上去就交了,最后因为没有用到他们的产品所以不算数。

后来学了 GeoServer,才逐渐搞懂是怎么一回事,由此引申出当时 GeoScene Enterprise 的 Portal/Server/Database 三大核心组件逻辑,其实超图的 SuperMap iServer 生态和易智瑞的 GeoScene Enterprise 架构逻辑是完全相通的,这里拿大家最熟悉的 GeoServer 做对比就很好理解。

一、三大核心组件分工对比

组件GeoScene EnterpriseSuperMap 生态GeoServer 生态
PortalGeoScene Portal:统一门户,支持用户权限管理、资源共享、Web 应用低代码搭建、服务目录检索,面向开发者和最终用户SuperMap iPortal:功能和 GeoScene Portal 基本一致,还支持多源异构服务(包括 GeoServer 服务)的聚合管理无原生对应组件,需自研前端管理页面,仅自带简陋的管理后台,无法直接交付给客户使用
DatabaseGeoScene 托管数据库:通过 GeoScene Pro 上传数据后自动托管,支持矢量、栅格、三维场景等多源数据存储SuperMap 空间数据库:支持 UDBX 引擎,也可外接 PostGIS、MySQL 等关系型数据库本身不内置存储,通常外接 PostGIS、文件系统(Shapefile、GeoTIFF 等)作为数据源
ServerGeoScene Server:核心服务发布引擎,支持 OGC 标准服务和 Esri 扩展服务SuperMap iServer:核心服务发布引擎,支持 OGC 标准服务和超图扩展服务仅作为服务发布引擎,核心能力是发布 OGC 标准服务

🔍 补充说明:很多人容易混淆 Portal 和 Server 的区别,简单来说:

  • Server 是后台服务引擎,只负责处理地理数据的计算、发布、接口响应
  • Portal 是前台资源门户,用户不需要知道 Server 的地址,在 Portal 里就能找数据、做应用、管权限,是商用 GIS 平台面向政企客户的核心价值之一

二、什么是地理服务?

地理服务本质就是围绕地理数据提供的标准化 HTTP 接口,让前端 SDK、第三方系统可以通过 URL 操作地理数据,不需要直接访问数据库。

最典型的就是 OGC 标准服务,比如我们在 GeoServer 发布一张 Shapefile 矢量数据,选择 WMS 服务发布,GeoServer 就会生成一个服务 URL,后续不管是 OpenLayers、Leaflet 还是 GeoScene JS SDK,都可以通过这个 URL 加载这张图层,示例如下: ![[Pasted image 20260408180950.png]] Server 的地址,在 Portal 里就能找数据、做应用、管权限,是商用 GIS 平台面向政企客户的核心价值之一 在这里插入图片描述

// OpenLayers 加载 GeoServer 发布的 WMS 服务
import Map from 'ol/Map.js';
import OSM from 'ol/source/OSM.js';
import TileLayer from 'ol/layer/Tile.js';
import TileWMS from 'ol/source/TileWMS.js';
import View from 'ol/View.js';

const map = new Map({
  target: 'map-container',
  layers: [
    new TileLayer({ source: new OSM() }),
    // 加载 GeoServer WMS 服务
    new TileLayer({
      source: new TileWMS({
        url: 'http://localhost:8080/geoserver/your_workspace/wms',
        params: { 'LAYERS': 'your_workspace:province_boundary', 'TILED': true },
        serverType: 'geoserver'
      })
    })
  ],
  view: new View({ center: [116.39, 39.9], zoom: 10 })
});

三、商用平台服务和 OGC 服务的差异

GeoScene Server、SuperMap iServer 除了支持标准 OGC 服务(WMS/WFS/WMTS/WCS 等),还推出了大量自研的扩展服务,比 OGC 服务效率更高、使用更方便:

  • 超图扩展服务:REST 地图服务、REST 数据服务、数据流服务、SMTiles 瓦片、UGC 矢量瓦片、三维场景服务(S3M)
  • GeoScene 扩展服务:Feature Service、Map Service、Scene Service、Geoprocessing 服务(空间分析服务) ![[Pasted image 20260408180427.png]]

1. 数据格式差异

OGC 服务默认的交互格式是 XML,比如 WFS-T(事务型 WFS,用于增删改矢量数据)的请求参数必须是 XML 格式,写起来非常繁琐,这也是很多新手吐槽的点:

// 用 Axios 调用 GeoServer 的 WFS-T 新增要素(XML 格式请求)
const addFeatureXML = `
<wfs:Transaction service="WFS" version="1.1.0"
  xmlns:wfs="http://www.opengis.net/wfs"
  xmlns:gml="http://www.opengis.net/gml"
  xmlns:your_ns="http://your_workspace">
  <wfs:Insert>
    <your_ns:province_boundary>
      <your_ns:geom>
        <gml:Point srsName="EPSG:4326">
          <gml:coordinates>116.39,39.9</gml:coordinates>
        </gml:Point>
      </your_ns:geom>
      <your_ns:name>北京市</your_ns:name>
    </your_ns:province_boundary>
  </wfs:Insert>
</wfs:Transaction>
`;

axios.post('http://localhost:8080/geoserver/your_workspace/wfs', addFeatureXML, {
  headers: { 'Content-Type': 'text/xml' }
}).then(res => console.log('新增成功', res));

![[Pasted image 20260408181021.png]] 而商用平台的扩展服务默认支持 JSON 格式交互,代码写法简洁很多,比如调用 SuperMap iServer 的 REST 数据服务新增要素:

// 调用 SuperMap iServer REST 数据服务新增要素(JSON 格式请求)
axios.post('http://localhost:8090/iserver/services/data-your_workspace/rest/data/featureResults.json', {
  datasetNames: ["your_workspace:province_boundary"],
  features: [{
    fieldNames: ["name", "geom"],
    fieldValues: ["北京市", {"type":"Point","coordinates":[116.39,39.9]}]
  }]
}).then(res => console.log('新增成功', res));

在这里插入图片描述

2. 功能扩展差异

OGC 标准服务只能满足基础的地图加载、数据查询需求,而商用平台的扩展服务封装了大量开箱即用的能力,比如直接调用 GeoScene 的 Geoprocessing 服务做缓冲区分析,不需要自己在后端写空间分析逻辑:

// GeoScene JS API 调用服务器端缓冲区分析服务
import Geoprocessor from "@arcgis/core/tasks/Geoprocessor";

// 初始化GP服务(服务已经在GeoScene Server发布好)
const gp = new Geoprocessor({
  url: "https://your-geoscene-server/server/rest/services/buffer/GPServer/Buffer"
});

// 提交分析参数
const params = {
  input_features: 待分析的矢量图层,
  buffer_distance: 1000, // 缓冲区半径1000米
  distance_unit: "Meters"
};

// 异步执行分析,直接拿结果
gp.submitJob(params).then((jobInfo) => {
  jobInfo.waitForJobCompletion().then(() => {
    jobInfo.fetchResultData("output_features").then((result) => {
      map.add(result.value); // 直接把分析结果加载到地图上
    });
  });
});