新资源的扩展 |
作为示例,这里扩展空间分析功能,实现一个特殊的缓存区分析功能,用于获取指定线 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)。