arcpy投影这一个专题从文件位置、文件含义、空间参照获取、转换关系查询、投影定义、自定义转换关系、投影变换这几个角度上系统的进行了介绍,整理出了:
arcpy投影(一)——prj、gtf文件定义、路径及解析(arcmap,arcpro)
arcpy投影(二)——基准面变换概念及参数、空间参考对象获取、变换关系获取方法梳理与解析(Spatial Reference、ListTransformations)
arcpy投影(三)——定义投影、地理变换关系自定义和投影变换Project_managemen(含基准面/椭球体转换参数使用方法,arcpro/arcmap)
三篇文章,本文为第二篇:
本文对投影和投影变化中的基本概念进行了介绍,同时基于Arcpro帮助文档及示例代码进行空间参照和转换关系获取和新建方的方法,并对注意事项和代码细节进行了解读。
一、“坐标系、投影和变换”、“地理基准面变换”基本概念
首先介绍两个基本概念,一是“坐标系、投影和变换”,二是“地理基准面变换”。“坐标系、投影和变换”是地图学中要学习最基本概念,可以查看书籍和帮助文档。
我们重点介绍一下 “地理基准面变换” ,帮助文档中给出的解释:地理坐标系描述了如何将地球上的位置放置在一个假想的参考球体上。使用角度单位(例如度)来在一个参考球体上分配坐标位置。地理坐标系不止一种,因为在不同的位置,每种坐标系都有不同的选择,即存在最为适合的参考椭球面。这种设计十分必要,原因在于地球实际上是一个凹凸不平的球体。变换是在地图绘制时将图层的地理坐标系转换为与地图的地理坐标系相匹配的计算,可确保全部对齐。数据不会由于变换发生更改。
我们应当准确把握的是:地理基准面变换是在原始坐标系和目标坐标系的地理基准面不同的情况下需要进行的一步操作,也可以理解为当两个坐标系统采用不同的椭球体时,需要给椭球体的变换提供一个可用的函数,从而确保数据可以进行正确的对齐计算。 例如:你将数据从CGS2000转换为CGS2000 3 degree 108E,两个投影均采用同一个地理基准面,因此该转换过程不需要进行基准面变换,而当你将CGS2000的数据变换为WGS84时,则必须进行这个基准面的变换。
二、Spatial Reference object及Transformations参数
介绍完上述的两个基本概念,我们需要进一步的了解在进行投影定义或者坐标转换时都需要用到空间参考对象(Spatial Reference object),以及在进行基准面变换时需要用到转换关系参数(Transformations)。
前者是一个对象,后者为字符串类型,在进行基准面转换时,给定转换关系对应的字符串,软件会自己到默认路径下进行文件的查找和提取,这个路径在上一篇文章arcpy投影(一)——prj、gtf文件定义、路径及解析(arcmap,arcpro)中进行了介绍。
三、SpatialReference对象获取及创建方法
该对象的获取方法可以采用 “直接对要素描述”进行获取,也可以通过“.prj文件”、“投影名称”、“工厂代码”以及“WKT字符串”来进行创建。[需要注意的是:当投影关系中存在地方坐标系时,“投影名称”或“工厂代码”这两种方式使用起来会存在一些麻烦 ]。 如果在定义投影时需要使用三维坐标系统即指定高程基准,则可以通过对vcs参数的配置来进行高程基准的选择,具体使用方法可参照[帮助文档]
(一)“直接对要素描述”进行获取
使用 Describe spatialReference 属性从现有数据集或要素类访问 SpatialReference 对象,这个方法还是比较常用且好用的。若数据为投影坐标而想要访问获取地理坐标的信息,则可以通过GCS属性进行获取。
dataset = "c:/data/landbase.gdb/Wetlands"
spatial_ref = arcpy.Describe(dataset).spatialReference #通过数据集获取当前空间参考信息
同时还可以通过SpatialReference对象的name属性检测要素是否具有空间参考信息:
import arcpy
arcpy.env.workspace = "c:/base/base.gdb"
fc = "River" #数据
spatial_ref = arcpy.Describe(fc).spatialReference #通过要素类获取当前空间参考信息
if spatial_ref.name == "Unknown":
print("{} has an unknown spatial reference".format(fc))
(二)创建空间参考对象
语法:SpatialReference ({item}, {vcs}, text)
①“.prj文件”
该方式是非常灵活好用的一种方法,直接通过指认文件所在的路径可以提高prj文件位置的灵活性。
sr = arcpy.SpatialReference("c:/coordsystems/Xian 1980.prj")
②“投影名称”
通过投影名称来进行创建要求投影名称是arcpro或者arcmap软件可查的,即在对应路径下或者在软件内部已存在改名称。
sr = arcpy.SpatialReference("Xian 1980")
③“工厂代码”
通过工厂代码来进行创建要求改投影信息对应的代码在工厂代码文档中可查,文档链接见文末附件。
sr = arcpy.SpatialReference(4610)
④“WKT字符串”
a.创建
# Geographic Coordinate system "WGS 1984" (factory code=4326)
wkt = "GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],\
PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]];\
-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119522E-09;\
0.001;0.001;IsHighPrecision"
sr = arcpy.SpatialReference(text=wkt)
b.loadFromString方法加载
wkt = 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],\
PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]];\
-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119522E-09;\
0.001;0.001;IsHighPrecision'
sr = arcpy.SpatialReference()
sr.loadFromString(wkt)
( exportToString 方法可用于导出空间参考的 WKT 字符串表示)
四、ListTransformations函数的使用
ListTransformations是在存在投影基准面变换的情况下,通过指定原始坐标系和目标坐标系,进行有效变换方法的检索,返回值为包含有效变换方法的列表。如果返回结果列表为空,则说明系统中不包含这两个不同基准面的转换关系,需要自定义或者拷贝。 对于某个特定的地理区域,可以使用区域范围来缩小有效变换方法列表的范围。
语法:ListTransformations (from_sr, to_sr, {extent}, {vertical}, {first_only})
import arcpy
from_sr = arcpy.SpatialReference('WGS 1984') #原始坐标系统
to_sr = arcpy.SpatialReference('NAD 1927 StatePlane California VI FIPS 0406')#目标坐标系统
extent = arcpy.Extent(-178.217598182, 18.9217863640001,
-66.969270909, 71.4062354550001)
transformations = arcpy.ListTransformations(from_sr, to_sr, extent) #返回字符串列表结果
附件:
投影工厂代码文件(也可以通过arcmap或者pro直接查看投影信息对应的工厂代码):
地理坐标工厂代码
投影坐标工厂代码