//总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源。
//要包含的GDAL头文件
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
#include <iostream>
using namespace std; #pragma comment(lib,"gdal_i.lib")
bool Creatshape(const char* pszFileName ,int line,int row); #include <tchar.h> //_TCHAR* 类型在该头文件里
int _tmain(int argc, _TCHAR* argv[])
{
const char *pszFileName="C:\\Users\\Public\\Pictures\\Sample Pictures\\srtm_51_03.tif";
Creatshape(pszFileName,7,9);
system("pause");
return 0;
}
/************************************************************************/
/*创建过程:构建数据源->构建层->构建要素->构建形状->关闭数据源
/* 参数pszFileName 为输入的文件名
参数linenum为划分的行数
参数rows为划分的列数*/
/************************************************************************/
bool Creatshape(const char* pszFileName ,int linenum,int rows)
{
//获取影像信息
GDALDataset *poDataSet;
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
poDataSet=(GDALDataset*)GDALOpen(pszFileName,GA_ReadOnly); //打开数据集
if (poDataSet==NULL)
{
"Failed to open this dataset!"; //代开失败的话则给出提示并退出
exit(1);
}
double Trans[6];//坐标转换参数数组,作为GetGeoTransform()函数的参数
int width,height; //影像的像行列数;
width=poDataSet->GetRasterXSize(); //获取影像列数,为后续划分网格做准备
height=poDataSet->GetRasterYSize();//获取影像行数,为后续划分网格做准备
poDataSet->GetGeoTransform(Trans); for (int i=0;i<6;i++)
{
cout<<Trans[i]<<endl; //循环输出仿射变换参数;
}
//注册shape文件驱动
const char* pszDriverName="ESRI Shapefile";
OGRSFDriver *poDriver;
OGRRegisterAll();
poDriver=OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
if (poDriver==NULL)
{
printf("%s driver is not available!",pszDriverName);
exit(1);
}
//创建shape文件;
OGRDataSource *poDS;
//创建一个叫myshapefile的目录,存放生成的文件;
//如果名字有.shp后缀,则直接在当前目录下生成文件;
poDS=poDriver->CreateDataSource("myshapefile.shp",NULL);
if (poDS==NULL)
{
printf("Create my shape file failed!");
exit(1);
}
//创建输出图层;
OGRLayer *poLayer;;
const char *prj=poDataSet->GetProjectionRef(); //获取栅格影像的空间参考信息
cout<<"栅格数据空间参考信息为:\n"<<prj<<endl<<endl;
OGRSpatialReference oSRS;
oSRS.SetFromUserInput(prj); //将获得的空间参考信息字符串做为文本一次性赋给矢量数据的OGRSpatialReference对象;
poLayer=poDS->CreateLayer(pszFileName,&oSRS, wkbUnknown, NULL);
if (poLayer==NULL)
{
printf("Creat layer failed!");
exit(1);
}
//创建层数据的属性fields;
OGRFieldDefn oField("Point",OFTString);
oField.SetWidth(10);
if (poLayer->CreateField(&oField)!=OGRERR_NONE)
{
printf("Create Point Field Failed!");
exit(1);
}
//创建features,写入feature到磁盘;
OGRFeature *poFeature;
poFeature=OGRFeature::CreateFeature(poLayer->GetLayerDefn());
//绘制外边框
OGRLineString Line;
OGRPoint Point1(Trans[0],Trans[3]);
OGRPoint Point2(Trans[0]+width*Trans[1],Trans[3]);
OGRPoint Point3(Trans[0]+width*Trans[1],Trans[3]+width*Trans[4]+height*Trans[5]);
OGRPoint Point4(Trans[0],Trans[3]+width*Trans[4]+height*Trans[5]);//四个角点的地理坐标,通过行列号计算地理坐标,是通过六参数得到的;
Line.addPoint(&Point1);
Line.addPoint(&Point2);
Line.addPoint(&Point3);
Line.addPoint(&Point4);
Line.addPoint(&Point1);
//水平方向加线;
OGRLineString SubHline[50];
OGRPoint PointLeft[50],PointRight[50];
for (int i=1;i<linenum;i++)
{
PointLeft[i].setX(Trans[0]); //设置左边框上要加线的起点X坐标
PointLeft[i].setY((Point4.getY()-Trans[3])/linenum*i+Trans[3]);//设置左边框上要加线的起点Y坐标
PointRight[i].setX(Point2.getX());//设置右边框上要加线的起点X坐标
PointRight[i].setY((Point4.getY()-Trans[3])/linenum*i+Trans[3]);//设置右边框上要加线的起点Y坐标
}
for (int i=1;i<linenum;i++)
{
SubHline[i].addPoint(&PointLeft[i]); //左边框上加点;
SubHline[i].addPoint(&PointRight[i]);//右边框上加点;
if (i<linenum-1)
{
SubHline[i].addPoint(&PointRight[i+1]); //从右边框的上一点转到下一点,避免交叉斜线的出现;
}
Line.addSubLineString(&SubHline[i]);//将SubHline数组中的每一个线做为子线段添加到Line对象中;
}
Line.addPoint(&Point2);
//垂直方向加线
OGRLineString SubVline[50];
OGRPoint PointUp[50],PointDown[50];
for (int j=1;j<rows;j++)
{
//添加上边框上的点;
PointUp[j].setX((Point2.getX()-Trans[0])/rows*j+Trans[0]);
PointUp[j].setY(Trans[3]);
//添加下边框上的点;
PointDown[j].setX((Point2.getX()-Trans[0])/rows*j+Trans[0]);
PointDown[j].setY(Point4.getY());
}
for (int j=1;j<rows;j++)
{
SubVline[j].addPoint(&PointUp[j]);
SubVline[j].addPoint(&PointDown[j]);
if (j<rows-1)
{
SubVline[j].addPoint(&PointDown[j+1]); //从下边框的前一点转到后一点,避免交叉斜线的出现;
}
Line.addSubLineString(&SubVline[j]);
}
//poFeature->SetGeometryDirectly(&Line);//问题出在这啊!!用SetGeometryDirectly报错,要用SetGeometry
poFeature->SetGeometry(&Line);
if (poLayer->CreateFeature(poFeature)!=OGRERR_NONE)
{
printf("Failed create feature in shapefile!");
exit(1);
}
OGRFeature::DestroyFeature(poFeature);
OGRDataSource::DestroyDataSource(poDS);
printf("创建矢量数据成功!\n");
system("pause");
return TRUE;
}

用ENVI打开生成的shp文件:

注意:在计算四个角点的坐标时,用到了六参数,参考博客:http://blog.csdn.net/ivanljf/article/details/9226463

C++、GDAL创建shapefile,并向矢量文件中添加网格的更多相关文章

  1. VS2010在C#头文件中添加文件注释的方法

    步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...

  2. java向文件中添加数据---手动版日志添加

    核心代码为创建多级文件夹创建 //目标文件 File file=new File(filePath); //若不存在即创建文件 if(!file.exists()) { if (!file.getPa ...

  3. VS2010在C#头文件中添加文件注释的方法(转)

    步骤: 1.VS2010 中找到(安装盘符以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTempl ...

  4. 如何在maven项目的pom.xml文件中添加jar包

    在使用maven进行项目开发时,我们需要在pom.xml文件中添加自己所需要的jar包.这就要求我们获取jar包的groupId和artifactId. 我们可以在一些maven仓库上搜索我们所需要的 ...

  5. 向php文件中添加php.ini文件

    向php文件中添加php.ini文件 默认情况下,php是没有php.ini配置文件的,必须手工添加php.ini文件 在php安装目录中,复制php.ini文件到/usr/local/php/lib ...

  6. gitignore文件中添加新过滤文件,但是此文件已经提交,如何解决?

    gitignore文件中添加新过滤文件,但是此文件已经提交到远程库,如何解决? 第一步,为避免冲突需要先同步下远程仓库 git pull 第二步,在本地项目目录下删除缓存 git rm -r --ca ...

  7. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  8. flask在其他文件中添加路由

    应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...

  9. .gitignore文件中添加忽略文件或者目录后,不起作用。

    出现该问题的原因: 在git库中已存在了这个文件,之前push提交过该文件. .gitignore文件只对还没有加入版本管理的文件起作用,如果之前已经用git把这些文件纳入了版本库,就不起作用了. 解 ...

随机推荐

  1. shell中的双括号表达式

    语法格式 (( expression )) expression可以是任何数学表达式,可以包含的操作符有: +  加 - 减 * 乘(无需转义) / 除 % 取余 ** 指数 == 等于 != 不等 ...

  2. PMBOK 项目管理 九大知识领域和五大流程

    PMI   Project Management Institute.PMI 是世界上最大的非盈利机构,是项目管理领域的领导者.PMI制定项目管理行业标准,带领项目管理的研究并提供项目管理的培训,证书 ...

  3. VC-关于VC++ 6.0的那些事儿

    Microsoft Visual C++,(简称Visual C++.MSVC.VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言.VC+ ...

  4. 懂说话,让冲突、尴尬时刻都bye-bye

    回忆一下自己从小到大的成长历程,你容不容易交到新朋友?在不熟悉的社交场合中,你是否也曾面临坐立难安.不知从何聊起的窘境?事实上,无论身处学校或社会,担任职务是基础或高阶,终其一生都会派上用场的能力,就 ...

  5. poj3480--John

    题意:n堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个).谁取走最后一个谁输.给定一个状态,问先取的赢还是后取的赢. 整个游戏反过来,如果sg为0先手必胜,不为0必败.( ...

  6. 去掉java反编译(JD-GUI)生成的源文件中注释

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  7. spring bean初始化和销毁

    spring bean的创建与消亡由spring容器进行管理,除了使用<bean><property/></bean>进行简单的属性配置之外,spring支持更人性 ...

  8. Nim Game 解答

    Question You are playing the following Nim Game with your friend: There is a heap of stones on the t ...

  9. Hessian和Burlap入门教程

    一.简介 Hessian和Burlap是由Caucho Technology提供的基于HTTP协议的轻量级远程服务解决方案.他们都致力于借助尽可能简单那的API和通信协议来简化Web服务.    He ...

  10. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...