基于GDAL的面数据保存

保存数据的第一步是要把数据解析出来,然后根据GDAL的规则进行数据point类型的shapefile数据生成。大概步骤为:

一、定义保存点要素数据的类

这里定义了两个基类:

//基类,保存要素类型,点、线、面
class Element
{
private:
	char Type;
	int Code;
public:
	Element(void);
	~Element(void);
	void setType(char Type);
	char getType();
	void setCode(int Code);
	int getCode();
};

//基类,保存要素中点的XY坐标
class Geometry
{
private:
	double X;
	double Y;
public:
	Geometry(void);
	~Geometry(void);
	void setX(double X);
	double getX();
	void setY(double Y);
	double getY();
};

保存面要素的类定义为:

#include "Element.h"
#include "Geometry.h"
#include<vector>
using namespace std;

//单个面
//Code为面编码
//pointSet为面中点集
class SPolygon :
	public Element,public Geometry
{
private:
	//int Code;
	vector<Geometry> pointSet;
public:
	SPolygon(void);
	~SPolygon(void);
	void clearPointSet();
	//void setCode(int Code);
	//int getCode();
	void setPoints(vector<Geometry> pointSet);
	vector<Geometry> getPoints();
	Geometry getPointFromIndex(int index);
};

在保存面要素数据时,需要定义一个面要素的集合

//保存读取的面数据
list<SPolygon> mPolygon;

二、数据解析

三、数据保存

//保存面数据
void savePolygon()
{
	char *FilePath = "E:\\data\\polygon.shp";
	//判断文件是否存在,不存在就进行下面的保存操作,存在就先删除再保存
	fstream f;
	f.open(FilePath,ios::in);

	//文件不存
	if(!f)
	{
		f.close();
		//remove(FilePath);
	}
	//文件存在,删除文件
	else
	{
		f.close();
		remove(FilePath);
	}

	//要保存的shapefile文件名,只保存文件名,不保存路径和.shp
	char FileName[20];
	char *p=strrchr(FilePath,'\\')+1;
	strcpy(FileName,p);
	int i=0,j=0;
	while(i< 20 &&FileName[i]!='\0' &&FileName[i]!='.')
		i++;
	if(i !=20) FileName[i]='\0';

	//注册OGR所有驱动
	GDALAllRegister();
	OGRRegisterAll();

	//定义驱动
	const char *pszDriverName = "ESRI Shapefile";
	OGRSFDriver *poDriver;
	poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName );
	if( poDriver == NULL )
	{
		printf( "%s 驱动不可用.\n", pszDriverName );
		return;
	}

	//创建filepath路径的文件
	OGRDataSource *poDS;
	poDS = poDriver->CreateDataSource( FilePath, NULL );
	if( poDS == NULL )
	{
		printf( "创建文件s%失败.\n",FilePath );
		return;
	}

	//定义图层,面图层
	OGRLayer *poLayer;
	poLayer = poDS->CreateLayer(FileName, NULL, wkbPolygon, NULL );
	if( poLayer == NULL )
	{
		printf( "创建图层失败.\n" );
		return;
	}

	//创建属性字段
	//定义属性字段code和type
	OGRFieldDefn codeField("code", OFTInteger);
	OGRFieldDefn typeField("type", OFTString );
	//设置code和type字段的宽度
	codeField.SetWidth(32);
	typeField.SetWidth(32);
	//创建字段
	if( poLayer->CreateField( &codeField ) != OGRERR_NONE )
	{
		printf( "创建字段codeField失败.\n" );
		return;
	}
	if( poLayer->CreateField( &typeField ) != OGRERR_NONE )
	{
		printf( "创建字段codeField失败.\n" );
		return;
	}

	list<SPolygon>::iterator itor;	

	for(itor=mPolygon.begin();itor!=mPolygon.end();itor++)
	{
		//创建第i个面
		OGRFeature *poFeature=OGRFeature::CreateFeature( poLayer->GetLayerDefn() );

		//设置第i条线的属性
		poFeature->SetField("code",itor->getCode());
		poFeature->SetField("type", itor->getType());

		OGRPolygon *poPolygon = new OGRPolygon();
		//定义Linear来保存面中数据
		OGRLinearRing *poLinearRing = new OGRLinearRing();
		//第i个面中包含的点数
		int num=static_cast<int>(itor->getPoints().size());
		poLinearRing->setNumPoints(num);

		for(j=0;j<num;j++)
		{
			poLinearRing->setPoint(j,itor->getPointFromIndex(j).getX(),itor->getPointFromIndex(j).getY());

		}
		poPolygon->addRing(poLinearRing);
		//poFeature->SetGeometryDirectly(poPolygon);
		poFeature->SetGeometry(poPolygon);
		if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
		{
			printf( "创建polyline失败.\n" );
			return;
		}

		OGRFeature::DestroyFeature( poFeature );
	}
	OGRDataSource::DestroyDataSource( poDS );
}
时间: 2024-10-28 00:57:04

基于GDAL的面数据保存的相关文章

基于GDAL的线数据保存

保存数据的第一步是要把数据解析出来,然后根据GDAL的规则进行数据point类型的shapefile数据生成.大概步骤为: 一.定义保存点要素数据的类 这里定义了两个基类: //基类,保存要素类型,点.线.面 class Element { private: char Type; int Code; public: Element(void); ~Element(void); void setType(char Type); char getType(); void setCode(int Co

基于GDAL的点数据保存

保存数据的第一步是要把数据解析出来,然后根据GDAL的规则进行数据point类型的shapefile数据生成.大概步骤为: 一.定义保存点要素数据的类 这里定义了两个基类: //基类,保存要素类型,点.线.面 class Element { private: char Type; int Code; public: Element(void); ~Element(void); void setType(char Type); char getType(); void setCode(int Co

基于Web方式的数据包捕获实践

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chenguang.blog.51cto.com/350944/1753844 基于Web方式的数据包捕获实践        抓包是运维的必备技能,很多网络故障需要靠抓包来解决,如常见的ARP欺骗和广播风暴.另外还有一些网线或光纤接触不好的故障,不抓包也很难分析出来,例如两个公司之间互联,网线测试都没问题,但始终不通.经过抓包分析表明,发现其他单位的ping请求都伴随着ARP查询

基于HBase的大数据存储的应用场景分析

引言 HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,适用于结构化的存储,底层依赖于Hadoop的HDFS,利用HBase技术可在廉价PCServer上搭建起大规模结构化存储集群.因此HBase被广泛使用在大数据存储的解决方案中. 为何使用HBase HBase的优点: 列可以动态增加,并且列为空就不存储数据,节省存储空间. Hbase自动切分数据,使得数据存储自动具有水平scalability. Hbase可以提供高并发读写操作的支持. HBase的缺点: 不能支持条件查询,

关于使用java从http接口取数据保存到本地文件的中文乱码处理

关于使用java从http接口取数据保存到本地文件的中文乱码处理 要做到如下几点: 1. 取接口数据,要注意加入编码设置与接口文件本身的编码设置一致,才能取得正确的数据   注意如下的: ins =new InputStreamReader(connection.getInputStream(),"GBK"):   必须加入第二个编码格式参数:参数的值与接口返回的数据的编码格式一致         /**   * 从某个接口取返回数据内容   * @param url   * @ret

网站设计中如何将对应的用户网页的数据保存在数据库中

问题描述 网站设计中如何将对应的用户网页的数据保存在数据库中 最近在做一个关于二手书交易平台的小项目(毕业设计),在处理用户登录后自动跳转到所对应的用户个人网页时没什么思路,求各位大神指点一下...小妹初来乍到,不甚感激啊... 解决方案 并不是直接把用户的网页保存在数据库中,而是把用户的信息存在各张数据表中.在用户登陆后可以获取到用户的ID(确保是唯一的),根据这个ID获取数据表中用户的相关信息,然后在用户个人页面进行展示..比如表A是用户表,其主键为user_id,同时user_id为表B的

vs2010,实验数据保存成自己定义的一个格式*tk,如何调用

问题描述 vs2010,实验数据保存成自己定义的一个格式*tk,如何调用 vs2010,实验数据保存成自己定义的一个格式*tk,如何调用

ASP.NET 2.0数据教程之四十三:基于用户对修改数据进行限制

返回"ASP.NET 2.0数据教程目录" 导言 很多支持帐号(即需要登陆)的web程序根据登陆的用户提供不同 的选项,报表和其它功能.回到基于用户对修改数据进行限制 里,我们学习了如 何根据当前用户来动态调整在DetailsView和GridView里修改数据的能力.它允许 用户可以作为supplier或employee登陆到站点.如果登陆的用户为supplier,他 将可以修改他提供的product信息和company信息.而employee可以修改任何公司 的product和su

asp +access 数据保存插入代码

asp教程 +access 数据保存插入代码 if request.QueryString("ag")  then  set conn=server.createobject("adodb.connection")  conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("../skyj.mdb")  ag=request.fo