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() #正變換:圖像坐標到現實世界坐標。正變換時輸入行列號,輸出的現實世界坐標是柵格圖像srs下的坐標
inv_gt = gdal.InvGeoTransform(gt) #逆變換:現實世界坐標到圖像坐標
offsets = gdal.ApplyGeoTransform(inv_gt, 465200, 5296000) #逆變換:輸入的投影坐標具有和柵格圖像的相同的srs
xoff, yoff = map(int, offsets)  #取整

5.gdal.Transformer

#        gdal.Transformer,可計算相同srs下的坐標偏移;不能用於不同srs投影轉換
#作用:現實世界坐標(投影坐標或地理坐標)與圖像坐標(行列號)之間的轉換、兩個柵格圖像之間像素坐標偏移(行列號),如鑲嵌
#原理就是在相同srs情況下,計算圖1的像素坐標到現實世界坐標的偏移,再從現實世界坐標偏移到圖2的像素坐標。其實就是兩次仿射變換(正、逆),從而把圖1的像素坐標偏移到圖2的像素坐標。
#所以不能用於不同srs情況,因為該函數沒有內置不同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用於相同srs圖像坐標和現實世界坐標轉換;gdal.Transformer用於相同srs,柵格圖像
圖像坐標偏移,也可以計算圖像坐標和現實世界坐標轉換
7.osr.CoordinateTransformation是不同坐標系的投影轉換;
而gdal.Transformer是相同srs下,不同柵格圖像之間的圖像坐標偏移(也可計算現實世界坐標和圖像坐標之間的轉換)。
兩者可以組合使用,完成不同投影的柵格圖像之間的圖像坐標偏移。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM