新资源的扩展

发送反馈


作为示例,这里扩展空间分析功能,实现一个特殊的缓存区分析功能,用于获取指定线 L1的缓冲区,L1的端点坐标为:(116.40,39.97)、(116.40,40.00)、(116.38,40.00)

实现<root_uri>/spatialanalyst/geometry/mybuffer 资源,通过对该资源执行 POST 请求来实现该缓冲区分析,设计请求体参数为一个 Double 的数字,表示缓冲半径。分析结果为 L1缓存半径为指定数值的圆头缓冲区。

注意:分析存储结果保存在 iServer SDK 提供的对象存储仓库中,做为 mybuffer 资源的子资源,通过对 URI <root_uri>/spatialanalyst/geometry/mybuffer/{id}执行 GET 请求进行获取。

对于扩展支持 POST 请求的资源,推荐使用 SuperMap iServer 提供的 com.supermap.services.rest.resources.JaxAlgorithResultSetResource 基类进行扩展。

详细的示例请参见示例代码: %SuperMap iServer_HOME%\samples\code\ExtendExist_JSR\MyBufferResultsResource.java。

资源实现

本例中设计的 POST 请求的消息体参数类型为一个 Double 的数值。编写一个 MyBufferResultsResource 类如下:

@Path("/spatialanalyst/geometry/mybuffer")

public class MyBufferResultsResource extends JaxAlgorithResultSetResource<Double> {

……

}

@Path 指定 mybuffer 资源的 URI,从资源根目录算起,在 iServer 中,基于 JAX-RS 框架实现的 REST 资源根目录为:http://<server>:<port>/iserver/services/<servicecomponent>/<serviceinterface>,其中 servicecomponent 是 iServer 三层体系结构中的服务组件,serviceinterface 是该服务组件绑定的服务接口(参见:服务的 URI 设置),restjsr 是默认的 JAX-RS REST 服务接口。本示例预期扩展空间分析功能,会用到空间分析服务组件。

实现抽象方法如下:

/**

 * 本算法名称,用于存取算法结果。

 */

protected String getAlgorithmName() {

return "MyBuffer";

}

/**

 * 实现父类的 runArithmetic ,给出客户端发送 HTTP POST 方法时,需要处理的业务逻辑

 * 父类的 Post 方法将会调用该接口。

 */

protected Object runArithmetic(Double leftBufferDistance) {

// 构建缓冲分析 参数,左缓冲半径为 leftBufferDistance,右缓冲半径跟左缓冲半径一致,缓冲类型为圆头缓冲

BufferAnalystParameter bufferParameter = this.createGeometryBufferPostParameter(leftBufferDistance);

//构建线几何对象,作为创建缓冲区的源。(端点依次为:(116.40,39.97)、(116.40,40.00)、(116.38,40.00))

Geometry sourceGeometry = this.createSourceGeometry();

// 获取缓冲分析业务组件。

SpatialAnalyst spatialAnalyst = null;

// 从接口上下文中取出所有的空间分析业务组件。

List<SpatialAnalyst> spatialAnalystList = this.getInterfaceContext().getComponents(SpatialAnalyst.class);

// 默认情况下 接口上下文中只会有一个空间分析业务组件。

// 当将空间分析业务组件和 REST 接口绑定时,那么对应的 REST 服务的接口上下文中有且只有一个空间分析业务组件。

// 当将业务组件集合与 REST 接口绑定时,那么对应的 REST 服务的接口上下文中可能会有零个或多个空间分析业务组件。

spatialAnalyst = spatialAnalystList.get(0);

// 缓冲分析。

return spatialAnalyst.buffer(sourceGeometry, bufferParameter, new GeometrySpatialAnalystResultSetting()).resultGeometry;

}

 

其中,createGeometryBufferPostParameter 和 createSourceGeometry 为创建参数,代码如下:

    /**

     *  根据左侧缓冲距离构建缓冲分析参数,用于缓冲区分析

     *  该缓冲分析参数中,源几何对象固定为一条线(端点依次为:(116.40,39.97)、(116.40,40.00)、(116.38,40.00)),缓冲区端点固定为圆头

     *  右侧缓冲区距离跟左侧缓冲区距离一致。

     * @param leftBufferDistance 左侧缓冲距离

     * @return 特定的缓冲区分析参数。

     */

    private BufferAnalystParameter createGeometryBufferPostParameter(double leftBufferDistance) {

        BufferAnalystParameter parameter = new BufferAnalystParameter();

        // 缓存区端点类型为圆头

        parameter.endType = BufferEndType.ROUND;

        // 左侧缓存距离

        parameter.leftDistance = new BufferDistance(leftBufferDistance);

        // 右侧缓冲距离和左侧缓存距离一致 。

        parameter.rightDistance = new BufferDistance(leftBufferDistance);

        return parameter;

    }

    

 // 构建线几何对象(端点依次为:(116.40,39.97)、(116.40,40.00)、(116.38,40.00))

    private Geometry createSourceGeometry() {

        Geometry sourceGeometry = new Geometry();

        sourceGeometry.type = GeometryType.LINE;

        sourceGeometry.points = new Point2D[3];

        sourceGeometry.points[0] = new Point2D(116.40,39.97);

        sourceGeometry.points[1] = new Point2D(116.40,40.00);

        sourceGeometry.points[2] = new Point2D(116.38,40.00);

        return sourceGeometry;

    }

服务组件从服务接口上下文中获取,为获取正确的服务接口上下文,还需要继承父类(JaxAlgorithResultSetResource)的构造函数:

/**

* 资源实现类的构造函数。

* servletConfig 和 httpRequest 参数将由 Jax-rs 运行时在处理请求时动态注入。

* @param servletConfig  全局唯一的 Servlet 配置

*/

public MyBufferResultsResource(@Context ServletConfig servletConfig) {

//如果期望在资源中获取空间分析业务组件,那么需要重载父类的相应构造方法。

super(servletConfig);

}

POST 请求一般是创建一个子资源,这里是进行缓冲区分析,创建一个结果资源。为获取算法结果,我们实现一个支持 GET 方法的子资源,同样写在 MyBufferResultsResource 中:

/**

 *  返回指定的分析结果。

 * @param id 分析结果的 ID。

 * @return 缓冲区面对象

 */

@GET

@Path("{id}")

public Geometry getBufferResultGeometry(@PathParam("id") String id) {

// 得到对象存储仓库,缓存分析结果就存储在该仓库中。

// 该仓库中有多个子仓库,以键值来区分, 这里的键值是 MyBuffer

TempObjRepository objRepository = this.getRepository();

return (Geometry) objRepository.getArithResult(ALGORITHNAME, id);

}

 

其中@GET 表示本方法对应 GET 请求,@Path("{id}")是结果资源的 URI,从父资源的 URI 算起,这里从 mybuffer 资源的 URI 算起。{id}跟@PathParam("id") String id 对应,表示将 URI {id}位置的值作为参数传递给 String id。当 GET 请求 URI 为<mybuffer_uri>/12时,将会获取 ID 为12的分析结果。

至此,实现完毕,父资源<root_uri>/spatialanalyst/geometry/mybuffer 支持 POST 请求,执行 POST 请求返回响应中会包含子资源的 URI,子资源<root_uri>/spatialanalyst/geometry/mybuffer/{id}支持 GET 请求。

注意,这里没有使用@Template 标签,默认地、资源支持 xml、json、rjson 的 HTTP 表述格式。mybuffer 默认支持 JSON 消息体格式。

添加配置文件

建立资源配置文件 MyBufferAnalystRest.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>

<resources>

  <resource>

    <configID>mybuffer</configID>

    <implementClass>com.supermap.sample.extend.MyBufferResultsResource</implementClass>

  </resource>

</resources>

建立 JAX-RS 资源配置文件,本示例是对空间分析模块的扩展,所以本配置文件名称应与空间分析模块配置文件名称一致,为 spatialAnalystRest(参见:功能模块、模块配置文件对应表),内容如下:

resourceFiles=MyBufferAnalystRest.xml

可以将 Mybuffer 资源实现类编译结果以及配置文件打成一个 Jar 包(参见:extendexist_jsr.jar),放在%SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 下,重启 SuperMap iServer 服务即可。

MyBufferAnalystRest.xml 位于 Jar:///MyBufferAnalystRest.xml 位置,SpatialAnalystRest 位于 Jar:///META-INF/extensions/services/rest/SpatialAnalystRest 位置

资源访问

重启 SuperMap iServer 服务后,http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr 是一个已有的空间分析模块,访问新扩展的 MyBuffer 资源,对 URI:http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst/geometry/mybuffer.rjson 执行 POST 请求,请求体为“4”:

POST http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst/geometry/mybuffer.rjson HTTP/1.1

Content-Length: 1

Content-Type:application/json

4

获取的 rjson 格式的资源描述如下:

{

  "newResourceID": "4",

  "newResourceLocation": "http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst/geometry/mybuffer/1",

  "postResultType": "CreateChild",

  "succeed": true

}

其中的 newResourceLocation,即为子资源(算法结果的地址),对该 URI 执行 GET 请求,获取 rjson 格式的表述(通过浏览器访问 URI:http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst/geometry/mybuffer/1.rjson 即可),获取结果如下

{

  "id": 0,

  "parts": [11],

  "points": [

    {

      "x": 112.38,

      "y": 40

    },

    {

      "x": 113.06183262486397,

      "y": 37.76622174990826

    },

    {

      "x": 115.86321759723121,

      "y": 36.006180547492384

    },

    {

      "x": 119.03181215029919,

      "y": 36.95776415174084

    },

    {

      "x": 120.4,

      "y": 39.97

    },

    {

      "x": 120.4,

      "y": 40

    },

    {

      "x": 119.22842712474619,

      "y": 42.82842712474619

    },

    {

      "x": 116.4,

      "y": 44

    },

    {

      "x": 116.38,

      "y": 44

    },

    {

      "x": 113.55157287525381,

      "y": 42.82842712474619

    },

    {

      "x": 112.38,

      "y": 40

    }

  ],

  "style": null,

  "type": "REGION"

}

结果为一个面几何对象(com.supermap.services.components.commontypes.Geometry)。