GIS是怎樣建成的之四:gdal\ogr以及provider

      好久沒寫這個系列的博客了,原先打算研究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系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章