图像存储的地理坐标位置信息

您所在的位置:网站首页 如何找到图片来源的文件位置信息 图像存储的地理坐标位置信息

图像存储的地理坐标位置信息

2023-07-23 08:00| 来源: 网络整理| 查看: 265

图像位置坐标 1 位置坐标是怎么存储的2 不同图像格式如何存位置信息2.1 pix文件2.2 tif格式2.3 jpg格式2.4 png格式 3 给没坐标的图像加地理坐标解决方案3.1 实现输入输出都是3通道tif格式的加坐标3.2 实现输入输出都是3通道tif格式的加坐标3.3 能不能给png格式的图像加坐标3.4 能不能给jpg格式的图像加坐标?3.5 结论 4 批量给png图像加坐标参考资料

1 位置坐标是怎么存储的

这里还不是特别清楚,还需要再看看文件,究竟仿射矩阵和地理坐标的关系,它们相对于谁确定的位置。

存放位置信息,主要包含3个信息:坐标名字,仿射变化信息

1.使用GDAL需要知道待投影图片的地理坐标信息、仿射矩阵参数。

仿射矩阵参数是干什么的?见:https://zhuanlan.zhihu.com/p/72184440 主要含义: 1)不同坐标系的转换,涉及到仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。 2)仿射矩阵信息有六个参数,描述的是栅格行列号和地理坐标之间的关系: ‘’’ 0:图像左上角的X坐标; 1:图像东西方向分辨率; 2:旋转角度,如果图像北方朝上,该值为0; 3:图像左上角的Y坐标; 4:旋转角度,如果图像北方朝上,该值为0; 5:图像南北方向分辨率;

dataset = gdal.Open('a.png') print (dataset.GetGeoTransform())#仿射矩阵 print (dataset.GetProjection())#地图投影信息 # 打印结果为: # (116.33333, 8.321688443e-05, 0.0, 39.99999, 0.0, -6.223016769e-05) # '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"]]' 2 不同图像格式如何存位置信息 2.1 pix文件

文件确实保存的呢

2.2 tif格式

1、envi直接save zoom as ,只有两个文件,有投影信息 在这里插入图片描述 twf中的信息: 在这里插入图片描述

2、进一步实验,envi导出car文件 在这里插入图片描述 把tfw文件删除了,仍然有自己的位置坐标,说明单个的tif文件就是geotiff,已经有了坐标信息。 tfw跟坐标无关。 在这里插入图片描述

2.3 jpg格式

1、envi直接save zoom as ,只有两个文件,没有投影信息 在这里插入图片描述

2.4 png格式

1、envi直接save zoom as ,只有1个文件,没有投影信息 在这里插入图片描述

3 给没坐标的图像加地理坐标解决方案

读取一张图像对它进行处理,如果保留地理坐标位置信息

3.1 实现输入输出都是3通道tif格式的加坐标

1、如果都是tif格式,那么用下面的这个方法,非常厉害 现在有对应的没有坐标的3通道png图像和有坐标的tif图像 在这里插入图片描述 2、格式工厂将png转换为tif格式 在这里插入图片描述 3、用下面的程序给83-01加上了坐标,得到83-01_proj https://blog.csdn.net/xiaotiig/article/details/118712555 在这里插入图片描述

3.2 实现输入输出都是3通道tif格式的加坐标

1、覆盖区域完全一样,t1是3波段有坐标,单波段.tif是单波段没坐标 在这里插入图片描述 2、用下面的程序给单波段.tif加上了坐标,得到单波段_proj.tif,和背景图像完全重合。 https://blog.csdn.net/xiaotiig/article/details/118712555 在这里插入图片描述 在这里插入图片描述

3.3 能不能给png格式的图像加坐标

直接调用上面的这个程序就完成了,是可以的,单通道和3通道的png图像都是可以保存位置信息的

3.4 能不能给jpg格式的图像加坐标?

直接调用上面的这个程序就完成了,是可以的,单通道和3通道的png图像都是可以保存位置信息的

3.5 结论

(1)下面这个程序可以给tif、jpg、png影像加坐标,无论它是多少通道的,无论它是不是和已知坐标的tif图像通道数是否 一样,全部都可以处理,非常好。 https://blog.csdn.net/xiaotiig/article/details/118712555 (2)jpg图像只能是3通道 (3)tif、jpg、png影像单个文件都可以保存地理坐标信息

4 批量给png图像加坐标

https://blog.csdn.net/qq_41440099/article/details/114793272?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162622540216780261958048%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162622540216780261958048&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-114793272.first_rank_v2_pc_rank_v29&utm_term=gdal%E7%BB%99png%E5%9B%BE%E5%83%8F%E5%8A%A0%E5%9D%90%E6%A0%87&spm=1018.2226.3001.4187

在这里插入图片描述 2.在arcgis使用一张图片和三个角点的坐标进行地理配准,再定义投影完成坐标转换。

使用下面的代码获取仿射矩阵和投影参数:

dataset = gdal.Open('a.png') print (dataset.GetGeoTransform())#仿射矩阵 print (dataset.GetProjection())#地图投影信息 # 打印结果为: # (116.33333, 8.321688443e-05, 0.0, 39.99999, 0.0, -6.223016769e-05) # '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"]]'

3.批量获取图片的仿射矩阵

# coors是用来存储图片对应左上角坐标的字典。格式为{‘a.png‘’:[116.33333,39.6],} image_list = os.listdir('D:\\dd') image_num = len(image_list) for k in range(image_num): if image_list[k].endswith('.png'): img_name = img_none_path + '/' + image_list[k] img_pos_transf = (float(coors[image_list[k]][0]), 8.321688443e-05, 0.0, float(coors[image_list[k]][1]), 0.0, -6.223016769e-05)#根据第二步获得像元分辨率和投影 print(img_pos_transf) img_pos_proj = '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"]]' def_geoCoordSys(img_name, img_pos_transf, img_pos_proj)#坐标转换的函数

4.给图片加坐标系的主要函数如下

def def_geoCoordSys(read_path, img_transf, img_proj): array_dataset = gdal.Open(read_path) img_array = array_dataset.ReadAsArray( 0, 0, array_dataset.RasterXSize, array_dataset.RasterYSize) if 'int8' in img_array.dtype.name: datatype = gdal.GDT_Byte elif 'int16' in img_array.dtype.name: datatype = gdal.GDT_UInt16 else: datatype = gdal.GDT_Float32 if len(img_array.shape) == 3: img_bands, im_height, im_width = img_array.shape else: img_bands, (im_height, im_width) = 1, img_array.shape filename = read_path[:-4] + '_proj' + '.tif' driver = gdal.GetDriverByName("GTiff") # 创建文件驱动 dataset = driver.Create( filename, im_width, im_height, img_bands, datatype) dataset.SetGeoTransform(img_transf) # 写入仿射变换参数 dataset.SetProjection(img_proj) # 写入投影 # 写入影像数据 if img_bands == 1: dataset.GetRasterBand(1).WriteArray(img_array) else: for i in range(img_bands): dataset.GetRasterBand(i + 1).WriteArray(img_array[i]) print(read_path, 'geoCoordSys get!') 参考资料

自己copy大神的 https://blog.csdn.net/xiaotiig/article/details/118712555 大神的 https://blog.csdn.net/nominior/article/details/102737294



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3