作者:Sniper
一、概述
扩展iServer实现坐标投影转换,就是调用iObjects java的投影转换的算法来实现点或点串的投影转换,并且扩展为iServer的一个服务。这样的好处是,消除了在高精度的要求下,使用iClient进行投影转换的算法和iObjects对数据集的投影转换算法不一致造成的误差。我们可以从前端发送请求,传入点坐标或点串坐标,iServer调用iObjects的算法进行投影转换后返回目标坐标的点或点串坐标。
二、实现过程
下面我们就来看看怎么调用iObjects的投影转换算法,怎么扩展为iServer的服务,以及怎么使用吧。
1、代码实现
首先我们在eclipse上创建一个java工程。并且引用%iServer_HOME%support\objectsjava\bin目录下所有的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包
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