圖像座標、地理座標和投影座標的相互轉化(Python版)

本博客系轉載~

from osgeo import gdal
from osgeo import osr
import numpy as np
 
def getSRSPair(dataset):
    '''
    獲得給定數據的投影參考系和地理參考系
    :param dataset: GDAL地理數據
    :return: 投影參考系和地理參考系
    '''
    prosrs = osr.SpatialReference()
    prosrs.ImportFromWkt(dataset.GetProjection())
    geosrs = prosrs.CloneGeogCS()
    return prosrs, geosrs
 
def geo2lonlat(dataset, x, y):
    '''
    將投影座標轉爲經緯度座標(具體的投影座標系由給定數據確定)
    :param dataset: GDAL地理數據
    :param x: 投影座標x
    :param y: 投影座標y
    :return: 投影座標(x, y)對應的經緯度座標(lon, lat)
    '''
    prosrs, geosrs = getSRSPair(dataset)
    ct = osr.CoordinateTransformation(prosrs, geosrs)
    coords = ct.TransformPoint(x, y)
    return coords[:2]
 
 
def lonlat2geo(dataset, lon, lat):
    '''
    將經緯度座標轉爲投影座標(具體的投影座標系由給定數據確定)
    :param dataset: GDAL地理數據
    :param lon: 地理座標lon經度
    :param lat: 地理座標lat緯度
    :return: 經緯度座標(lon, lat)對應的投影座標
    '''
    prosrs, geosrs = getSRSPair(dataset)
    ct = osr.CoordinateTransformation(geosrs, prosrs)
    coords = ct.TransformPoint(lon, lat)
    return coords[:2]
 
def imagexy2geo(dataset, row, col):
    '''
    根據GDAL的六參數模型將影像圖上座標(行列號)轉爲投影座標或地理座標(根據具體數據的座標系統轉換)
    :param dataset: GDAL地理數據
    :param row: 像素的行號
    :param col: 像素的列號
    :return: 行列號(row, col)對應的投影座標或地理座標(x, y)
    '''
    trans = dataset.GetGeoTransform()
    px = trans[0] + col * trans[1] + row * trans[2]
    py = trans[3] + col * trans[4] + row * trans[5]
    return px, py
 
 
def geo2imagexy(dataset, x, y):
    '''
    根據GDAL的六 參數模型將給定的投影或地理座標轉爲影像圖上座標(行列號)
    :param dataset: GDAL地理數據
    :param x: 投影或地理座標x
    :param y: 投影或地理座標y
    :return: 影座標或地理座標(x, y)對應的影像圖上行列號(row, col)
    '''
    trans = dataset.GetGeoTransform()
    a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]])
    b = np.array([x - trans[0], y - trans[3]])
    return np.linalg.solve(a, b)  # 使用numpy的linalg.solve進行二元一次方程的求解
 
 
if __name__ == '__main__':
    gdal.AllRegister()
    dataset = gdal.Open(r"E:\\1207\\input\\L17.tif")
    print('數據投影:')
    print(dataset.GetProjection())
    print('數據的大小(行,列):')
    print('(%s %s)' % (dataset.RasterYSize, dataset.RasterXSize))
 
    x = 464201
    y = 5818760
    lon = 122.47242
    lat = 52.51778
    row = 2399
    col = 3751
 
    print('投影座標 -> 經緯度:')
    coords = geo2lonlat(dataset, x, y)
    print('(%s, %s)->(%s, %s)' % (x, y, coords[0], coords[1]))
    print('經緯度 -> 投影座標:')
    coords = lonlat2geo(dataset, lon, lat)
    print('(%s, %s)->(%s, %s)' % (lon, lat, coords[0], coords[1]))
 
    print('圖上座標 -> 投影座標:')
    coords = imagexy2geo(dataset, row, col)
    print('(%s, %s)->(%s, %s)' % (row, col, coords[0], coords[1]))
    print('投影座標 -> 圖上座標:')
    coords = geo2imagexy(dataset, x, y)
    print('(%s, %s)->(%s, %s)' % (x, y, coords[0], coords[1]))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章