GDAL投影转换/坐标偏移笔记

1.OSR

#               OSR(矢量数据投影)
#作用:投影坐标之间转换、地理坐标和投影坐标之间转换
#可用于几何对象和点(点属于几何对象)
from osgeo import gdal 
import osr
peters_sr = osr.SpatialReference()
peters_sr.ImportFromProj4('...')
ct = osr.CoordinateTransformation(web_mercator_sr, peters_sr)
#world对象为web_mercator_sr投影,但没有分配srs
world.Transform(ct)
#对几何对象的转换
ct.TransformPoint(x, y)
#对点的转换

#如果几何对象分配有srs,转换方法如下
world.TransformTo(web_mercator_sr)

#读取投影的地理基准,用于和地理坐标进行转换
geosrs = peters_sr.CloneGeogCS() 

2.PROJ

#                PROJ(矢量数据投影)
#作用:投影坐标之间转换、地理坐标和投影坐标之间转换
import pyproj
utm_proj = pyproj.Proj('+proj=utm +zone=31 +ellps=WGS84')
x, y = utm_proj(2.294, 48.858)  #地理坐标转化为投影坐标
x1, y1 = utm_proj(x, y, inverse=True)  #逆变换
wgs84 = pyproj.Proj('')
nad27 = pyproj.Proj('')
x, y = pyproj.transform(wgs84, nad27, 580744, 4504695) #投影坐标之间转换

3.栅格数据重投影

#               栅格数据重投影        
# 栅格数据也可以重投影,但比矢量数据投影更复杂。
# 栅格数据需要处理栅格数据中像元会弯曲和移动的事实,一对一的映射并不存在
# 通常用最近邻域插值法、双线性插值和三次卷积插值法进行插值
# 方法:1.gdalwarp 2.AutoCreateWarpedVRT 
srs = osr.SpatialReference()
srs.SetWellKnownGeogCS('WGS84')  #UTM转无投影,即地理坐标系
old_ds = gdal.Open('nat_color.tif')
vrt_ds = gdal.AutoCreateWarpedVRT(old_ds, None, srs.ExportToWkt(), gdal.GRA_Bilinear) #第一个默认值None,使用源栅格数据的srs;第二个如果None,表示不发生重投影
gdal.GetDriverByName('gtiff').CreateCopy('nat_color_wgs84.tif', vrt_ds)      #该函数返回一个数据集对象,用CreateCopy函数保存为gtiff    

4.GetGeoTransform

#         GetGeoTransform,相同srs,计算坐标偏移。
#作用:图像坐标和现实世界坐标之间的转换。是仿射变换,不是投影转换,和上面不同。
#0、3 x\y坐标 起始点现实世界坐标  1、5 像素宽度和高度  2、4 x\y方向旋转角
gt = ds.GetGeoTransform() #正变换:图像坐标到现实世界坐标
inv_gt = gdal.InvGeoTransform(gt) #逆变换:现实世界坐标到图像坐标
offsets = gdal.ApplyGeoTransform(inv_gt, 465200, 5296000)
xoff, yoff = map(int, offsets)  #取整

5.gdal.Transformer

#        gdal.Transformer,可计算相同srs下的坐标偏移;不同srs投影转换能不能,不清楚???
#作用:现实坐标与图像坐标之间的转换、两个栅格图像之间坐标偏移(如镶嵌)
#这里in_ds和out_ds具有相同srs。转换目的是为了把不同栅格数据的图像坐标(行列号)进行偏移,方便镶嵌
trans = gdal.Transformer(in_ds, out_ds, [])  #空白用于设置转换器选项
success, xyz = trans.TransformPoint(False, 0, 0) #False基于源数据计算目标栅格,反之为True。起始坐标为左上角 0,0
x,y,z = map(int, xyz)

#图像坐标和现实世界坐标之间转换
trans = gdal.Transformer(out_ds, None, [])
success, xyz = trans.TransformPoint(0, 1078, 648)
个人想法:

1.OSR \ PROJ \ AutoCreateWarpedVRT 分别用于矢量/点、栅格图像的投影转换,栅格与前两者有所不同。
2.GetGeoTransform是仿射变换,计算坐标偏移。(现实坐标与图像坐标行列号),其中Geo[0/3]是现实世界坐标而不是行列号。
3.gdal.Transform本书中用于相同srs,不同栅格图像坐标(行列号)偏移的计算。书中用于镶嵌。
4.proj和osr都进行投影转换(可用于地理坐标和投影坐标之间的转换,是一种特例)。
5.计算栅格之间像素(行列号)偏移,这和仿射变换参数有关,而不是投影转换。
6.投影转换用OSR PROJ(矢量)/AutoCreateWarpedVRT(栅格);Geotransform用于图像坐标和现实坐标转换;gdal.Transformer用于相同srs,栅格图像间图像坐标偏移。其他?




猜你喜欢

转载自www.cnblogs.com/ljwgis/p/12616265.html