【Python&RS】基于GDAL给无人机图片定义坐标系
前段时间有过一个想法,就是如果可以给无人机拍摄的图片定义坐标系,再使用GADL库里的镶嵌拼接函数,是不是就可以实现快速拼接影像。虽然结果不是正射影像,但效率比无人机厂家的软件提高了很多很多,主要还是看用途。
有了这个想法后就要行动起来,定义一个坐标系,一般需要两个点。一是需要投影坐标系的参数,二就是仿射地理变换参数。投影坐标系非常容易得到,投影坐标系的参数GDAL有内置的一部分,当然也可以读取已有数据的坐标系。但仿射地理变换参数就比较麻烦了,我印象中定义仿射地理变换参数时只能通过图片左上角的点就是设置,不像ENVI可以任意选点。ENVI方便很多,有兴趣可以查看。所以我们只要能解决仿射地理变换参数就可以解决图片定义坐标系的问题。
,得到图片左上角的投影坐标和偏转角度,以此建立仿射地理变换参数,再通过这些创建新的数据资源将原来的数据写入。
一、获取图片中心点经纬度
这一步之前的博文已经说过无数次了,这里就不解释。如果你只是娱乐一下,并不需要定义真实的坐标系,那么可以直接跳到最后一步,仿射地理变换参数直接设置0,1即可。
二、转换投影
无人机拍摄的影像一般都是GPS经纬度坐标(WGS84),我这里要将他定义为UTM/WGS84 51N,所以需要将它的地理坐标系先转换成投影坐标系。
三、获取图片偏转角
无人机航拍时不可能一直与正北方向一致,所以还需要获取其成像时的偏转角。这一步是为了计算图片左上角的仿射地理变换参数。我这里使用的是大疆的无人机,其他厂商的无人机成像参数需要自己查阅。
四、计算图片左上角的投影坐标
这一步是获取左上角的投影坐标,以此建立仿射地理变换参数。
五、定义坐标系
前面的工作完成后就得到了仿射地理变换参数,就可以定义坐标系了。如果大家只是想拼接手机拍摄的图片,或者娱乐学习,就可以不那么严谨。不需要求出真实的投影坐标,仿射地理变换参数直接设置为(1, 0, 0, 1, 0, 0)即可。关于仿射地理变换参数的含义,大家可以查看这篇博文。
六、完整代码
上面的代码都是分步的,直接复制无法运行,因为有一部分我是放在了主函数里面。运行代码要注意两点,一是无人机图片是否有中心点的经纬度,二是是否为大疆的无人机,如果不是第三步的代码就需要自己修改。
我这里只是实验一下,所以仿射地理变换参数里的旋转角度没有加进去,位置有一点偏移。总体代码没有问题,但这个逻辑应该还需要改进。大家有好的想法也可以和我一起探讨,后续应该会针对这个问题进行优化。
前端时间去出外业了,所以博文没有更新。后面应该会持续更新的,当然博主也会休息休息,偷偷懒,要一起加油鸭。