网站上下载的部分遥感数据只有地理坐标,没有投影坐标,本文章尝试给“只有地理坐标的图片”添加投影坐标。
原始数据:山东地区ASTER GDEM30m数据,该数据只有WGS84地理坐标
目标数据:给该数据添加UTM-50N
此网站查的比较费劲,我反正没在这找到:https://developers.arcgis.com/javascript/3/jshelp/pcs.htm,
该网站比较方便,可以搜索:https://spatialreference.org/ref/
我的目标投影坐标是WGS84-UTM zone 50N,https://spatialreference.org/ref/https://spatialreference.org/ref/epsg/32650/html/,见下图:
from osgeo import gdal,osr,gdalnumeric
from osgeo.gdalconst import *
from pyproj import CRS
# 1.获取原数据信息
# 该数据只有地理坐标WGS84
ds = gdal.Open('D:\ProfessionalProfile\CoordinateSystemConversion\shandongDEMenvi_10.tif')
im_geotrans = ds.GetGeoTransform() #仿射矩阵信息
im_proj = ds.GetProjection() #地图投影信息
# print(im_geotrans)
# print(im_proj)
im_width = ds.RasterXSize # 栅格矩阵的列数
im_height = ds.RasterYSize # 栅格矩阵的行数
im_bands = ds.RasterCount
ds_array = ds.ReadAsArray(0, 0, im_width, im_height) # 获取原数据信息,包括数据类型int16,维度,数组等信息
# # 设置数据类型(原图像有负值)
datatype = gdal.GDT_Float32
# 2.原图像的仿射变换矩阵参数,即im_geotrans
img_transf = (114.79763889, 0.00027777777778, 0.0, 38.21347222, 0.0, -0.00027777777778)
# # 网站查询的WGS84-UTM50N坐标信息https://spatialreference.org/ref/epsg/32650/html/
img_proj = '''PROJCS["WGS 84 / UTM zone 50N",
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",117],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","32650"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]'''
# 3.设置新文件及各项参数
filename = 'D:\ProfessionalProfile\CoordinateSystemConversion\AproUTM50fInternet.tif'
driver = gdal.GetDriverByName("GTiff") # 创建文件驱动
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
dataset.SetGeoTransform(img_transf) # 写入仿射变换参数
dataset.SetProjection(img_proj) # 写入投影
# 写入影像数据
dataset.GetRasterBand(1).WriteArray(ds_array)
del dataset
有一点儿差别:Python中使用的数据类型是浮点型;原数据是int16。
之前在Python中将数据类型设置为gdal.GDT_Int16时候,原数据中小于0的值都在输出影像中都成了0。没太懂这是什么原因,如果有熟悉的大佬,希望能指点一二。
如果有目标影像的投影信息的话:只要在ARCGIS中先加载“有目标投影信息的数据”再加载“要投影的数据”,然后再重新导出“要投影的数据”(选择当前投影)就可以了。
from osgeo import gdal,osr,gdalnumeric
from osgeo.gdalconst import *
# 数据1是landsat8影像,投影是WGS84-UTM47
ds1 = gdal.Open('D:\ProfessionalProfile\Landsat2017\LC08_L1TP_134036_20170808_20170813_01_T1\LC08_L1TP_134036_20170808_20170813_01_T1_B1.tif')
# ds1_geotrans = ds1.GetGeoTransform()
# 数据2是山东地区的DEM数据,只有地理坐标WGS84,没有投影坐标
ds2 = gdal.Open('D:\ProfessionalProfile\CoordinateSystemConversion\shandongDEMenvi_10.tif',GA_Update)
ds2.SetProjection(ds1.GetProjection())
ds2.SetGeoTransform(ds1.GetGeoTransform())
当然,将山东的DEM投影为UTM-47肯定不对,我这里只不过是尝试一下,看看这样做可不可行。
该山东地区DEM数据的经度范围在114.79763889E——122.70013889E之间,个人感觉比较适合的投影带是UTM-50N。
(3)对比一下UTM-47N和UTM-50N
参考:
地理坐标系WKID:https://developers.arcgis.com/javascript/3/jshelp/gcs.htm
投影坐标系WKID:https://developers.arcgis.com/javascript/3/jshelp/pcs.htm
https://spatialreference.org/ref/
https://blog.csdn.net/hqs_09/article/details/100624829
https://blog.csdn.net/qq_41440099/article/details/114793272