//总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源。
//要包含的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. phantomjs form提交

    phantomjs表单提交,其实就是对DOM就行操作(获取元素),在这里实现了动态传入各种参数 不说了 直接上代码 var page = require('webpage').create(), sy ...

  2. js判断是否为空的代码

    方法一: var keyVal= $("#key").val(); if(keyVal==undefined || keyVal=="" || keyVal== ...

  3. Autolayout-VFL语言添加约束-备

    一.VFL语言简介 VFL(Visual format language)语言是苹果为了简化手写Autolayout代码所创建的专门负责编写约束的代码.为我们简化了许多代码量. 二.使用步骤 使用步骤 ...

  4. [android]-如何在向服务器发送request时附加已保存的cookie数据

    [android]-如何在向服务器发送request时附加已保存的cookie数据 应用场景:在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务 ...

  5. SSL和SSH和OpenSSH,OpenSSL有什么区别

    ssl是通讯链路的附加层.可以包含很多协议.https, ftps, ..... ssh只是加密的shell,最初是用来替代telnet的.通过port forward,也可以让其他协议通过ssh的隧 ...

  6. Berserk Rook

    Berserk Rook As you may know, chess is an ancient game for which almost everyone has at least a basi ...

  7. SQL 如何表示引号

    SELECT ename || '''' || ' 的工作是 ' || ' ' || job || '''' AS msg FROM emp WHERE deptno = 10; ' '' ' 第一个 ...

  8. CF 567C Geometric Progression

    题目大意:输入两个整数 n 和 k ,接下来输入n个整数组成的序列.求该序列中三个数 满足条件的子串个数(要求字串由三个整数a,b,c组成,其中 c = k * b = k * k * a). 思路: ...

  9. yumdebug

  10. Node.js-require的使用方法

    require最常用的方法 require('http') 内置模块 require('./server')  “./”表示当前路径,后面跟的是相对路径 require("../lib/se ...