//总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源。
//要包含的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. 设置Toast显示位置

    设置Toast显示位置 两个方法可以设置显示位置: 方法一:setGravity(int gravity, int xOffset, int yOffset)三个参数分别表示(起点位置,水平向右位移, ...

  2. Linux下Tomcat的安装配置 去掉应用名称

    http://blog.csdn.net/zhuying_linux/article/details/6583096/ Tomcat下为每个Web应用配置不同的访问端口 http://www.linu ...

  3. 锋利jQuery 学习整理之 第六章 jQuery 与Ajax 的应用

    1.Ajax 的XMLHttpRequest 对象 XMLHttpRequest 是Ajax 的核心,它是Ajax 实现的关键---发送异步请求.接受响应及执行回调都是通过它来完成的.XMLHttpR ...

  4. HTML5简介、视频

    HTML5 建立的一些规则: 新特性应该基于 HTML.CSS.DOM 以及 JavaScript. 减少对外部插件的需求(比如 Flash) 更优秀的错误处理 更多取代脚本的标记 HTML5 应该独 ...

  5. 简单的thinkPHP3.2运行实例。

    在上一篇的环境基础下. 我们用zendstudio12.5版本编写我们的代码.具体的下载方式在这里就不多做注明了.自己百度就可以搞定. 首先我们用zendstudio12.5 导入我们从网上随处都可以 ...

  6. Sherlock and GCD

    1 import fractions, functools, sys if __name__ == '__main__': T = int(sys.stdin.readline()) for _ in ...

  7. Python中range的用法

    函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5); end:技术到end结束,但 ...

  8. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  9. C语言读写伯克利DB 3

    gcc -o channeldb channel.c -db -Wall # -Wall参数等价于执行lint,即:进行代码的静态分析,它可以指出未初始化的变量,未使用的变量 #include < ...

  10. ubuntu12中设置PATH环境变量的几种方法(三种办法)

    如果在Ubuntu12系统中自行安装了一些软件,特别是使用tar.gz文件包安装的软件,通常会放在/usr/local或者/opt,甚至放在/home下,但是如果要调用或执行时,必须加上完整的路径才可 ...