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把这些文件纳入了版本库,就不起作用了. 解 ...
随机推荐
- easyui 添加dialog
javascript //查看角色所属用户 function roleuser(obj, id) { var C_ID = id; var Url = "/Sys/RoleUserName& ...
- Java compiler level does not match the version of the installed Java project facet.解决办法
问题原因: 出现这个问题的原因是因为,eclipse/myeclipse的jdk编译版本与出现问题的项目JDK编译版本不一致所导致! 解决办法: 工程名---->右键properties-- ...
- 为什么说 Git 比 SVN 更好
为什么说 Git 比 SVN 更好 在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题.使用Git极大地提高了开发效率.扩大了开源项目的参与度. 增强了版本控制系统的安全性, ...
- Effective Java实作Comparable - 就是爱Java
当集合或数组内的对象需要排序时,会利用Collections.sort或Arrays.sort来进行排序,通常会implement Comparable,来实现自定义排序,透过回传值来表示排序的大小. ...
- 【给你几个使用Xamarin的理由】
写在开篇前 这种代理操作,绑定影射的机制,有些极端的开发者确实难以接受.追求完美,总感觉原生的各种优点. 如果你非得较这个真,那您还是感觉补习下 Java Eclipse ,买一台Mac 恶补Obj ...
- /etc/fstab 文件详解 及 /etc/mtab
/etc/fstab 文件解释 文件fstab包含了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件. 这个文件的全路径是/etc/fstab ...
- [置顶] Android学习系列-把文件保存到SD卡上面(6)
Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...
- IO队列和IO调度
IO体系概览 先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识.虽然一下两下并不清楚IO体系各个部分的细节,但是我 ...
- TCP和UDP的区别(转)
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- AFN的二次封装
http://www.cnblogs.com/sxwangjiadong/p/4970751.html