服务提供者层的扩展

发送反馈


服务提供者层的实现形式如下:

public class SampleProvider implements ProviderContextAware {

     ...

}

ProviderContextAware 用于获取服务提供者上下文,通过服务提供者上下文,可以获取该服务提供者对应的配置信息。

在 SuperMap iServer 的三层架构中,各层的配置可参考iServer 配置文件说明

 

服务提供者接口

SuperMap iServer 已有的服务提供者类型有地图服务提供者、数据服务提供者、三维服务提供者、空间分析服务提供者、交通网络分析服务提供者。针对这些服务提供者,SuperMap iServer 已经进行了实现,从而提供了 GIS 功能的来源,支撑 SuperMap iServer 提供各种 GIS 功能(参见:服务提供者介绍)。

扩展服务提供者,对已有的服务提供者类型重新实现,可以扩宽 SuperMap iServer 提供 GIS 功能的来源。

表1  扩展服务提供者实现的接口/继承的类

扩展类型 继承的类/实现的接口 备注
地图服务提供者 com.supermap.services.components.spi.MapProvider 所有的地图服务提供者都实现该接口。
实现该接口的服务提供者可以被地图服务组件使用。
com.supermap.services.components.spi.AbstractRestMapProvider 封装了访问 REST 地图服务所需的基本功能,所有使用 REST 地图服务的服务提供者都可使用此类扩展。
com.supermap.services.components.spi.RemoteTiledMapProviderBase RemoteTileProviderBase 是用于聚合第三方地图服务的抽象类,用于构建在线服务提供者,实现了 ProviderContextAware 服务提供者上下文依赖库接口和 MapProvider 地图服务提供者接口。
(参见:RemoteTiledMapProviderBase_扩展
com.supermap.services.components.spi.LocalTiledMapProviderBase LocalTileProviderBase 是用于扩展本地地图瓦片服务的抽象类,本地的地图瓦片来源于 ArcGIS 切图所得。
(参见:LocalTiledMapProviderBase_扩展
其他已有实现类(参见:服务提供者介绍  
数据服务提供者 com.supermap.services.components.spi.DataProvider 所有的数据服务提供者都实现该接口。
实现该接口的服务提供者可以被数据服务组件使用。
其他已有实现类(参见:服务提供者介绍  
空间分析服务提供者 com.supermap.services.components.spi.SpatialAnalystProvider 所有的空间分析服务提供者都实现该接口。
实现该接口的服务提供者可以被空间分析服务组件使用。
其他已有实现类(参见:服务提供者介绍  
交通网络分析服务提供者 com.supermap.services.providers.spi.TransportationAnalystProvider 所有的交通网络分析服务提供者都实现该接口。
实现该接口的服务提供者可以被交通网络分析服务组件使用。
其他已有实现类(参见:服务提供者介绍  
三维服务提供者 com.supermap.services.components.spi.RealspaceProvider 所有的三维服务提供者都实现该接口。
实现该接口的服务提供者可以被三维服务组件使用。
其他已有实现类(参见:服务提供者介绍  

在定义新的服务提供者类型,实现特定行业领域的功能时,不受以上接口限制。

服务提供者上下文

在服务提供者实现类中,可以通过 ProviderContextAware 接口获取服务提供者上下文,通过服务提供者上下文,可以获取获取服务提供者配置信息。

用户自定义服务服务配置信息在 iserver-services.xml 中(详见iServer 配置文件说明),配置服务提供者时定制,结构由服务提供者配置类确定。服务提供者配置如下:

<provider class="com.supermap.sample.SampleProvider" name="sampleProvider">

        <config class="com.supermap.sample.SampleProviderSetting">

                <param1>default</param1>

                ...

        </config>

</provider>

其中,SampleProviderSetting 是 SampleProvider 对应的配置类,param1对应 SampleProviderSetting 类的属性,通过使用服务提供者配置类,可以在 SuperMap iServer 中构建同种类型、不同来源的服务提供者。

在服务提供者实现类中,可以通过 ProviderContextAware 接口获取服务提供者上下文,并通过服务提供者上下文获取服务提供者配置信息,具体方式如下:

public class SampleProvider implements ProviderContextAware{

        ...

        public void setProviderContext(ProviderContext context) {

                SampleProviderSetting sampleProviderSetting = context.getConfig(SampleProviderSetting.class);

                ...

        }

}

sampleProviderSetting 对象即对应配置文件中<provider/>下的<config/>配置项。

RemoteTiledMapProviderBase 扩展

扩展介绍

RemoteTileProviderBase 是用于聚合第三方地图服务的抽象类,用于构建在线服务提供者,实现了 ProviderContextAware 服务提供者上下文依赖库接口和 MapProvider 地图服务提供者接口。

该类的主要出图方法是 getTileImageUrl(TileImageParameter tileImageParameter)。

  1. 如何扩展开发

用户可以继承 RemoteTileProviderBase 抽象类,来聚合第三方地图服务。

要实现以下方法:

  注意:

  1. 配置和部署

将编译好的扩展类的 class 文件放到%SuperMap iServer_HOME%\webap\iserver\WEB-INF\classes 目录下(默认情况下没有 classes 目录,需要新建)或是编译好的 jar 包放到%SuperMap iServer_HOME%\webapp\ iserver\WEB-INF\lib\目录下,iServer 就可以使用扩展的服务提供者类,关于如何配置服务提供者,详见 通过 XML 文件配置服务提供者

  1. 关于缓存

该类 cacheEnabled(),可以返回 true 或者 false 来设置是否使用缓存。

为 true 时,使用图片缓存,目前的图片缓存目录即地图服务提供者配置对象 MapProviderSetting.getOutputPath()目录,缓存路径为“\cache\地图名_图片宽度 x 图片高度\比例尺倒数\图片 x 索引\图片 y 索引.图片格式后缀”,同时,该类对访问的第三方地图服务也进行了缓存,缓存路径为“\cache\http\地图名_图片宽度 x 图片高度\比例尺倒数\图片 x 索引\图片 y 索引.图片格式后缀”。

扩展示例

这里扩展一个地图服务提供者。GoogleMapsMapProvider 继承 RemoteTileProviderBase 实现。你可以在%SuperMap iServer_HOME%/samples/code/DSSE/GoogleMapsProviderSample 位置找到该示例的源代码。

GoogleMapsMapProvider 实现类代码如下:

GoogleMapsMapProvider.java

GoogleMapsMapProvider 类中 GoogleMapLayer 表示当前地图使用 Google 图层(扩展其它 provider 时,可以参考 GoogleMapLayer 定义相应的 Layer)。GoogleMapLayer 实现类代码如下:

GoogleMapLayer.java

配置类直接使用 MapProviderSetting,配置如下:

<provider class="com.supermap.sample.serviceprovider.GoogleMapsMapProvider" name="mapProvider-GoogleMaps">

    <config class="com.supermap.services.components.spi.MapProviderSetting">

    </config>

</provider>

编译后的 Jar 放到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录。

新建一个使用 mapProvider-GoogleMaps 的“地图服务组件”map-google,发布为 rest、WMS 1.1.1 服务:

<component class="com.supermap.services.components.impl.MapImpl" interfaceNames="rest,wms111" name="map-google" providers="mapProvider-GoogleMaps">

    <config class="com.supermap.services.components.MapConfig">

    </config>

</component>

即可通过根 URI:http://<host>:<port>/iserver/services/map-google/rest 访问地图 REST 功能。通过 http://<host>:<port>/iserver/services/map-google/rest/maps/googlemaps.ijs 访问地图(googlemaps 为地图名,在 GoogleMapsMapProvider 实现类中声明),结果如下:

LocalTileProviderBase 扩展

扩展介绍

LocalTileProviderBase 是用于扩展本地地图瓦片服务的抽象类,实现了 ProviderContextAware 服务提供者上下文依赖库接口和 MapProvider 地图服务提供者接口。

该类的主要出图方法是 getTileImage(TiledMapProviderBase.TileImageParameterparamTileImageParameter)。

  1. 如何扩展开发

用户可以继承 LocalTileProviderBase 抽象类,来扩展本地地图服务。

需要实现以下方法:

注意

  1. 配置和部署

将编译好的扩展类的 class 文件放到%SuperMap iServer_HOME%\webap\iserver\WEB-INF\classes 目录下(默认情况下没有 classes 目录,需要新建)或是编译好的 jar 包放到%SuperMap iServer_HOME%\webapp\ iserver\WEB-INF\lib\目录下,iServer 就可以使用扩展的服务提供者类,关于如何配置服务提供者,详见通过 XML 文件配置服务提供者

  1. 关于缓存

该类 cacheEnabled(),可以返回 true 或者 false 来设置是否使用缓存。

为 true 时,使用图片缓存,目前的图片缓存目录即地图服务提供者配置对象 MapProviderSetting.getOutputPath()目录,缓存路径为“\cache\地图名_图片宽度 x 图片高度\比例尺倒数\图片 x 索引\图片 y 索引.图片格式后缀”,同时,该类对访问的第三方地图服务也进行了缓存,缓存路径为“\cache\http\地图名_图片宽度 x 图片高度\比例尺倒数\图片 x 索引\图片 y 索引.图片格式后缀”。

扩展示例

本示例介绍通过继承自 LocalTileProviderBase 的 ArcGISExplodedCacheMapProvider 类来实现将本地的 ArcGIS Server 地图切片发布为 Supermap 地图服务的流程,你可以在%SuperMap iServer_HOME%/samples/code/DSSE/ArcGISExplodedCacheMapProviderSample 位置找到该示例的源代码。

注意:在通过 ArcGIS Server 进行切图的时候,选择的存储格式为”松散”的格式,分块格式选择 PNG8、PNG24、PNG32。

ArcGISExplodedCacheMapProvider 实现类代码如下:

ArcGISExplodedCacheMapProvider.java

ArcGISExplodedCacheMapProvider 类中 ArcGISExplodedCacheMapLayer 表示当前地图使用 ArcGIS 图层(扩展其它 provider 时,可以参考 ArcGISExplodedCacheMapLayer定义相应的 Layer)。

ArcGISExplodedCacheMapLayer 实现类代码如下:

ArcGISExplodedCacheMapLayer.java


ArcGISXMLParseTool 类用于提取 ArcGIS Server 切片目录的 conf.xml 文件和 conf.cdi 文件中的一些节点值。

conf.xml 文件结构如下图:

conf.cdi 文件结构如下图:

ArcGISXMLParseTool 实现类代码如下:

ArcGISXMLParseTool.java

ArcGISExplodedCacheMapProviderSetting 类,继承自 MapProviderSetting 类,用于扩展地图服务提供者配置,完成一些特定地图参数的设置。其中的 cachePath 表示地图切片路径、mapName 表示地图名。

ArcGISExplodedCacheMapProviderSetting 实现类代码如下:

ArcGISExplodedCacheMapProviderSetting.java

配置类使用扩展自 MapProviderSetting 的 ArcGISExplodedCacheMapProviderSetting 类,其中必须要配置<cachePath>切片路径、并且用户可以选择性配置<mapName>地图名,当用户未配置或配置的地图名为空时,地图名将采用默认值,配置如下:

<provider class="com.supermap.sample.serviceprovider.ArcGISExplodedCacheMapProvider" name="mapProvider-ArcGISExplodedCacheMap">

  <config class="com.supermap.sample.serviceprovider.ArcGISExplodedCacheMapProviderSetting">

    <cachePath>C:/arcgisserver/arcgiscache/China400/China400</cachePath>

      <mapName></mapName>

  </config>

</provider>

编译后的 Jar 放到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录。

新建一个使用 mapProvider-ArcGISMaps 的“地图服务组件”map-arcgis,发布为 rest、WMS 1.1.1 服务:

<component class="com.supermap.services.components.impl.MapImpl" enabled="true" interfaceNames="wms111,rest" name="map-arcgis" providers="mapProvider-ArcGISExplodedCacheMap">  

</component>

即可通过根 URI:http://<host>:<port>/iserver/services/map-arcgis/rest 访问地图 REST 功能。通过 http://<host>:<port>/iserver/services/map-arcgis/rest/maps/arcgismaps.ijs 访问地图(arcgismaps 为地图名,在 ArcGISExplodedCacheMapProvider 实现类中声明),结果如下:

 

 

扩展一个 TMSTilesMapProvider

本示例介绍通过继承自 ZXYTilesMapProvider 的 TMSTilesMapProvider 类来实现将本地的 TMS 地图切片发布为 Supermap 地图服务的流程,你可以在%SuperMap iServer_HOME%/samples/code/DSSE/TMSTilesMapProviderSample 位置找到该示例的源代码。

TMSTilesMapProvider 实现类代码如下:

package com.supermap.sample.serviceprovider;

import com.supermap.services.components.commontypes.Point2D;

import com.supermap.services.components.commontypes.Rectangle2D;

public class TMSTilesMapProvider extends ZXYTilesMapProvider {

    @Override

    protected int getTop(double y, Rectangle2D viewBounds, double tileResolution, int tileImageHeight) {

    return this.getTop(viewBounds.getBottom(), y , tileResolution, tileImageHeight);

}    

    @Override

    protected int getBottom(double y, Rectangle2D viewBounds, double tileResolution, int tileImageHeight) {

    return this.getBottom(viewBounds.getTop(), y, tileResolution, tileImageHeight);

}    

    @Override

    protected int getTopOrBottomTileIndex(double y, double topOrBottom, double tileHeight, boolean b, int tileImageHeight) {

        return this.getTileIndex(topOrBottom, y, tileHeight, b, tileImageHeight);

    }  

    @Override

    protected Point2D setTileOrigin(Rectangle2D bounds) {

    return new Point2D(bounds.getLeft(), bounds.getBottom());

    }

}

TMSTilesMapProviderSetting 类,继承自 ZXYTilesMapProviderSetting 类,用于扩展地图服务提供者配置,完成一些特定地图参数的设置。TMSTilesMapProviderSetting 实现类代码如下:

package com.supermap.sample.serviceprovider;

public class TMSTilesMapProviderSetting extends ZXYTilesMapProviderSetting{

private static final long serialVersionUID = 1L;

}

将编译好的扩展类的 class 文件放到 %SuperMap iServer_Home%\webap\iserver\WEB-INF\classes 目录下(默认情况下没有classes目录,需要新建),或将编译后的 Jar 放到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录下。

在 iserver-services.xml(位于%SuperMap iServer Java_HOME%/webapps/iserver/WEB-INF)配置服务提供者,配置如下:

<provider class="com.supermap.sample.serviceprovider.TMSTilesMapProvider" enabled="true" name="TMSTiles-test">

      <config class="com.supermap.sample.serviceprovider.TMSTilesMapProviderSetting">

        <filePath>D:/sample/TMSTile_file</filePath>

      </config>

</provider>

其中<filePath>为必须参数,表示 TMS 瓦片路径,路径需要写到 TMS 瓦片地图名的上一级。如,示例中TMS 瓦片存储路径为 D:/sample/TMSTile_file/<MapName>/<Z>/<X>/<Y> ,则 filePath 应为 D:/sample/TMSTile_file。

在 iserver-services.xml 中配置地图服务组件 TMSTiles-test,发布为rest服务:

<component class="com.supermap.services.components.impl.MapImpl" enabled="true" interfaceNames="rest" name="map-TMSTiles-test" providers="TMSTiles-test">  

</component>

即可通过根 URI:http://<host>:<port>/iserver/services/map-TMSTiles-test/rest 访问地图 REST 功能。通过 http://<host>:<port>/iserver/services/map-TMSTiles-test/rest/maps/test.leaflet 访问地图。