网上有很多下载Google地图的卫片的软件,一般下载下来的图像都是jpg格式的,另外附带一个坐标信息的描述文件。这样的数据不能直接拿来在遥感或者GIS软件中使用,因为图像里面没有投影和坐标信息,所以就需要将这个描述文件中的坐标信息导入到影像中。下面就如何使用gdal提供的工具来完成这个功能,当然也可以自己写程序。
首先看看输入数据都有什么,这里只有一个jpg图像和一个txt文件,jpg图像如下,原始大小为12800×7168,上传的时候太大,我缩小了下。
另外的描述信息主要有:
图片宽度(像素):12800
图片高度(像素):7168
Web墨卡托坐标系(地图原始坐标)
左下角:-4383205.071958936800000,-20037508.165080477000000
左上角:-4383205.071958936800000,-11271098.261898357000000
右上角:11271098.756465839000000,-11271098.261898357000000
右下角:11271098.756465839000000,-20037508.165080477000000
WGS84坐标系(经纬度坐标)
左下角:-39.375000000000000,-85.051128779806547
左上角:-39.375000000000000,-70.612614238019233
右上角:101.250000000000000,-70.612614238019233
右下角:101.250000000000000,-85.051128779806547
从上面的描述信息中可以看出来,地图原始的四角坐标都是知道的,Google的地图使用的都是Web墨卡托投影,对应的EPSG代码是900913,而经纬度对应的EPSG代码是4326。
通过上面的信息可以知道,我们可以将上面的坐标信息处理为一个World file文件,也就是jpw文件,这个文件就可以给jpg图像赋坐标信息了,至于投影信息最后可以使用gdalwarp中的-s_srs命令来指定。
首先使用gdalinfo工具查看图像的信息,如下图所示,可以看出图像是没有任何坐标和投影信息的。
通过上面的坐标计算的图像的分辨率大致为1222.9925米,所以world file里面的内容如下。(注意,这里假设图像正北朝上,一般来说Google的卫片都满足这个要求,如果不满足,可以使用上面的四角坐标用最小二乘来结算这个world file中的六个数值)。
1222.9925000000000
0.0000000000
0.0000000000
-1222.9925000000
-4383205.071958936800000
-11271098.261898357000000
将上面的内存保存为一个和jpg图像名字相同,后缀名为jpw的文件,然后使用gdalinfo查看,看看是不是有坐标信息了。如果想把这个图像直接转成带有投影和坐标的tif数据的话,可以直接使用gdal_translate工具,命令如下:
gdal_translate.exe -of GTiff -a_srs EPSG:900913 --config GDAL_DATA C:\warmerda\GDAL110_SDK\data --config GDAL_FILENAME_IS_UTF8 NO C:\Users\LiMinlu\Desktop\jpg2tif\全球_03-02.jpg C:\Users\LiMinlu\Desktop\jpg2tif\900913.tif
执行后使用gdalinfo查看输出的图像信息,如下图,从里面可以看到输出的图像投影和坐标信息都有了。红色区域为使用gdal_translate执行的部分。
如果想将结果直接生成WGS84的经纬度数据,可以直接使用gdalwarp工具,命令行如下。
gdalwarp.exe -of GTiff -s_srs EPSG:900913 -t_srs EPSG:4326 --config GDAL_DATA C:\warmerda\GDAL110_SDK\data --config GDAL_FILENAME_IS_UTF8 NO C:\Users\LiMinlu\Desktop\jpg2tif\全球_03-02.jpg C:\Users\LiMinlu\Desktop\jpg2tif\wgs84.tif
执行后使用gdalinfo查看输出的图像信息,如下图,从里面可以看到输出的图像投影和坐标信息都有了。红色区域为使用gdalwarp执行的部分。