arcpy投影(二)——基准面变换概念及参数、空间参考对象获取、变换关系获取方法梳理与解析(Spatial ...
时间:2023-04-03 21:07:01
arcpy从文件位置、文件意义、空间参考获取、转换关系查询、投影定义、自定义转换关系、投影转换等角度系统介绍投影,整理出:
arcpy投影(一)——prj、gtf文件定义、路径及分析(arcmap,arcpro)
arcpy投影(2)-梳理和分析基准面变换概念和参数、空间参考对象获取、变换关系获取方法(Spatial Reference、ListTransformations)
arcpy投影(三)——定义投影、地理变换关系自定义和投影变换Project_managemen(包括使用基准面/椭球体转换参数的方法,arcpro/arcmap)
第二篇是三篇文章:
本文介绍了投影和投影变化的基本概念Arcpro帮助文档及示例代码进行空间参照和转换关系获取和新建方的方法,并对注意事项和代码细节进行了解读。
一、坐标系、投影与变换
首先介绍两个基本概念,一是坐标系、投影与变换,二是地理基准面变换。坐标系、投影与变换是地图学中最基本的概念,可以查看书籍和帮助文档。
重点介绍一下 地理基准面变换 ,帮助文档中给出的解释:地理坐标系描述了如何将地球上的位置放置在假想的参考球体上。用角度单位(如度)在参考球体上分配坐标位置。地理坐标系不止一种,因为在不同的位置,每种坐标系都有不同的选择,即存在最为适合的参考椭球面。这种设计是非常必要的,因为地球实际上是一个不均匀的球体。变换是将图层的地理坐标系转换为与地图地理坐标系相匹配的计算,以确保所有对齐。由于变化,数据不会发生变化。
我们应该准确理基准面变换是原坐标系和目标坐标系地理基准面不同时需要进行的一步操作。也可以理解,当两个坐标系统采用不同的椭球体时,需要为椭球体的变换提供可用的函数,以确保数据能够正确对齐计算。 例如:您将数据从CGS2000转换为CGS2000 3 degree 108E,两个投影都使用相同的地理基准面,因此在转换过程中不需要改变基准面,当您将CGS2000数据转换为WGS这个基准面必须在84面。
二、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()
③“工厂代码”
通过工厂代码来进行创建要求改投影信息对应的代码在工厂代码文档中可查,文档链接见文末附件。
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直接查看投影信息对应的工厂代码):
地理坐标工厂代码
投影坐标工厂代码