扩展iServer实现坐标投影转换

作者:Sniper

一、概述

扩展iServer实现坐标投影转换,就是调用iObjects java的投影转换的算法来实现点或点串的投影转换,并且扩展为iServer的一个服务。这样的好处是,消除了在高精度的要求下,使用iClient进行投影转换的算法和iObjects对数据集的投影转换算法不一致造成的误差。我们可以从前端发送请求,传入点坐标或点串坐标,iServer调用iObjects的算法进行投影转换后返回目标坐标的点或点串坐标。

二、实现过程

下面我们就来看看怎么调用iObjects的投影转换算法,怎么扩展为iServer的服务,以及怎么使用吧。

1、代码实现

首先我们在eclipse上创建一个java工程。并且引用%iServer_HOME%support\objectsjava\bin目录下所有的jar包。如下:
引用外部jar包
接下来在代码中导入需要用到的包。

import com.supermap.data.CoordSysTransMethod;
import com.supermap.data.CoordSysTransParameter;
import com.supermap.data.CoordSysTranslator;
import com.supermap.data.GeoCoordSys;
import com.supermap.data.GeoCoordSysType;
import com.supermap.data.GeoSpatialRefType;
import com.supermap.data.Point2D;
import com.supermap.data.Point2Ds;
import com.supermap.data.PrjCoordSys;
import com.supermap.data.PrjCoordSysType;
import com.supermap.data.PrjParameter;
import com.supermap.data.Projection;
import com.supermap.data.ProjectionType;
import com.supermap.data.Unit;

我们以单个点在3857坐标系和一个EPSG为5186的自定义坐标系之间互相转换为例。
下面来看一下具体的转换代码:
1)获取传入的点坐标信息

public String transform(String a, String b, String m){
	Point2D[ ] pts = { new Point2D( Double.parseDouble( a ), Double.parseDouble( b ) ) };
	Point2Ds pt = new Point2Ds( pts );
}

这里传入的a和b为点的x坐标和y坐标,m为标识符,m为true时是从3857转换到5186,m为false时是5186转换到3857。

2)设置3857坐标系参数

// 3857
PrjCoordSys spj = new PrjCoordSys( );
spj.setCoordUnit( Unit.METER );
GeoCoordSys geoCoordSys = new GeoCoordSys( );
geoCoordSys.setType( GeoCoordSysType.GCS_WGS_1984 );
geoCoordSys.setCoordUnit( Unit.DEGREE );
geoCoordSys.setGeoSpatialRefType( GeoSpatialRefType.SPATIALREF_EARTH_PROJECTION );
spj.setGeoCoordSys( geoCoordSys );
spj.setType( PrjCoordSysType.PCS_SPHERE_MERCATOR);

因为3857是常用的坐标系,iDesktop中本来就支持这个坐标系,所以坐标系参数不用设置太详细。
其中的具体参数设置可以参考iObjects java的API。

3)设置5186坐标系参数

//5186
PrjCoordSys tpj = new PrjCoordSys(PrjCoordSysType.PCS_USER_DEFINED);
Projection projection = new Projection( ProjectionType.PRJ_TRANSVERSE_MERCATOR);
tpj.setProjection( projection );
tpj.setCoordUnit( Unit.METER );

GeoCoordSys geoCoordSys_ = new GeoCoordSys( );
geoCoordSys_.setType( GeoCoordSysType.GCS_GRS_1980 );
geoCoordSys_.setCoordUnit( Unit.DEGREE );
geoCoordSys_.setGeoSpatialRefType( GeoSpatialRefType.SPATIALREF_EARTH_PROJECTION );
tpj.setGeoCoordSys( geoCoordSys_ );

PrjParameter parameter = new PrjParameter( );
parameter.setAzimuth( 0 );
parameter.setCentralParallel( 38 );
parameter.setFalseEasting( 200000 );
parameter.setFalseNorthing( 600000 );
parameter.setFirstPointLongitude( 0 );
parameter.setScaleFactor( 1 );
parameter.setSecondPointLongitude( 0 );
parameter.setCentralMeridian( 127 );
parameter.setStandardParallel1( 0 );
parameter.setStandardParallel2( 0 );
tpj.setPrjParameter( parameter );

System.out.println( tpj.toXML( ) );

5186坐标系是自定义坐标系,所以需要手动设置所有的坐标系参数。可以在iDesktop中将该坐标系设定好,然后导出成xml文件,在这里可以将代码中定义好的坐标系对象在控制台输出成xml格式和iDesktop导出的对比,如果完全一样,那说明参数没问题。

4)坐标转换

switch ( m )
{
	case "true":
		CoordSysTranslator.convert( pt, spj, tpj, new CoordSysTransParameter( ),
				CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION );
		break;
	default:
		CoordSysTranslator.convert( pt, tpj, spj, new CoordSysTransParameter( ),
				CoordSysTransMethod.MTH_GEOCENTRIC_TRANSLATION );
		break;
}
Point2D[ ] pt2D = pt.toArray( );
String resultString = "";
for ( Point2D ptjson : pt2D )
{
	resultString += ptjson.toString( );
}
return resultString;

如果传入的m为true的话,就将3857坐标系转换为5186坐标系,如果不为true,则反之。
转换完成后以字符串的形式输出结果。

2、部署扩展服务

相信大家也发现了,这代码写的也太简单了吧!只是写了一个类,调用iObjects的接口将传入的坐标经过投影转换然后输出结果,这怎么能作为一个服务呢?
没错,就是这么简单。下边的过程我们不需要再写一句代码了。接下来我们就来看看iServer的发布领域服务组件为 REST 资源:

什么是领域空间信息服务?
SuperMap iServer 将空间服务分为两类,一类是 SuperMap iServer 内置提供的通用空间服务(简称 GSS),它主要包括3D 等,第二类是用户根据行业特定的业务逻辑,自行构建出的与空间信息相关的领域空间信息服务(简称 DSS),例如特定于气象行业应用的风向符号标制图服务等。尽管是用户自定义的服务,但是 SuperMap iServer 为用户开发 DSS 提供灵活、敏捷的服务组件开发框架以及服务组件运行机制,用户开发的服务组件可以利用 SuperMap iServer 提供的内置 GIS 服务模块结合业务逻辑进行 DSS 开发,还可以将 DSS 在 SuperMap iServer 服务框架中轻松的进行集成。

那么具体怎么将我们的代码扩展到iServer中呢?
1)将proTrans.java导出为jar包
导出为jar包
2)把proTrans.jar放在iServer目录下webapps\iserver\WEB-INF\lib下
这里写图片描述
3)修改%iServer_HOME%\webapps\iserver\WEB-INF\iserver-services.xml配置文件,添加领域服务组件。
修改配置文件

3、使用方法

这样我们的扩展服务就已经部署好了。下面启动iServer,访问领域服务。
领域扩展服务
领域扩展服务
执行结果:
执行结果
同时我们也可以截取这个网络请求,在客户端发GET请求执行相关的操作。
网络请求

三、总结

到目前为止,大家应该都对iServer的扩展有了一个简单的认识,并且也可以实现坐标投影转换的扩展。但是这个示例还有很多可以扩展的地方,比如可以直接读取iDesktop导出的坐标系xml文件,实现任意两个坐标系之间的转换,不需要修改代码。欢迎大家在评论中交流。

另:附上本示例的jar包以及源码:http://download.csdn.net/detail/supermapsupport/9781668

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值