Advertisement

使用GDAL进行影像投影坐标、地理坐标、图上坐标的转换

阅读量:

四个函数依次完成从投影坐标到地理坐标的经纬度变换,并依次完成从投影坐标到图上坐标的行列号变换。

复制代码
 # -*- encoding: utf-8 -*-

    
  
    
 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"F:\2016\Data\Great Khingan\DEM\Projection\strm_6102_UTM.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]))
    
    
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/8HLqSxkbJy6D3OTYcRFWEleQmz9V.png)

输出结果:

复制代码
 数据投影:

    
 PROJCS["WGS_1984_UTM_Zone_51N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",123],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32651"]]
    
 数据的大小(行,列):
    
 (7503 4799)
    
 投影坐标 -> 经纬度:
    
 (464201, 5818760)->(122.472422555, 52.5177753994)
    
 经纬度 -> 投影坐标:
    
 (122.47242, 52.51778)->(464200.830381, 5818760.513)
    
 图上坐标 -> 投影坐标:
    
 (2399, 3751)->(464163.754715, 5818797.73095)
    
 投影坐标 -> 图上坐标:
    
 (464201, 5818760)->(2399.49875769, 3751.50526134)
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/Trwc5D0RJO6CqzUed12VbZjmongs.png)

注释:该六参数模型涉及投影坐标与地图坐标的转换关系研究。其理论基础可追溯至仿射变换这一几何数学模型。

其中参数-geoloc代表所使用的地理坐标为投影坐标。-wgs84指定的是基于WGS84参考系的地理坐标的经纬度数值。输出结果对应于地图上的行列号位置信息。有关具体可用参数的详细说明,请参阅gdallocationinfo的帮助文档。

全部评论 (0)

还没有任何评论哟~