C++、GDAL创建shapefile,并向矢量文件中添加网格
//总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源。
//要包含的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,并向矢量文件中添加网格的更多相关文章
- VS2010在C#头文件中添加文件注释的方法
步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...
- java向文件中添加数据---手动版日志添加
核心代码为创建多级文件夹创建 //目标文件 File file=new File(filePath); //若不存在即创建文件 if(!file.exists()) { if (!file.getPa ...
- VS2010在C#头文件中添加文件注释的方法(转)
步骤: 1.VS2010 中找到(安装盘符以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTempl ...
- 如何在maven项目的pom.xml文件中添加jar包
在使用maven进行项目开发时,我们需要在pom.xml文件中添加自己所需要的jar包.这就要求我们获取jar包的groupId和artifactId. 我们可以在一些maven仓库上搜索我们所需要的 ...
- 向php文件中添加php.ini文件
向php文件中添加php.ini文件 默认情况下,php是没有php.ini配置文件的,必须手工添加php.ini文件 在php安装目录中,复制php.ini文件到/usr/local/php/lib ...
- gitignore文件中添加新过滤文件,但是此文件已经提交,如何解决?
gitignore文件中添加新过滤文件,但是此文件已经提交到远程库,如何解决? 第一步,为避免冲突需要先同步下远程仓库 git pull 第二步,在本地项目目录下删除缓存 git rm -r --ca ...
- Android开发过程中在sh,py,mk文件中添加log信息的方法
Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...
- flask在其他文件中添加路由
应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...
- .gitignore文件中添加忽略文件或者目录后,不起作用。
出现该问题的原因: 在git库中已存在了这个文件,之前push提交过该文件. .gitignore文件只对还没有加入版本管理的文件起作用,如果之前已经用git把这些文件纳入了版本库,就不起作用了. 解 ...
随机推荐
- C++中explicit
[explicit] 1.用于抑制隐式转换,即: X x = ; // error X x(); // ok 2.只对一个实参的构造函数有效,但是,可以用多有多个实参的构造函数,目前没有意义: cla ...
- Go学习笔记(二):编写 HelloWorld 程序
//Hello.go代码 package main import "fmt" func main(){ fmt.Printf("Hello, world!This is ...
- myeclipse 不能添加非myeclipse开发的项目
这是因为以前的项目不是用myEclipse创建的,所以用myeclipse deploy的时候找不到你的项目.可以这样做:右击原项目名 - myeclipse - Add Web Project Ca ...
- 一个Restful Api的访问控制方法
最近在做的两个项目,都需要使用Restful Api,接口的安全性和访问控制便成为一个问题,看了一下别家的API访问控制办法. 新浪的API访问控制使用的是AccessToken,有两种方式来使用该A ...
- kafka相关应用
一.kafka官网地址 http://kafka.apache.org 下载地址: http://kafka.apache.org/downloads.html 二.版本 0.9.0.1 is the ...
- Nasty Hacks <入门练手题>
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 使用Discuz!自带参数防御CC攻击以及原理,修改Discuz X 开启防CC攻击后,不影响搜索引擎收录的方法
这部份的工作,以前花的时间太少. 希望能产生一定的作用. http://www.nigesb.com/discuz-cc-attacker-defence.html http://bbs.zb7.co ...
- 浅谈程序员创业(要有一个自己的网站,最好的方式还是自己定位一个产品,用心把这个产品做好。或者满足不同需求的用户,要有特色)good
浅谈程序员创业 ——作者:邓学彬.Jiesoft 1.什么是创业? 关于“创业”二字有必要重新学习一下,找了两个相对权威定义: 创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而 ...
- WPF 如何缓解大量控件加载缓慢的问题
最近有一个项目需要加载大量的控件,导致系统出现卡顿问题,经过几天的努力,终于搞定了,写一下备忘. 解决方案是首次加载时只显示可见区域控件,之后使用辅助线程进行分批加载,将分批加载的线程优先级别设置为空 ...
- HDU 1576 A/B(数论)
题目:求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1).数据给出n和b 推导过程 A/B = K K = 9973* ...