返回> 网站首页 

GDAL离线地图

yoours2017-01-04 18:17:09 阅读 2244

简介一边听听音乐,一边写写文章。

一、下载gdal开源库
http://www.gisinternals.com/sdk.php
下载对应版本

二、下载离线地图
使用 [WOLFMAP地图下载器专业版]选择谷歌无偏移地图下载
软件工具网址http://www.wolfmap.cn/

三、程序源码
#include "gdal\include\gdal_priv.h"
#include "gdal\include\ogrsf_frmts.h"
#include "gdal\include\gdal.h"
#include "gdal\include\ogr_srs_api.h"
#include "gdal\include\ogr_spatialref.h"
#include "gdal\include\ogr_api.h"
#include "gdal\include\proj_api.h"
#include "gdal\include\gdal_alg.h"

CString filter_str="image files(*.jpg;*.bmp;*.tif)|*.jpg;*.bmp;*.tif||";
CFileDialog file(TRUE, _T("打开遥感影像"), NULL, NULL, filter_str);
CString lpszPathName;

if(file.DoModal()==IDOK)
{
lpszPathName=file.GetPathName();
}

GDALAllRegister();//注册驱动程序
poDataset=(GDALDataset *)GDALOpen(lpszPathName, GA_ReadOnly);
if(poDataset==NULL)
{
TRACE("打开遥感影像失败!\n");
OnCancel();
return FALSE;
}

m_BandCount = 0;
int m_ImgXSize, m_ImgYSize;

TRACE("========图像基本信息======\n");
m_ImgXSize=poDataset->GetRasterXSize();
m_ImgYSize=poDataset->GetRasterYSize();
m_BandCount=poDataset->GetRasterCount();

TRACE(" -描述信息:%s\n", poDataset->GetDriver()->GetDescription());
TRACE(" -单一元数据项:%s\n", poDataset->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME));
TRACE(" -图像宽度:%d, 长度:%d, 波段数:%d\n", m_ImgXSize, m_ImgYSize, m_BandCount);

projRef = NULL;
if(poDataset->GetProjectionRef()!=NULL)
{
TRACE("投影信息:%s\n", poDataset->GetProjectionRef());
projRef = poDataset->GetProjectionRef();
}

CPLErr err = poDataset->GetGeoTransform(adfGeoTransform);
if(err == CE_None)
{
//如果图像不含地理坐标信息,默认返回值是:(0, 1, 0, 0, 0, 1)
//In a north up image,
//左上角点坐标(padfGeoTransform[0], padfGeoTransform[3]);
//padfGeoTransform[1]是像元宽度(影像在宽度上的分辨率);
///padfGeoTransform[5]是像元高度(影像在高度上的分辨率);
//如果影像是指北的, padfGeoTransform[2]和padfGeoTransform[4]这两个参数的值为0。
TRACE("左上角点坐标:(%f, %f)\n", adfGeoTransform[0], adfGeoTransform[3]);
TRACE("图像分辨率:%f * %f\n", adfGeoTransform[1], adfGeoTransform[5]);
}

GDALRasterBand **poBand=new GDALRasterBand*[m_BandCount];
if(poBand==NULL)
{
AfxMessageBox("创建波段数据集失败!", MB_ICONWARNING);
}

for(int i=0;i<m_BandCount;i++)
{
poBand[i]=poDataset->GetRasterBand(i+1);
if(NULL==poBand[i])
{
AfxMessageBox("创建i波段数据集失败!", MB_ICONWARNING);
}
}

int nXSize = poBand[0]->GetXSize();
int nYSize = poBand[0]->GetYSize();
TRACE(" -波段尺寸,宽度:%d, 长度:%d\n", poBand[0]->GetXSize(), poBand[1]->GetYSize());
TRACE(" -数据类型:%s\n", GDALGetDataTypeName(poBand[0]->GetRasterDataType()));
TRACE(" -颜色信息:");
for(int i=0;i<m_BandCount;i++)
{
TRACE("%s  ", GDALGetColorInterpretationName(poBand[i]->GetColorInterpretation()));
}
TRACE("\n");

double LeftX, LeftY;
MapPosion(20, 2, LeftX, LeftY);
TRACE("\n\n ---左上角的(%f, %f)\n", LeftX, LeftY);
int nX, nY;
MapPosion2(LeftX, LeftY, nX, nY);
TRACE("\n\n ---左上角的(%d, %d)\n", nX, nY);

//======================================================================
ppafScanblock = NULL;
if(m_BandCount==3)
{
ppafScanblock = new BYTE*[m_BandCount];
for (int i=0;i<m_BandCount; i++)
{
// 读取数据
ppafScanblock[i] = new BYTE[m_ImgXSize*m_ImgYSize];
//遥感的一个波段
poBand[i]->RasterIO(GF_Read, 0, 0, m_ImgXSize, m_ImgYSize, ppafScanblock[i], m_ImgXSize, m_ImgYSize, GDT_Byte, 0, 0);
}

m_PictureCtrl->SetBackGround(ppafScanblock[0], ppafScanblock[1], ppafScanblock[2], m_ImgXSize, m_ImgYSize);
}
delete[] poBand;

三、坐标转经纬度
void CMapOffLineDlg::MapPosion(int nX, int nY, double& x, double& y)
{
//Xp = padfTransform[0] + P*padfTransform[1] + L*padfTransform[2];
    //Yp = padfTransform[3] + P*padfTransform[4] + L*padfTransform[5];

// 右下角的坐标x, y
x = adfGeoTransform[0] + nX * adfGeoTransform[1];
y = adfGeoTransform[3] + nY * adfGeoTransform[5];

TRACE("--%f, %f", x, y);

/** 过程2 **/
if (projRef != NULL)
{
OGRSpatialReference fRef, tRef;
/** 获得projRef的一份拷贝 **/
/** 由于projRef是const char*, 下面的一个函数不接受,所以需要转换成非const **/
char *tmp = (char *)malloc(strlen(projRef) + 1);
strcpy_s(tmp, strlen(projRef)+1, projRef);

char* t = tmp;
// 设置原始的坐标参数,和test.tif一致
fRef.importFromWkt(&tmp);//会改变指针地址
// 设置转换后的坐标
tRef.SetWellKnownGeogCS("WGS84");

// 下面进行坐标转换,到此为止都不需要proj,但是下面的内容如果不安装proj将会无法编译
OGRCoordinateTransformation *coordTrans;
coordTrans = OGRCreateCoordinateTransformation(&fRef, &tRef);
coordTrans->Transform(1, &x, &y);
TRACE("\r\nWGS84: ");
// 这时候x, y已经转化为经纬度啦
TRACE("%f, %f", x, y);

free(t);
}
}

四、经纬度转坐标
void CMapOffLineDlg::MapPosion2(double x, double y, int& nX, int& nY)
{
if (projRef != NULL)
{
OGRSpatialReference fRef, tRef;
/** 获得projRef的一份拷贝 **/
/** 由于projRef是const char*, 下面的一个函数不接受,所以需要转换成非const **/
char *tmp = (char *)malloc(strlen(projRef) + 1);
strcpy_s(tmp, strlen(projRef)+1, projRef);

char* t = tmp;
// 设置原始的坐标参数,和test.tif一致
fRef.importFromWkt(&tmp);//会改变指针地址
// 设置转换后的坐标
tRef.SetWellKnownGeogCS("WGS84");

// 下面进行坐标转换,到此为止都不需要proj,但是下面的内容如果不安装proj将会无法编译
OGRCoordinateTransformation *coordTrans = OGRCreateCoordinateTransformation(&tRef, &fRef);
coordTrans->Transform(1, &x, &y);

nX = (x -adfGeoTransform[0]) / adfGeoTransform[1];
nY = (y - adfGeoTransform[3]) / adfGeoTransform[5];

TRACE("\r\nInverse WGS84: ");
// 这时候x, y已经转化为坐标啦
TRACE("%d, %d", nX, nY);

free(t);
}
}
微信小程序扫码登陆

文章评论

2244人参与,0条评论