天天看點

瓦片地圖拼接瓦片地圖

gdal的簡單代碼使用——瓦片地圖拼接

  • 瓦片地圖
    • 何為瓦片地圖
    • 所用的庫
    • 代碼
    • 相關資源

瓦片地圖

随着現在地圖資訊愈加強大,為了更加詳細地表示地圖資訊,瓦片地圖成為了一種比較好的方式,這篇部落客要就是講述了一下将瓦片拼接成為地圖的原理,以及相關代碼。

何為瓦片地圖

何為瓦片地圖,其實非常簡單,可以了解為小時候大家玩過的拼圖,隻不過拼圖的數量更多,完成拼接的人,也從自己變為計算機,這樣瓦片地圖的作用和方法就變得非常清晰了。下面再來看看瓦片地圖的參數,(x,y,z)。首先從z說起,當z = 1時,代表着瓦片地圖的第一層,此時一副完整的世界地圖切割了(z-1 )次,同理z等于多少就代表切割了多少次,并且此時瓦片的個數為2^(z - 1)。x和y則更加好了解,大緻等于直角坐标系的橫縱坐标。

所用的庫

在這次所使用的庫為gdal,GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協定下的開源栅格空間資料轉換庫。它利用抽象資料模型來表達所支援的各種檔案格式。它還有一系列指令行工具來進行資料轉換和處理。(後附gdal檔案的相關庫,可自行配置)

代碼

#include<cstdio>
#include<iostream>
#include "gdal_priv.h"
#include<iomanip>
#include "cpl_conv.h"
#include "ogrsf_frmts.h"
#include<cmath>

using namespace std;

int main()
{
	int x_1 = 22390, x_2 = 22470, y_1 = 52017, y_2 = 52072;//在此處輸入,x和y的值,盡量保證x_2 - x_1 = 80,y_2 - y_1 = 55
	int i, j;
	//如果想改成輸入經緯度,可以研究一下中間被注釋的代碼
	/*
	//int pi = 3.1415
	//int ix, iy, il;
	//int lat_min,lon_max,lat_min,lon_max;
	//int x_1 = ((lon_min + 180)/360) * pow(2,17);
	//int x_2 = ((lon_max + 180)/360) * pow(2,17);
	//int y_1 = (1 - ((log(tan(lat_min*(pi / 180))) + (1 / (cos(lat_min * (pi / 180))))) / pi)) * pow(2,16);
	//int y_2 = (1 - ((log(tan(lat_max*(pi / 180))) + (1 / (cos(lat_max * (pi / 180))))) / pi)) * pow(2,16);
	*/
	typedef unsigned char       BYTE;//定義無符号性的char型為BYTE
	typedef unsigned short      WORD;
	typedef unsigned long       DWORD;
	GDALDataset *poDataset2;//資料集對象指針
	GDALAllRegister();//注冊驅動
	BYTE* data = new BYTE[256 * 256 * 3];
	GDALDataset *poDataset;//GDAl資料集
	GDALDriver* poDriver;//驅動,用于建立新的檔案
	poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");//擷取GDALDriverManager類的tiff的單例
	char** papszMetadata = poDriver->GetMetadata();//一系列鍵值對。可以分為不同的Domain。
	poDataset = poDriver->Create("E:\\c++code\\test3\\photo generate\\tif\\CREATE1.tif", 85 * 256, 60 * 256, 3, GDT_Byte, papszMetadata);//在此處修改過渡檔案tif的儲存路徑
	//建立過渡用的TIF檔案
	for(i=x_1;i <=x_2;i++)//行号
		for (j = y_1; j <= y_2; j++)//列号
		{
			std::string input = string("E:\\c++code\\test3\\17\\") + std::to_string(i) + "\\" + std::to_string(j) + ".png";
			poDataset2 = (GDALDataset*)GDALOpen(input.c_str(), GA_ReadOnly);// , GA_ReadOnly);//打開資料
			poDataset2->RasterIO(GF_Read, 0, 0, 256, 256, data, 256, 256, GDT_Byte, 3, 0, 0, 0, 0);//讀取資料
			poDataset->RasterIO(GF_Write, 256 * (i - x_1), 256 * (j - y_1), 256, 256, data, 256, 256, GDT_Byte, 3, 0, 0, 0, 0);//寫入資料

		}
	poDriver = GetGDALDriverManager()->GetDriverByName("PNG");
	poDataset2 = poDriver->CreateCopy("E:\\c++code\\test3\\photo generate\\png\\output1.png", poDataset, 3, papszMetadata, NULL, NULL); //在此處修改儲存的路徑

}
           

相關資源

Gdal的相關庫(不建議下載下傳,畢竟要錢)

有興趣的同學也可以,自己去配Gdal庫的環境,網上的教程很多。

繼續閱讀