GIS是怎样建成的之四:gdal\ogr以及provider
2014-05-04 19:25
274 查看
好久没写这个系列的博客了,原先打算研究sharpmap从而从存储和显示部分来探究gis是怎么建成的。最近由于项目的需要,得从.net平台转到C/C++领域,因此改变计划,探究C/C++领域的开源GIS软件。C/C++领域的开源GIS内容是非常丰富,典型的代表有GRASS、QGIS等,而其基本读写部分则是gdal\ogr的天下。gdal\ogr非常强大,可以读写180多种栅格和矢量的格式,存在C++,java,C#,python等多个版本。gdal是读写栅格格式的GIS库,而ogr则是矢量部分。与NTS和JTS对应,C++下的对应基本的空间分析库为geos,其与NTS和JTS接口基本可以一一对应。proj4则是最好开源投影库,gdal在使用了这两个库之后,我们惊奇地发现基本的gis功能已经满足了,有关gdal和ogr的更多内容可以参考李民录老师的博客http://blog.csdn.net/liminlu0314/article/category/777646。
好了,有了此利器之后,我们可以开始着手建立一个简单gis系统。参照官方的例子和sharpmap架构,封装一个ogr的读写的类,首先创建一个Provider接口,provider接口表示数据源,数据源有打开、关闭两个功能。
#pragma once
#include <string>
using namespace std;
namespace VMap
{
/************************************************************************/
/*
数据源类
class Provider
*/
/************************************************************************/
class Provider
{
public:
virtual ~Provider(){};
virtual bool open(const string& name)=0;
virtual bool close()=0;
};
}
接着创建一个矢量读写文件的接口,FeatureProvider
#pragma once
#include "Provider.h"
#include <ogrsf_frmts.h>
#include <ogr_feature.h>
using namespace std;
namespace VMap
{
typedef OGRLayer FeatureCursor;
class FeatureProvider:public Provider
{
public:
FeatureProvider(){};
virtual ~FeatureProvider(){};
virtual FeatureCursor* getFeatures()= 0;
virtual FeatureCursor* getFeatures(string& where)= 0;
virtual FeatureCursor* getFeatures(double minX,double maxX,double minY,double maxY)= 0;
virtual FeatureCursor* getFeatures(OGRGeometry* geometry)= 0;
virtual OGRFeature* getFeature(int id)= 0;
};
}
在此基础上,我们开始建立OGRProvider,封装OGR对其矢量数据进行读取
#pragma once
#include "FeatureProvider.h"
namespace VMap
{
class OGRFeatureProvider:public FeatureProvider
{
public:
OGRFeatureProvider();
~OGRFeatureProvider();
private:
OGRDataSource *_dataSource;
FeatureCursor *_cursor;
public:
virtual bool open(const string& name);
virtual bool close();
virtual FeatureCursor* getFeatures();
virtual FeatureCursor* getFeatures(string& where){return NULL;};
virtual FeatureCursor* getFeatures(double minX,double maxX,double minY,double maxY);
virtual FeatureCursor* getFeatures(OGRGeometry* geometry){return NULL;};
virtual OGRFeature* getFeature(int id){return NULL;};
};
}
#include "OGRFeatureProvider.h"
namespace VMap
{
OGRFeatureProvider::OGRFeatureProvider()
{
_dataSource = NULL;
}
OGRFeatureProvider::~OGRFeatureProvider()
{
if(_dataSource)
close();
}
bool OGRFeatureProvider::open( const string& name )
{
_dataSource = OGRSFDriverRegistrar::Open(name.c_str());
if(_dataSource)
{
_cursor = _dataSource->GetLayer(0);
return true;
}
return false;
}
bool OGRFeatureProvider::close()
{
OGRDataSource::DestroyDataSource(_dataSource);
return true;
}
FeatureCursor* OGRFeatureProvider::getFeatures()
{
_cursor->ResetReading();
int num = _cursor->GetFeatureCount();
return _cursor;
}
FeatureCursor* OGRFeatureProvider::getFeatures( double minX,double minY,double maxX,double maxY )
{
_cursor->ResetReading();
_cursor->SetSpatialFilterRect(minX,minY,maxX,maxY);
return _cursor;
}
有了这个类,我们可以读取shape文件了。gdal/ogr虽然好,无奈其终究是一个i/o的库,可视化部分还得自己动手,接下来准备做一个简单的地图渲染引擎,从而完善这个GIS系统。
好了,有了此利器之后,我们可以开始着手建立一个简单gis系统。参照官方的例子和sharpmap架构,封装一个ogr的读写的类,首先创建一个Provider接口,provider接口表示数据源,数据源有打开、关闭两个功能。
#pragma once
#include <string>
using namespace std;
namespace VMap
{
/************************************************************************/
/*
数据源类
class Provider
*/
/************************************************************************/
class Provider
{
public:
virtual ~Provider(){};
virtual bool open(const string& name)=0;
virtual bool close()=0;
};
}
接着创建一个矢量读写文件的接口,FeatureProvider
#pragma once
#include "Provider.h"
#include <ogrsf_frmts.h>
#include <ogr_feature.h>
using namespace std;
namespace VMap
{
typedef OGRLayer FeatureCursor;
class FeatureProvider:public Provider
{
public:
FeatureProvider(){};
virtual ~FeatureProvider(){};
virtual FeatureCursor* getFeatures()= 0;
virtual FeatureCursor* getFeatures(string& where)= 0;
virtual FeatureCursor* getFeatures(double minX,double maxX,double minY,double maxY)= 0;
virtual FeatureCursor* getFeatures(OGRGeometry* geometry)= 0;
virtual OGRFeature* getFeature(int id)= 0;
};
}
在此基础上,我们开始建立OGRProvider,封装OGR对其矢量数据进行读取
#pragma once
#include "FeatureProvider.h"
namespace VMap
{
class OGRFeatureProvider:public FeatureProvider
{
public:
OGRFeatureProvider();
~OGRFeatureProvider();
private:
OGRDataSource *_dataSource;
FeatureCursor *_cursor;
public:
virtual bool open(const string& name);
virtual bool close();
virtual FeatureCursor* getFeatures();
virtual FeatureCursor* getFeatures(string& where){return NULL;};
virtual FeatureCursor* getFeatures(double minX,double maxX,double minY,double maxY);
virtual FeatureCursor* getFeatures(OGRGeometry* geometry){return NULL;};
virtual OGRFeature* getFeature(int id){return NULL;};
};
}
#include "OGRFeatureProvider.h"
namespace VMap
{
OGRFeatureProvider::OGRFeatureProvider()
{
_dataSource = NULL;
}
OGRFeatureProvider::~OGRFeatureProvider()
{
if(_dataSource)
close();
}
bool OGRFeatureProvider::open( const string& name )
{
_dataSource = OGRSFDriverRegistrar::Open(name.c_str());
if(_dataSource)
{
_cursor = _dataSource->GetLayer(0);
return true;
}
return false;
}
bool OGRFeatureProvider::close()
{
OGRDataSource::DestroyDataSource(_dataSource);
return true;
}
FeatureCursor* OGRFeatureProvider::getFeatures()
{
_cursor->ResetReading();
int num = _cursor->GetFeatureCount();
return _cursor;
}
FeatureCursor* OGRFeatureProvider::getFeatures( double minX,double minY,double maxX,double maxY )
{
_cursor->ResetReading();
_cursor->SetSpatialFilterRect(minX,minY,maxX,maxY);
return _cursor;
}
有了这个类,我们可以读取shape文件了。gdal/ogr虽然好,无奈其终究是一个i/o的库,可视化部分还得自己动手,接下来准备做一个简单的地图渲染引擎,从而完善这个GIS系统。
相关文章推荐
- OGR注册OCI Spatial驱动以及gdal源码调试问题
- GIS是怎样建成的之三:图形,图形,我们去哪里呀(区域树部分)
- 【GIS】GDAL之OGR入门
- GIS是怎样建成的系列之一:从图形开始
- GIS是怎样建成的之五:瓦片(Tile)
- GIS是怎样建成的系列之二:图形,图形,我们去哪里呀(四叉树部分)
- linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)
- 怎样获得documents文件夹以及为文件改名
- 在linux中怎样用命令完全拷贝一个目录下的所有文件(包括隐藏文件以及文件夹)到另外一个目录下
- 流程管理系统主要作用是什么,以及怎样选择业务架构?
- Java UI 是怎样演变的以及它的前景如何?
- SQL SERVER的数据类型以及怎样建立备注型字段?
- C#中怎样使控件随着窗体一起变化大小(常见困难以及修正)
- Python与开源GIS:GDAL简介<转载>
- 怎样高效掌握编程语言以及算法(突然间觉悟)
- Android之Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头
- asp.net中gridview导出excel方法以及怎样修改导出的日期格式
- 由浅入深分布式(5)dubbo提供者用内网地址注册provider以及 spring boot admin client用主机名注册spring boot admin server
- Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头
- Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件