基于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 SPolyline :
	public Element,public Geometry
{
private:
	//int Code;
	vector<Geometry> pointSet;

public:
	SPolyline(void);
	~SPolyline(void);
	void clearPointSet();
	//void setCode(int Code);
	//int getCode();
	void setPoints(vector<Geometry> pointSet);
	vector<Geometry> getPoints();
	Geometry getPointFromIndex(int index);
	void destroy();
};

在保存线数据时,定义一个list集合

//保存读取的线数据

list<SPolyline> mPolyline;

二、数据解析

三、数据保存

//保存线数据
void savePolyline(char *Filepath,list<SPolyline>& savedData)
{
	//判断文件是否存在,不存在就进行下面的保存操作,存在就先删除再保存
	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
	OGRRegisterAll();
	//定义驱动
	const char *pszDriverName = "ESRI Shapefile";
	OGRSFDriver *poDriver;
	poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName );
	if( poDriver == NULL )
	{
		printf( "%s 驱动不可用.\n", pszDriverName );
		return;
	}

	OGRDataSource *poDS;
	poDS = poDriver->CreateDataSource( Filepath, NULL );
	if( poDS == NULL )
	{
		printf( "保存文件s%失败.\n",Filepath );
		return;
	}

	//定义图层
	OGRLayer *poLayer;
	poLayer = poDS->CreateLayer(FileName, NULL, wkbLineString, 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<SPolyline>::iterator itor;
	for(itor=savedData.begin();itor!=savedData.end();itor++)
	{
		list<SPolyline>::iterator it = itor;
		//创建第i条线
		OGRFeature *poFeature=OGRFeature::CreateFeature( poLayer->GetLayerDefn() );

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

		OGRLineString *poPolyline = new OGRLineString();
		//第i条线中包含的点数
		int num=static_cast<int>(itor->getPoints().size());
		poPolyline->setNumPoints(num);
		for(j=0;j<num;j++)
		{
			poPolyline->setPoint(j,itor->getPointFromIndex(j).getX(),itor->getPointFromIndex(j).getY());
		}
		poFeature->SetGeometry(poPolyline);
		if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE )
		{
			printf( "创建polyline失败.\n" );
			return;
		}
		savedData.erase(it);
		OGRFeature::DestroyFeature( poFeature );
	}
	OGRDataSource::DestroyDataSource( poDS );
}
时间: 2024-08-26 16:33:49

基于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

基于GDAL的栅格图像空间插值预处理

转自 基于GDAL的栅格图像空间插值预处理——C语言版 基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源,怎样以开源方式读取并处理这些空间数据?目前有多种开源支持包,这里只介绍GDAL包.GDAL包的优点是支持库简洁.支持栅格和矢量.与多种开发平台结合.OpenGis方式读取空间数据,有利于自己编写程序进行图像预处理和智能识别等等,比如:遥感影像的降噪.锐化:红外图像的林火识别:工厂监控视频识别等等.本文中利用GDAL包读取高程栅格DEM,并添加气象自动站点的数据,进

postgresql+postgis+pgrouting实现最短路径查询(1)---线数据的处理和建立拓扑

准备一个线shp数据,并将其导入postgres里面,postgres安装postgis和pgrouting两个插件(方法见http://www.cnblogs.com/nidaye/p/4553522.html).线数据的字段如下:注意字段的名称,省的出现不必要的麻烦. 1.ALTER TABLE beijing_line ADD COLUMN source integer; ALTER TABLE beijing_line ADD COLUMN target integer; ALTER T

安卓实训第四天--基于HttpClient来完成数据在服务器和设备间的交互。

上午:老师首先回顾了昨天作业. 首先在安卓工程中的TOOLS文件中,解析字节流那里,不用改变,而是把服务器端的编码方式变为UTF-8,然后将在安卓工程的LoginActivity类中的USERNAME给他强制转换下. 总结一句话:如果一个字符通过某个编码转换成字节码之后,那你在转换的时候必须拿到转换之前的字节码 补充:如何改变mysql连接工具的编码方式: jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEnco

使用C#处理基于比特流的数据

使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型也是一个byte.不过借助于C#基础类库中提供的一些方法,也实现了对基于比特的数据的读取.任务完成后觉得基于比特的数据挺有意思,自己试了下用7比特和6比特编码常用ASCII字符.最后把一点新的写成博客,一方面做个记录,另一方面希望对有类似需求的园友有所帮助. 0x01 比特流数据的读取 假设我们有一

ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. ================================================================================= 前台:D7或D2005; DBExpress连接组件:TSqlConnection,TSqlQuery ,TDataSetProvider,TClientDataSet;后台:SQL Server 2000; 更新数据的命令:DataSet

Delphi:ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. =========================================================================== TClientDataSet用法 第十一章 TClientDataSet 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.TClientDataSet最大的特点是它不依赖于

超云网络西咸新区BGP多线数据中心介绍

超云网络咸阳数据中心位于陕西省咸阳市.咸阳市位于陕西省八百里秦川腹地,渭水穿南,嵕山亘北,山水俱阳,故称咸阳.素有"中国第一帝都"之称,是中部地区中国电信与中国移动的重要网络出口节点(网络结构层次与陕西西安市平级),网络直接与国家骨干网相连,带宽资源丰富. 机房简介 超云网络咸阳多线数据中心机房属电信级标准机房,有硬件维修区.客户接待区.网管监控区,VIP客户区等组成,总面积达到5000平方米,采用先进的进口设备,在建筑方面设有防静电地板并且下端增加钢筋支架保证承重,结构稳固,具有高达