作者:MR
SuperMap iServer (以下简称iServer)的 JAVA API严格来说就是iServer JAVA类库提供的开发接口,为了区别于扩展iServer,我们说的JAVA API都是指:在其他应用中,引用iServer相关jar包进行开发的API(方式)。
在 SuperMap iServer 中,一个完整的 GIS 服务的发布流程如下图所示:
1. 通过服务提供者设置,可以构建服务提供者; 2. 通过服务提供者和服务组件设置,可以构建服务组件上下文,服务组件由服务组件上下文构建而成; 3. 通过服务组件和服务接口设置,可以构建服务接口上下文,服务接口由服务接口上下文构建而成。
SuperMap iServer 提供了基于 REST 的应用编程接口——SuperMap iServer REST API,这些接口封装了大部分的 GIS 功能,包括基本的地图功能,数据编辑功能,分析功能等。SuperMap iServer 将这些 GIS 功能通过 SuperMap iServer REST API 提供给客户端,客户端使用这些 API,能够获取到相应的 GIS 能力。
**iServer Java API开发主要用于后端(java语言,其他语言请使用iServer REST API或SuperMap iClient)向iServer发送HTTP请求,得到iServer响应。**当然,自己使用java.net.*相关包使用iServer REST API也能达到相同效果,使用iServer Java API的好处是,不需要自己构造请求体以及解析iServer返回内容、并且不存在浏览器的跨域限制等。
###使用服务提供者
服务提供者对象可以使用对应的服务提供者设置对象来构造,在iServer帮助文档 JAVAdoc 里可以看到各种服务提供者类和其对应的设置类,请对照iServer发布的各种服务1来确定应该使用哪一个,同时也注意下各服务提供者类之间的继承关系。
最常用的是使用各种服务接口类型服务提供者,比如RestMapProvider、RestDataProvider等,其次是具体各种类型的服务提供者。比如,具体的地图服务提供者则是com.supermap.services.components.spi.MapProvider的子类,接近30个之多。 前者(服务接口类型服务提供者,不依赖SuperMap iObjects Java环境,下面简称组件)的设置类可以简单得只需要设置一个访问地址即可(若服务设置授权访问就需要设置token或者用户名密码),构造出对应服务提供者对象就可以使用服务提供者对象的方法了。例如,构建一个 RestDataProvider 的代码如下:
// 服务提供者设置 RestDataProviderSetting RDPS = new RestDataProviderSetting(); RDPS.restServiceRootURL = "http://support.supermap.com.cn:8090/iserver/services/data-world/rest"; // 创建服务提供者 dataProvider = new RestDataProvider(RDPS); // TODO // 获取数据源 "World" 里所有数据集名,其他请参考RestDataProvider类参考 //List< String > dtnms = dataProvider.getDatasetNames( "World" ); //for ( String s : dtnms ) //{ // System.out.println( s ); //}后者的设置类视情况定(参见对应设置类的类参考),数据来源为本地的几乎都需要工作空间信息、缓存来源信息等,这种方式依赖组件环境且不再是向目标URL发请求,而是可以直接对本地数据进行操作(转发服务的除外,看类参考)。一般在特殊应用场景才会这么使用,打开操作本地数据等更多的应用场景应该是扩展iServer和使用组件。iServer帮助文档提供了一个示例。
###使用服务组件
通过服务提供者和服务组件设置,可以构建服务组件上下文,服务组件由服务组件上下文构建而成。前面已经介绍了怎么构建一个服务提供者,以数据服务组件为例,创建一个数据服务组件 DataImpl 对象代码如下:
// 服务提供者设置 RestDataProviderSetting RDPS = new RestDataProviderSetting(); RDPS.restServiceRootURL = "http://support.supermap.com.cn:8090/iserver/services/data-world/rest"; // 创建服务提供者集合 List< DataProvider > dataProviders = new ArrayList<>( ); dataProviders.add( new RestDataProvider(RDPS)); // 服务组件上下文 DataContext dataContext = new DataContext( ); dataContext.setProviders( dataProviders ); // data服务组件实现类 DataImpl dataImpl; try { dataImpl = new DataImpl( dataContext ); // TODO // 获取数据源 "World" 里所有数据集名,其它使用参见DataImpl类参考 //List< String > dtnms = dataImpl.getDatasetNames( "World" ); //for ( String s : dtnms ) //{ // System.out.println( s ); //} } catch ( DataException e ) { e.printStackTrace( ); }###使用服务接口
JAVA API服务接口的使用主要用于获取服务的元数据、地图瓦片、要素等。iServer的帮助文档已经提供了一个使用的完整示例,参照示例和Java doc即可。使用场景不多。
可以访问iServer服务管理页面,通过添加服务提供者(http://{IP}:{端口}/iserver/manager/spsAndspsets)、添加服务组件并绑定服务接口(http://{IP}:{端口}/iserver/manager/scsAndscsets)来发布服务加深对三层结构的了解,帮助文档点此 。通过iServer JAVA API创建服务提供者的过程和在iServer管理页面添加服务提供者一致。 ↩︎