arcpy投影这一个专题从文件位置、文件含义、空间参照获取、转换关系查询、投影定义、自定义转换关系、投影变换这几个角度上系统的进行了介绍,整理出了:
arcpy投影(一)——prj、gtf文件定义、路径及解析(arcmap,arcpro)
arcpy投影(二)——基准面变换概念及参数、空间参考对象获取、变换关系获取方法梳理与解析(Spatial Reference、ListTransformations)
arcpy投影(三)——定义投影、地理变换关系自定义和投影变换Project_managemen(含基准面/椭球体转换参数使用方法,arcpro/arcmap)三篇文章,本文为第三篇:
一、定义投影
(一)基本概念
定义投影的工具在我们的日常操作中多用于给具有未知坐标系(即,在数据集属性中坐标系为“未知”)的数据集或要素类指定一个已知坐标系,该工具同样可以对已存在坐标系统信息的数据进行覆盖更新,将具有已知坐标系的数据集输入此工具时,此工具将显示警告信息,但仍将成功执行。
(二)注意事项
①使用该工具可以将数据的坐标信息修改为指定的坐标系统,但当用户无法确定当前数据是否能与指认坐标系信息正确对应时,定义投影的结果存在不确定性,若指认的坐标系统存在错误,则实际的数据投影是存在错误的,在后续操作中可能会出现问题,这是要素考是否是这一环节出现的问题。例如数据的坐标值为经纬度,而用户直接定义投影坐标系,则会出现坐标数值与投影坐标系统范围间的冲突,从而无法达到预期效果,需要注意。 ②该工具是直接修改数据的坐标系信息,而不是新建一个要素,因此使用前应考虑好数据备份的问题。 ③地理数据库要素数据集中的所有要素类将使用同一个坐标系。对于地理数据库数据集而言,应在其创建时确定坐标系。数据集包含要素类之后,其坐标系将无法更改。
(三)使用方法
语法:arcpy.DefineProjection_management(in_dataset, coor_system) 定义投影方法的参数较为简单,仅包含“输入数据”和“目标坐标系”两个参数:①in_dataset 输入数据是需要进行投影定义的数据集或要素类,数据类型可以是FeatureClass/Layer/Geodataset;②coor_system 目标坐标系是需要定义给要素的坐标系,有效值可以是SpatialReference对象、.prj文件或者WTK字符串(这部分不清楚的可以查看第二篇文章arcpy投影(二)——基准面变换概念及参数、空间参考对象获取、变换关系获取方法梳理与解析(Spatial Reference、ListTransformations))
使用示例如下:
import arcpy
arcpy.env.workspace = "C:/data" # 设置工作空间
in_dataset = "citylim_unk.shp" #"选择需要进行投影定义的要素"
# 获取目标要素的空间参考信息,也可以直接通过名称、prj文件、WTK字符串进行获取
dsc = arcpy.Describe("citylim_utm11.shp")
coord_sys = dsc.spatialReference
arcpy.DefineProjection_management(in_dataset, coord_sys) # 运行工具
二、投影变换
(一)基本概念
投影变换时将空间数据从一种坐标系投影到另一种坐标系的过程,该过程可以是:①从地理坐标系变换到投影坐标系、②从地理坐标系A变换到地理坐标系B,③从投影坐标系A变换到投影坐标系B。 ②和③均有可能存在两种坐标系统的基准面不同的情况,需要进行基准面的转换,该工具中也提供了基准面转换关系的参数输入,在后面的文章中我们也会进行详细介绍。
(二)注意事项
①该工具的地理变换参数是可选参数。 当不需要地理变换或基准面变换时,参数中不会出现下拉列表,并且参数为空。 当需要变换时,将会基于输入基准面和输出基准面生成一个下拉列表,并会选择一个默认变换。(例如,从 GCS2000 投影到 GCS2000_3_degree_108E 时不需要地理变换,因为输入坐标系和输出坐标系都具有 GCS2000 基准面。 但是,从 GCS2000 投影到 WGS_1984_UTM_Zone_12N 时则需要地理变换,因为输入坐标系使用的是GCS2000 基准面,而输出坐标系使用的是 WGS_1984 基准面。可以使用工具进行测试,输入数据和目标坐标系后,若列表中不自动弹出变换关系,则需要通过Create Custom Geographic Tramsformation工具来进行自定义。 提示:变换是双向的。 例如,如果将数据从 WGS 1984 转换为 NAD 1927,可以选取一个名为 NAD_1927_to_WGS_1984_3 的变换,然后此工具即可正确应用它。) ②空间范围的问题,在定义投影中我们已经讲到每一个投影都是有他对应的坐标范围的,如果输入数据的坐标值与他所带的空间参照信息之间存在冲突,则在运行本工具时常常会报出“Error 999999执行函数出错 invalid extent for output coordinate system”的错误,这是应当考虑输入数据是否存在上述问题。 ③关于输出数据,应当指出路径和数据名称,不支持 in_memory 工作空间作为编写输出数据集的位置。 ④如果输入的要素类或数据集具有“未知”或未指定的坐标系,可以使用输入坐标系参数指定输入数据集的坐标系。 这样,无需修改输入数据就可以指定数据的坐标系(当输入数据为只读格式时,可能无法修改)。 也可以使用定义投影工具永久性地为该数据集指定一个坐标系。 ⑤此工具的输入不能是 Coverage、VPF Coverage、栅格数据集和栅格目录。 使用投影栅格工具可以对栅格数据集进行投影。 上述四点注意事项是在常规使用中需要注意点,除此之外想要继续深入的了解可以查看投影变换官方帮助文档。
(三)参数说明
语法:arcpy.Project_management(in_dataset, out_dataset, out_coor_system, {transform_method}, {in_coor_system}, {preserve_shape}, {max_deviation}, {vertical}) 本工具中主要包含 “输入数据”、“输出数据”、“输出坐标系统”三个必填参数以及“变换方法”、“输入坐标系统”、“保留形状”、“最大偏移偏差”、“垂直参数”五个可选参数。在当输入数据和输出坐标系统间存在基准面不相同的情况是,“变换方法”参数为必填参数。本文中针对该工具的常规应用场景,主要对“输入数据”、“输出数据”、“输出坐标系统”、“变换方法”、“输入坐标系统”五个参数进行详细介绍,其他参数可参见帮助文档。 ①in_dataset “输入数据”:要投影的要素类、要素图层、要素数据集、场景图层或场景图层包,数据类型可以是:Feature Layer; Feature Dataset; Scene Layer; Building Scene Layer; File。 ②out_dataset “输出数据”:将要写入结果的输出数据集(需要提供路径和要素名称),数据类型可以为:Feature Class; Feature Dataset; File。 ③out_coor_system “输出坐标系统”:有效值可以是 SpatialReference 对象、扩展名为 .prj 的文件或WTK字符串表达形式。 ④transform_method “变换方法”:用于在两个地理坐标系或基准面之间对数据进行转换,这个参数的数据类型为字符型。输入和输出坐标系具有不同的基准面时需要此可选参数。 可以使用arcpy.ListTransformations 方法进行检索,或者指定变换关系的名称,名称需要与转换关系gtf文件的名称一致。若不存在对应的转换关系,则需要通过工具进行自定义。 ⑤in_coor_system “输入坐标系统”:输入要素类或数据集的坐标系。 当输入具有未知或未指定的坐标系时,可在不修改输入数据的情况下指定数据的坐标系(不适用于输入为只读格式的情况)。类型同输出坐标系。
(四)地理投影变化的自定义
①椭球体不同带来的问题
假设我们直接使用Project工具将wgs84坐标系变换为CGS2000坐标系,如图1所示,在我输入完几个必填参数后,由于椭球体不同,此时地理转换关系前面就出现了绿点,这个参数变成了必选参数,这是由于wgs84使用的是D_WGS_84椭球体而cgs2000使用的是D_China_2000椭球体(如图2、图3所示)。
图1 直接使用projec工具进行处理
图2 wgs84地理坐标系的参数信息
图3 cgs2000地理坐标系的参数信息
②自定义变换关系及文件生成
在project工具中,地理变换关系参数没有被识别出来,说明该gtf文件不存在,这个时候就需要我们使用自定义工具来进行自定义,工具位置如图4,点击工具后按照图5进行参数设置,(由于我们的目标坐标系是CGS2000,参数尚未开放,因此我这里直接将转换参数设置为0,0,0进行演示,如果需要这个参数可以向有关部门申请或者作为教育科研使用的情况下通过软件进行参数反算,这里不做赘述)。运行工具后我们就可以在对应路径下找到gtf文件(图6),arcpro工具基本一致,无论是map还是pro都会在路径下生产gtf文件。 此时我们再使用project时,即可看到软件自动识别到了我们刚刚自定义的转换关系(图7)
图4 自定义地理变换关系的工具位置
图5 自定义地理变换关系的工具的参数设置
图6 自定义地理变换关系的工具执行后生成的gtf文件
图7 定义转换关系后使用projec工具进行处理
(五)python实现
这里我们利用arcpro所带arcpy的python3.6版解释器作为我们项目的解释器,实现投影变换操作,2.7同理:
图8 python解释器
代码如下:
import arcpy
arcpy.env.workspace = "D:/数据/POI及旅游分析数据/城市道路分析.gdb" #设置工作空间
if __name__ =='__main__':
in_fc = "road84" #指定输入数据
out_coor_system = "D:/数据/POI及旅游分析数据/China Geodetic Coordinate System 2000.prj" #通过prj文件指定输出坐标系
Geo_Trans = "WGS84_TO_CGS2000" #指定转换关系,注意一定要在对应路径下存在同名gtf文件
out_fc = "D:/数据/POI及旅游分析数据/城市道路分析.gdb/road_cgs2000" #给出输出路径和文件名,一定要加上路径
arcpy.Project_management(in_fc,out_fc,out_coor_system,Geo_Trans) #执行
反复强调,需要特别注意的是: 如果你是使用的arcpro的arcpy则需要保证转换关系文件在arcpro对应的路径下,如果你是使用的arcmap的arcpy则需要保证转换关系文件在arcmap对应的路径下,否则在运行时就会反复出现“无效参数00365”的错误。不知道如何确认的可以查看arcpy投影(一)——prj、gtf文件定义、路径及解析(arcmap,arcpro)