张畔涛 董寿银
【摘 要】在实际生产中经常遇到ArcGIS地理数据库需要转换坐标系,但该软件未对国内常用的四参数转换提供对应工具,只提供了三参数及七参数转换工具。针对该情况,本文基于ArcPy站点包开发了四参数转换工具,并应用到实际生产中,大大简化了ArcGIS地理数据库四参转换的流程。
【关键词】ArcPy;四参数;转换
0 引言
随着测绘行业的发展,我国使用的坐标系统也在不断的更新、精化。我国曾用过的坐标系统包括1954北京坐标系、1980西安坐标系和2000国家大地坐标系。目前很多已有的地理数据库的坐标系统是基于1980西安坐标系的,但在生产项目中多数要求提交的成果应为2000国家大地坐标系的地理数据库,为了使用已有的数据成果就涉及坐标系统的转换问题。目前很多的软件平台都提供了坐标的四参转换功能,如MapGIS等,但较为常用的ArcGIS平台却并未提供直接的四参转换功能。
ArcPy是一个ArcGIS中以成功的arcgisscripting模块为基础构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。该包提供了丰富纯正的 Python体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。
本文在分析目前地理数据库四参转换流程的基础上,在ArcGIS平台上利用ArcPy站点包开发了四参转换工具,并在实际生产中投入使用,大大简化了地理数据库转换的流程。
1 地理数据库转换流程分析
现以使用ArcGIS和MapGIS两个平台进行四参转换为例分析地理数据库的转换流程。
ArcGIS平台中虽然没有直接的四参转换工具,但提供了Spatial Adjustment工具可以完成四参转换,该工具中实际上是根据输入的同名点计算两个数据集之间的坐标转换参数,然后进行数据集的转换。流程如下:
a.从源数据集中选三个或三个以上的坐标作为控制点输入到LinkTable表的Xsource、Ysource列中。
b.根据四参数和控制点坐标手动计算出在目标坐标系中的坐标并输入到LinkTable表的Xdestination、Ydestination列中。
c.转换数据并保存。
MapGIS平台中提供了直接的四参转换工具,但不支持ArcGIS地理数据库的转换。需先转换为MapGIS支持的数据格式。流程如下:
a.将源数据集导入到MapGIS中,转换为其支持的wp、wl等格式。
b.利用坐标转换工具完成四参转换。
c.将转换后的数据导出为shape等ArcGIS支持的格式。
上述流程都不是输入四参数直接完成转换,本文将针对该情况改进用户的操作流程。
2 四参数转换原理及ArcPy实现思路
平面四参数转换模型的四个参数为:两个平移参数,一个旋转参数和一个尺度参数,坐标转换矩阵为:
X′=ΔX+k(Xcosα-Ysinα)Y′=ΔY+k(Xsinα+Ycosα)
其中X′、Y′为转换后的坐标,X、Y为原坐标系统下的坐标;ΔX、ΔY为平移参数,α为旧坐标轴到新坐标轴的旋转角度,以逆时针方向为正,顺时针方向为负;k为新坐标系统与旧坐标系统的缩放比例。
ArcGIS中支持的矢量数据类型FeatureClass包括点(PointGeometry)、线(Polyline)、面(Polygon)等,工具需对每种数据类型做出相应的处理。对线面等几何图形的转换实质是对线面上的各点坐标的转换,转换后的各点坐标重新组合出对应的几何图形。核心功能是对点坐标的处理。工具实现流程如下:
a.输入待转换要素数据。
b.判断待转换数据几何类型。如果是点要素,转入c,转入e;如果是其他类型要素,取出其中各要素图形,转入d,直至各要素图形转换完毕,转入e。
c.单点四参数转换。
d.取出该几何图形上的各点坐标,转入d,直至各点完成。
e.输出转换后要素数据。
其中,单点坐标转换实现的代码为:
def SinglePointConvert(point_x, point_y, deltax, deltay, m, alpha):
x = m*math.cos(alpha)*point_x-m*math.sin(alpha)*point_y+deltax
y = m*math.sin(alpha)*point_x+m*math.cos(alpha)*point_y+deltay
new_point = arcpy.Point(x, y)
return new_point
线要素转换实现的部分代码为:
if(desc.shapeType=="Polyline"):
rows = arcpy.UpdateCursor(output_feature_class)
for row in rows:
geo = row.getValue("SHAPE")
partCount = geo.partCount
#处理多部件
arrayAll=arcpy.Array()
for ipart in range(0, partCount):
array = geo.getPart(ipart)
arrayNew = PartPolylineConvert(array, delta_x, delta_y, m, theta)
arrayAll.add(arrayNew)
newPolyline = arcpy.Polyline(arrayAll)
row.Shape = newPolyline
rows.updateRow(row)
del row, rows
在ArcGIS中创建Toolbox并在其中添加脚本工具(对应的脚本文件即四参转换的脚本文件),脚本工具的参数包括输入输出路径、坐标转换需要的四参数等共六个参数。工具运行界面如图1所示。
图1 矢量数据四参数转换界面
3 总结
在分析实际生产过程中地理数据库四参转换流程的基础上,本文提出了基于ArcPy站点包完成ArcGIS该数据库转换的思路,并开发了该工具,简化了工作流程,提高了生产效率。
【参考文献】
[1]Programming ArcGIS 10.1 with Python Cookbook[M]. Packt Publishing Ltd.2013.
[责任编辑:汤静]