作者: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管理页面添加服务提供者一致。 ↩︎