翼度科技»论坛 编程开发 python 查看内容

python GDAL 经纬度转像素坐标(包括投影坐标)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
  1. # -*- encoding: utf-8 -*-
  2. from osgeo import gdal
  3. from osgeo import osr
  4. import numpy as np
  5. def getSRSPair(dataset):
  6.     '''
  7.     获得给定数据的投影参考系和地理参考系
  8.     :param dataset: GDAL地理数据
  9.     :return: 投影参考系和地理参考系
  10.     '''
  11.     prosrs = osr.SpatialReference()
  12.     prosrs.ImportFromWkt(dataset.GetProjection())
  13.     geosrs = prosrs.CloneGeogCS()
  14.     return prosrs, geosrs
  15. def geo2lonlat(dataset, x, y):
  16.     '''
  17.     将投影坐标转为经纬度坐标(具体的投影坐标系由给定数据确定)
  18.     :param dataset: GDAL地理数据
  19.     :param x: 投影坐标x
  20.     :param y: 投影坐标y
  21.     :return: 投影坐标(x, y)对应的经纬度坐标(lon, lat)
  22.     '''
  23.     prosrs, geosrs = getSRSPair(dataset)
  24.     ct = osr.CoordinateTransformation(prosrs, geosrs)
  25.     coords = ct.TransformPoint(x, y)
  26.     return coords[:2]
  27. def lonlat2geo(dataset, lon, lat):
  28.     '''
  29.     将经纬度坐标转为投影坐标(具体的投影坐标系由给定数据确定)
  30.     :param dataset: GDAL地理数据
  31.     :param lon: 地理坐标lon经度
  32.     :param lat: 地理坐标lat纬度
  33.     :return: 经纬度坐标(lon, lat)对应的投影坐标
  34.     '''
  35.     prosrs, geosrs = getSRSPair(dataset)
  36.     ct = osr.CoordinateTransformation(geosrs, prosrs)
  37.     coords = ct.TransformPoint(lon, lat)
  38.     return coords[:2]
  39. def imagexy2geo(dataset, row, col):
  40.     '''
  41.     根据GDAL的六参数模型将影像图上坐标(行列号)转为投影坐标或地理坐标(根据具体数据的坐标系统转换)
  42.     :param dataset: GDAL地理数据
  43.     :param row: 像素的行号
  44.     :param col: 像素的列号
  45.     :return: 行列号(row, col)对应的投影坐标或地理坐标(x, y)
  46.     '''
  47.     trans = dataset.GetGeoTransform()
  48.     px = trans[0] + col * trans[1] + row * trans[2]
  49.     py = trans[3] + col * trans[4] + row * trans[5]
  50.     return px, py
  51. def geo2imagexy(dataset, x, y):
  52.     '''
  53.     根据GDAL的六 参数模型将给定的投影或地理坐标转为影像图上坐标(行列号)
  54.     :param dataset: GDAL地理数据
  55.     :param x: 投影或地理坐标x
  56.     :param y: 投影或地理坐标y
  57.     :return: 影坐标或地理坐标(x, y)对应的影像图上行列号(row, col)
  58.     '''
  59.     trans = dataset.GetGeoTransform()
  60.     a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]])
  61.     b = np.array([x - trans[0], y - trans[3]])
  62.     return np.linalg.solve(a, b)  # 使用numpy的linalg.solve进行二元一次方程的求解
  63. if __name__ == '__main__':
  64.     gdal.AllRegister()
  65.     dataset = gdal.Open(r"F:\2016\Data\Great Khingan\DEM\Projection\strm_6102_UTM.tif")
  66.     print('数据投影:')
  67.     print(dataset.GetProjection())
  68.     print('数据的大小(行,列):')
  69.     print('(%s %s)' % (dataset.RasterYSize, dataset.RasterXSize))
  70.     x = 464201
  71.     y = 5818760
  72.     lon = 122.47242
  73.     lat = 52.51778
  74.     row = 2399
  75.     col = 3751
  76.     print('投影坐标 -> 经纬度:')
  77.     coords = geo2lonlat(dataset, x, y)
  78.     print('(%s, %s)->(%s, %s)' % (x, y, coords[0], coords[1]))
  79.     print('经纬度 -> 投影坐标:')
  80.     coords = lonlat2geo(dataset, lon, lat)
  81.     print('(%s, %s)->(%s, %s)' % (lon, lat, coords[0], coords[1]))
  82.     print('像素坐标 -> 投影坐标:')
  83.     coords = imagexy2geo(dataset, row, col)
  84.     print('(%s, %s)->(%s, %s)' % (row, col, coords[0], coords[1]))
  85.     print('投影坐标 -> 像素坐标:')
  86.     coords = geo2imagexy(dataset, x, y)
  87.     print('(%s, %s)->(%s, %s)' % (x, y, coords[0], coords[1]))
复制代码
 

来源:https://www.cnblogs.com/Swlymbcty/p/17943215
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具