您的位置:首页 > 编程语言 > C语言/C++

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系统。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdal c c++ 开源 GIS
相关文章推荐