GDAL矢量驅(qū)動拓展

GDAL

GDAL文檔
GDAL下載
GDAL開發(fā)依賴下載
GDAL是一個用于柵格和矢量地理空間數(shù)據(jù)格式的轉(zhuǎn)換庫,采用MIT開源許可躬络,由開源地理空間基金會發(fā)布与柑。它為調(diào)用程序提供了柵格抽象數(shù)據(jù)模型和矢量抽象數(shù)據(jù)模型并包含所有支持的格式粮揉。它還提供了一些實用的命令行程序用于數(shù)據(jù)轉(zhuǎn)換和處理凛辣。

OGR

OGR是GDAL項目的一個分支,功能與GDAL類似驾窟,只不過它提供對矢量數(shù)據(jù)的讀寫支持舆床,包括ESRI Shapefiles,PostGIS等雅倒。

矢量數(shù)據(jù)模型(Vector Data Model)

OGR為矢量數(shù)據(jù)提供了矢量數(shù)據(jù)模型璃诀。

類概況

  • 幾何圖形(ogr_geometry.h):幾何類(OGRGeometry等),封裝了OpenGIS模型矢量數(shù)據(jù)并提供一些幾何操作蔑匣,以及對WKB和WKT的轉(zhuǎn)換劣欢。幾何圖形包含了空間參考系。


    geometry模型.png
  • 空間參考(ogr_spatialref.h):OGRSpatialRefence類裁良,封裝了投影和基準(zhǔn)的定義凿将。
  • 要素(ogr_feature.h):OGRFeature類,封裝了feature的定義价脾,包括一個幾何和屬性牧抵。
  • 要素類定義(ogr_feature.h):OGRFeatureDefn類,將一組相關(guān)要素(一個Layer)的概要數(shù)據(jù)進(jìn)行封裝侨把,包括了集合類型犀变、名稱、屬性域定義等秋柄。
  • 圖層(ogrsf_frmts.h):OGRLayer類获枝,一個抽象基類,代表了GDALDataset中的一個要素圖層骇笔。
  • 數(shù)據(jù)集(gdal_priv.h):GDALDataset類映琳,包含一個或多個OGRLayer對象的類,其通常代表一個文件或數(shù)據(jù)庫蜘拉。
  • 驅(qū)動(gdal_priv.h):GDALDriver類萨西,為特定格式提供驅(qū)動,用以打開特定格式的數(shù)據(jù)得到GDALDataset旭旭,如ESRI Shapefile谎脯、PostGIS。所有的驅(qū)動都被GDALDriverManager管理持寄。

體系架構(gòu):


體系架構(gòu).png

矢量驅(qū)動程序?qū)崿F(xiàn)

  • 在程序中實現(xiàn)矢量驅(qū)動時源梭,程序版本需與gdal庫版本一致娱俺,如release版的gdal庫,編譯程序時也應(yīng)為release版废麻。

通過實現(xiàn)特定格式的驅(qū)動荠卷,來為OGR加入新的格式支持。這需要實例化GDALDriver類并實現(xiàn)GDALDatasetOGRLayer的子類烛愧。GDALDriver實例需要在運行時通過GDALDriverManager進(jìn)行注冊油宜。

1.實現(xiàn)GDALDriver

特定格式的驅(qū)動程序類是作為GDALDriver的實例實現(xiàn)的。通常會創(chuàng)建一個GDALDriver實例并通過GDALDeiverManager進(jìn)行注冊怜姿。而實例化過程由一個全局C函數(shù)進(jìn)行處理慎冤。該函數(shù)由自己實現(xiàn)并在內(nèi)部實例化一個GDALDriver對象。

void registerOGRSPF()
{
    if( GDALGetDriverByName("SPF") != NULL )
        return;

    GDALDriver *poDriver = new GDALDriver();

    poDriver->SetDescription("SPF");
    poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Long name for SPF driver");
    poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "spf");
    poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drv_spf.html");

    // 為GDALDriver設(shè)置函數(shù)指針
    poDriver->pfnOpen = OGRSPFDriverOpen;
    poDriver->pfnIdentify = OGRSPFDriverIdentify;
    poDriver->pfnCreate = OGRSPFDriverCreate;

    poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");

    GetGDALDriverManager()->RegisterDriver(poDriver);
}

SetDescription("SPF")指定了驅(qū)動程序的名稱沧卢。
SetMetadataItem( const char * pszName, const char * pszValue)設(shè)置驅(qū)動的元數(shù)據(jù)信息:

  • GDAL_DCAP_VECTOR:設(shè)置為"YES"表示驅(qū)動程序?qū)⑻幚硎噶繑?shù)據(jù)蚁堤。
  • GDAL_DCAP_VIRTUALIO:設(shè)置為"YES"表示驅(qū)動程序可以處理使用VSI*L GDAL API打開的文件。否則不應(yīng)定義此元數(shù)據(jù)項但狭。
  • GDAL_DMD_LONGNAME:文件格式的詳細(xì)描述披诗,長度一般在50-60個字符。(手工設(shè)置)
  • GDAL_DMD_HELPTOPIC:URL立磁,相對于http://gdal.ogr/如果有的話藤巢, 是關(guān)于這個驅(qū)動幫助文檔的名稱。(可選)
  • GDAL_DMD_EXTENSION:該類型文件的擴(kuò)展名息罗。如果擴(kuò)展名多于一個掂咒,則最好選擇最通用的那個,或者直接為空迈喉。(可選)
  • GDAL_DMD_MIMETYPE:該格式數(shù)據(jù)的標(biāo)準(zhǔn)用途類型绍刮,例如“image/png”。(可選)
  • GDAL_DMD_CREATIONOPTIONLIST:用于描述創(chuàng)建時的選項挨摸『⒏铮可以參考geotiff驅(qū)動的實現(xiàn)代碼。(可選)
  • GDAL_DMD_CREATIONDATATYPES:支持創(chuàng)建數(shù)據(jù)集的全部類型列表得运。如果存在Create()方法這些類型都將被支持膝蜈。如果存在CreateCopy()方法,該類型列表將是那些支持無損輸出的類型熔掺。比如饱搏,一個格式使用了CreateCopy()方法,如果可以寫為Float32類型置逻,那么Byte推沸、Int16和UInt16都應(yīng)該被支持(因為它們都可以用Float32表示)

將自定義的實現(xiàn)函數(shù)賦值給GDALDriver的函數(shù)指針,通過調(diào)用GDALDriver的函數(shù)指針,以下函數(shù)被具體執(zhí)行:

static GDALDataset* OGRSPFDriverOpen(GDALOpenInfo* poOpenInfo);
static int          OGRSPFDriverIdentify(GDALOpenInfo* poOpenInfo);
static GDALDataset* OGRSPFDriverCreate(const char* pszName, int nXSize, int nYSize,
                                    int nBands, GDALDataType eDT, char** papszOptions);

Open()方法用于打開數(shù)據(jù)源并返回一個GDALDataset實例鬓催,通常被委托給實際的GDALDataset子類肺素,即在內(nèi)部調(diào)用GDALDataset子類實例的Open()方法。

static GDALDataset *OGRSPFDriverOpen( GDALOpenInfo* poOpenInfo )
{
    if( !OGRSPFDriverIdentify(poOpenInfo) )
        return NULL;

    OGRSPFDataSource *poDS = new OGRSPFDataSource();
    if( !poDS->Open(poOpenInfo->pszFilename, poOpenInfo->eAccess == GA_Update) )
    {
        delete poDS;
        return NULL;
    }

    return poDS;
}

Identify()方法可以對數(shù)據(jù)源進(jìn)行校驗宇驾,判斷是否是合格數(shù)據(jù)源倍靡。

static int OGRSPFDriverIdentify( GDALOpenInfo* poOpenInfo )
{
    // Does this appear to be an .spf file?
    return EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "spf");
}

create()在用于創(chuàng)建數(shù)據(jù),如該驅(qū)動用于驅(qū)動文件類型的數(shù)據(jù)時课舍,則可在create()中實現(xiàn)文件的創(chuàng)建塌西。

2.實現(xiàn)GDALDataset子類

GDALDataset子類以一個vector保存多個Layer數(shù)據(jù)。

class OGRSPFDataSource : public GDALDataset
{
    std::vector<OGRSPFLayer*>   papoLayers;
    int                 nLayers;

public:
  OGRSPFDataSource();
  ~OGRSPFDataSource();

    int                 Open( const char *pszFilename, int bUpdate );

    int                 GetLayerCount() { return nLayers; }
    OGRLayer            *GetLayer( int );

    int                 TestCapability( const char * ) { return FALSE; }
};

Open()方法將會訪問數(shù)據(jù)源信息并創(chuàng)建OGRLayer的子類對象布卡,在實現(xiàn)OGRLayer的子類時雨让,訪問數(shù)據(jù)源信息雇盖,并獲取要素數(shù)據(jù)忿等。

int  OGRSPFDataSource::Open( const char *pszFilename, int bUpdate )
{
    if( bUpdate )
    {
        CPLError(CE_Failure, CPLE_OpenFailed,
                "Update access not supported by the SPF driver.");
        return FALSE;
    }

    // Create a corresponding layer.s
    nLayers = 1;

    papoLayers.append(new OGRSPFLayer(pszFilename));

    pszName = CPLStrdup(pszFilename);

    return TRUE;
}

3.實現(xiàn)OGRLayer子類

自定義OGRSPFLayer類繼承自O(shè)GRLayer。在內(nèi)部擁有OGRFeatureDefn成員變量崔挖,以便訪問該圖層的元數(shù)據(jù)信息贸街。

OGRLayer中的純虛函數(shù)有:

  • virtual void ResetReading() = 0;
  • virtual OGRFeature *GetNextFeature() CPL_WARN_UNUSED_RESULT = 0;
  • virtual OGRFeatureDefn *GetLayerDefn() = 0;
  • virtual int TestCapability( const char * ) = 0;
class OGRSPFLayer : public OGRLayer
{
    OGRFeatureDefn     *poFeatureDefn;
    FILE               *fp;
    int                 nNextFID;

public:
    OGRSPFLayer( const char *pszFilename );
    ~OGRSPFLayer();

    void                ResetReading();
    OGRFeature *        GetNextFeature();

    OGRFeatureDefn *    GetLayerDefn() { return poFeatureDefn; }

    int                 TestCapability( const char * ) { return FALSE; }
};

類內(nèi)部的OGRFeatureDefn將被多個OGRFeature引用,所有在該類的構(gòu)造函數(shù)和析構(gòu)函數(shù)中也應(yīng)通過OGRFeatureDefn::Reference()OGRFeatureDefn::Release()對OGRFeatureDefn對象進(jìn)行引用計數(shù)的+1和-1

OGRSPFLayer::OGRSPFLayer( const char *pszFilename )
{
    nNextFID = 0;

    poFeatureDefn = new OGRFeatureDefn(CPLGetBasename(pszFilename));
    SetDescription(poFeatureDefn->GetName());
    poFeatureDefn->Reference();
    poFeatureDefn->SetGeomType(wkbPoint);

    OGRFieldDefn oFieldTemplate("Name", OFTString);

    poFeatureDefn->AddFieldDefn(&oFieldTemplate);

    fp = VSIFOpenL(pszFilename, "r");
    if( fp == NULL )
        return;
}
OGRSPFLayer::~OGRSPFLayer()
{
    poFeatureDefn->Release();
    if( fp != NULL )
        VSIFCloseL(fp);
}

重寫GetNextFeature()狸相,在函數(shù)體內(nèi)訪問數(shù)據(jù)源獲取到每一個feature的信息薛匪,并創(chuàng)建OGRFeature對象后返回。

OGRFeature *OGRSPFLayer::GetNextFeature()
{
  /* 從數(shù)據(jù)源獲取到下一個feature的數(shù)據(jù) */
  ......
  {
    OGRFeature *poFeature = new OGRFeature(poFeatureDefn);

    poFeature->SetGeometryDirectly(new OGRPoint(dfX, dfY));
    poFeature->SetField(0, pszName);
    poFeature->SetFID(nNextFID++);
    if(/*match*/)
    {
      return poFeature;
    }
    else
    {
      delete poFeature;
    }
  }

}

OGRLayer基類擁有成員變量:OGRLayer::m_poFilterGeomOGRLayer::m_poAttrQuery分別對幾何和屬性進(jìn)行過濾脓鹃,以便篩選出符合要求的feature逸尖,可以在GetNextFeature()方法中進(jìn)行判斷:

        if( (m_poFilterGeom == NULL ||
            FilterGeometry(poFeature->GetGeometryRef())) &&
            (m_poAttrQuery == NULL ||
            m_poAttrQuery->Evaluate(poFeature)) )
            return poFeature;

        delete poFeature;

重寫OGRLayer::ResetReading(),在函數(shù)體內(nèi)重置feature的索引瘸右,代表重新獲取feature娇跟,與OGRLayer::GetNextFeature()聯(lián)動。

void OGRSPFLayer::ResetReading()
{
    VSIFSeekL(fp, 0, SEEK_SET);
    nNextFID = 0;
}

4.GDALDataset虛函數(shù)

重點實現(xiàn):

  • virtual int GetLayerCount();
    獲取圖層數(shù)量太颤,默認(rèn)實現(xiàn)返回0苞俘。
  • virtual OGRLayer *GetLayer(int iLayer);
    根據(jù)下標(biāo)獲取圖層,默認(rèn)實現(xiàn)返回nullptr龄章。
  • virtual OGRLayer *GetLayerByName(const char *);
    根據(jù)圖層名稱返回圖層吃谣,默認(rèn)實現(xiàn)會根據(jù)GetLayerCount()GetLayer()遍歷所有圖層做裙,并比較圖層名后返回岗憋。其首先會大小寫敏感判斷圖層名,如果沒有符合的圖層锚贱,會用大小寫不敏感去匹配圖層名澜驮。
  • virtual OGRErr DeleteLayer(int iLayer);
    根據(jù)下標(biāo)刪除指定圖層,默認(rèn)實現(xiàn)為空邏輯惋鸥。
  • virtual void ResetReading();
    重置feature的讀取為從第一個feature開始杂穷,該函數(shù)會影響GetNextFeature()悍缠。
  • virtual OGRFeature* GetNextFeature( OGRLayer** ppoBelongingLayer, double* pdfProgressPct, GDALProgressFunc pfnProgress, void* pProgressData );
    通過循環(huán)圖層,獲取每個圖層的feature耐量,會調(diào)用圖層的GetNextFeature()方法飞蚓。
  • virtual int TestCapability( const char * );
    判斷該數(shù)據(jù)源是否有某一功能,默認(rèn)實現(xiàn)為返回false廊蜒。傳入的字符串有:
 <ul>
  <li> <b>ODsCCreateLayer</b>: True if this datasource can create new layers.<p>
  <li> <b>ODsCDeleteLayer</b>: True if this datasource can delete existing
          layers.<p>
  <li> <b>ODsCCreateGeomFieldAfterCreateLayer</b>: True if the layers of this
          datasource support CreateGeomField() just after layer creation.<p>
  <li> <b>ODsCCurveGeometries</b>: True if this datasource supports curve
          geometries.<p>
  <li> <b>ODsCTransactions</b>: True if this datasource supports (efficient)
          transactions.<p>
  <li> <b>ODsCEmulatedTransactions</b>: True if this datasource supports
          transactions through emulation.<p>
  <li> <b>ODsCRandomLayerRead</b>: True if this datasource has a dedicated
          GetNextFeature() implementation, potentially returning features from
          layers in a non sequential way.<p>
  <li> <b>ODsCRandomLayerWrite</b>: True if this datasource supports calling
         CreateFeature() on layers in a non sequential way.<p>
 </ul>o
  • virtual bool AddFieldDomain(std::unique_ptr<OGRFieldDomain>&& domain, std::string& failureReason);
    向數(shù)據(jù)集添加字段域趴拧,默認(rèn)實現(xiàn)是空邏輯。
  • virtual bool DeleteFieldDomain(const std::string& name, std::string& failureReason);
    根據(jù)名稱刪除指定的字段域山叮,默認(rèn)實現(xiàn)是空邏輯著榴。
  • virtual bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain>&& domain, std::string& failureReason);
    通過替換定義更新一個已經(jīng)存在的字段域,將通過字段域的名稱去匹配屁倔,默認(rèn)實現(xiàn)是空邏輯脑又。
  • virtual OGRLayer *ICreateLayer( const char *pszName, OGRSpatialReference *poSpatialRef = nullptr, OGRwkbGeometryType eGType = wkbUnknown, char ** papszOptions = nullptr );
    創(chuàng)建圖層,默認(rèn)實現(xiàn)是返回nullptr锐借,該接口為protected问麸。

非重點實現(xiàn):

  • virtual void FlushCache(bool bAtClosing = false);
    將所有緩存數(shù)據(jù)寫入硬盤,默認(rèn)實現(xiàn)是調(diào)用每個raster bands的FlushCache()和每個Layer的SyncToDisk()钞翔。
  • virtual const OGRSpatialReference* GetSpatialRef() const;
    獲取數(shù)據(jù)集的空間參考系严卖,默認(rèn)實現(xiàn)是返回nullptr
  • virtual CPLErr SetSpatialRef(const OGRSpatialReference* poSRS);
    為數(shù)據(jù)集設(shè)置空間參考系布轿,默認(rèn)實現(xiàn)為空邏輯哮笆。
  • virtual CPLErr GetGeoTransform( double * padfTransform );
  • virtual CPLErr SetGeoTransform( double * padfTransform );
  • virtual void *GetInternalHandle( const char * pszHandleName );
    獲取內(nèi)部特定格式的有意義句柄,默認(rèn)實現(xiàn)返回nullptr汰扭。
  • virtual GDALDriver *GetDriver(void);
    有默認(rèn)實現(xiàn)稠肘。
  • virtual const char* GetDriverName();
    有默認(rèn)實現(xiàn)。
  • virtual char **GetFileList(void);
  • virtual const OGRSpatialReference* GetGCPSpatialRef() const;
    返回地理轉(zhuǎn)換控制點的坐標(biāo)系东且,默認(rèn)實現(xiàn)返回nullptr
  • virtual int GetGCPCount();
    獲取地理轉(zhuǎn)換控制點數(shù)量启具,默認(rèn)實現(xiàn)返回0。
  • virtual const GDAL_GCP *GetGCPs();
    默認(rèn)實現(xiàn)返回nullptr珊泳。
  • virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList, const OGRSpatialReference * poGCP_SRS );
  • virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize, int nBufXSize, int nBufYSize, GDALDataType eDT, int nBandCount, int *panBandList, char **papszOptions );
  • virtual CPLErr CreateMaskBand( int nFlagsIn );
  • virtual GDALAsyncReader* BeginAsyncReader(int nXOff, int nYOff, int nXSize, int nYSize, void *pBuf, int nBufXSize, int nBufYSize, GDALDataType eBufType, int nBandCount, int* panBandMap, int nPixelSpace, int nLineSpace, int nBandSpace, char **papszOptions);
  • virtual void EndAsyncReader(GDALAsyncReader *);
  • virtual bool GetRawBinaryLayout(RawBinaryLayout&);
    獲取數(shù)據(jù)集中原始二進(jìn)制格式的圖層鲁冯,默認(rèn)實現(xiàn)為返回空。
  • virtual void ClearStatistics();
  • virtual bool IsLayerPrivate(int iLayer) const;
    通過下標(biāo)判斷該圖層是否是私有圖層色查,默認(rèn)實現(xiàn)返回false薯演。
  • virtual std::vector<std::string> GetFieldDomainNames(CSLConstList papszOptions = nullptr) const;
    返回字段域的名稱列表,默認(rèn)實現(xiàn)是從成員變量m_oMapFieldDomains中取出所有的key秧了。
  • virtual const OGRFieldDomain* GetFieldDomain(const std::string& name) const;
    根據(jù)名稱獲取字段域跨扮,默認(rèn)實現(xiàn)是從成員變量m_oMapFieldDomains中查找。
  • virtual OGRLayer *CreateLayer( const char *pszName, OGRSpatialReference *poSpatialRef = nullptr, OGRwkbGeometryType eGType = wkbUnknown, char ** papszOptions = nullptr );
    創(chuàng)建新圖層,默認(rèn)實現(xiàn)是委托給ICreateLayer()衡创,而ICreateLayer()的默認(rèn)實現(xiàn)是空邏輯帝嗡。
  • virtual OGRLayer *CopyLayer( OGRLayer *poSrcLayer, const char *pszNewName, char **papszOptions = nullptr );
    復(fù)制一個已存在的圖層,有默認(rèn)實現(xiàn)璃氢,新圖層的創(chuàng)建由ICreateLayer()完成哟玷,之后將原圖層的各項數(shù)據(jù)復(fù)制給新圖層。
  • virtual OGRStyleTable *GetStyleTable();
    獲取數(shù)據(jù)集的樣式表一也,默認(rèn)實現(xiàn)是返回成員變量m_poStyleTable巢寡。
  • virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
    直接設(shè)置樣式表,默認(rèn)實現(xiàn)是將形參直接賦值給成員變量m_poStyleTable椰苟。
  • virtual void SetStyleTable(OGRStyleTable *poStyleTable);
    設(shè)置樣式表抑月,默認(rèn)實現(xiàn)會先delete原指針,后執(zhí)行OGRStyleTable::Clone()舆蝴。
  • virtual OGRLayer * ExecuteSQL( const char *pszStatement, OGRGeometry *poSpatialFilter, const char *pszDialect );
    對數(shù)據(jù)源執(zhí)行SQL語句谦絮,返回執(zhí)行后得到的圖層,有默認(rèn)實現(xiàn)须误。
  • virtual void ReleaseResultSet( OGRLayer * poResultsSet );
    釋放ExecuteSQL()后得到的結(jié)果挨稿,默認(rèn)實現(xiàn)是直接delete形參仇轻。
  • virtual OGRErr AbortSQL( );
  • virtual OGRErr StartTransaction(int bForce=FALSE);
  • virtual OGRErr CommitTransaction();
  • virtual OGRErr RollbackTransaction();
    以上API提供數(shù)據(jù)集級別的事務(wù)機制京痢,可參考GDAL的RFC 54
  • virtual std::shared_ptr<GDALGroup> GetRootGroup() const;
    默認(rèn)實現(xiàn)返回nullptr

5.OGRLayer虛函數(shù)

重點實現(xiàn):

  • virtual OGRErr ISetFeature( OGRFeature *poFeature ) CPL_WARN_UNUSED_RESULT;
    默認(rèn)實現(xiàn)為空邏輯,該接口為protected篷店。
  • virtual OGRErr ICreateFeature( OGRFeature *poFeature ) CPL_WARN_UNUSED_RESULT;
    創(chuàng)建要素祭椰,默認(rèn)實現(xiàn)為空邏輯,該接口為protected疲陕。
  • virtual void ResetReading() = 0;
    重置feature的遍歷方淤。
  • virtual OGRFeature *GetNextFeature() CPL_WARN_UNUSED_RESULT = 0;
    獲取下一個feature。
  • virtual OGRErr DeleteFeature( GIntBig nFID ) CPL_WARN_UNUSED_RESULT;
    刪除feature蹄殃,默認(rèn)實現(xiàn)為空邏輯携茂。
  • virtual OGRFeatureDefn *GetLayerDefn() = 0;
    獲取圖層定義,返回的是OGRFeatureDefn 對象诅岩。
  • virtual GIntBig GetFeatureCount( int bForce = TRUE );
    獲取feature數(shù)量讳苦,默認(rèn)實現(xiàn)為遍歷所有feature進(jìn)行計數(shù),計數(shù)完畢后會并調(diào)用ResetReading();
  • virtual int TestCapability( const char * ) = 0;
    驗證Layer是否具有某能力吩谦,如創(chuàng)建feature鸳谜、刪除feature等。
  • virtual OGRErr Rename( const char* pszNewName ) CPL_WARN_UNUSED_RESULT;
    重命名圖層式廷,默認(rèn)實現(xiàn)為空邏輯咐扭,根據(jù)ogrlayer.cpp中的描述,該方法的實現(xiàn)只存在于暴露了OLCRename能力的Layer和GDAL_DCAP_RENAME_LAYERS能力的驅(qū)動,如果數(shù)據(jù)集中已有同名Layer蝗肪,應(yīng)該返回False袜爪。
  • virtual OGRErr CreateField( OGRFieldDefn *poField, int bApproxOK = TRUE );
    創(chuàng)建域,默認(rèn)實現(xiàn)為空邏輯薛闪。
  • virtual OGRErr DeleteField( int iField );
    刪除域饿敲,默認(rèn)實現(xiàn)為空邏輯。
  • virtual OGRErr ReorderFields( int* panMap );
    重排序域逛绵,默認(rèn)實現(xiàn)為空邏輯怀各。
  • virtual OGRErr AlterFieldDefn( int iField, OGRFieldDefn* poNewFieldDefn, int nFlagsIn );
    修改域定義,默認(rèn)實現(xiàn)為空邏輯术浪。
  • virtual OGRErr CreateGeomField( OGRGeomFieldDefn *poField, int bApproxOK = TRUE );
    創(chuàng)建幾何域瓢对,默認(rèn)實現(xiàn)為空邏輯。

非重點實現(xiàn):

  • virtual OGRGeometry *GetSpatialFilter();
    獲取空間過濾幾何胰苏,默認(rèn)實現(xiàn)為返回成員變量m_poFilterGeom硕蛹。
  • virtual void SetSpatialFilter( OGRGeometry * );
    設(shè)置空間過濾,默認(rèn)實現(xiàn)會委托給InstallFilter()硕并,并調(diào)用ResetReading()法焰。
  • virtual void SetSpatialFilterRect( double dfMinX, double dfMinY, double dfMaxX, double dfMaxY );
    設(shè)置空間過濾矩形,默認(rèn)實現(xiàn)會構(gòu)造一個矩形后倔毙,調(diào)用SetSpatialFilter()埃仪。
  • virtual OGRErr SetAttributeFilter( const char * );
    設(shè)置屬性過濾,有默認(rèn)實現(xiàn)陕赃。
  • virtual OGRErr SetNextByIndex( GIntBig nIndex );
    通過下標(biāo)設(shè)置下一個返回的feature卵蛉,即GetNextFeature()的返回值,有默認(rèn)實現(xiàn)么库。
  • virtual OGRFeature *GetFeature( GIntBig nFID ) CPL_WARN_UNUSED_RESULT;
    根據(jù)nFID獲取feature對象傻丝。有默認(rèn)實現(xiàn)。
  • virtual const char *GetName();
    獲取圖層名诉儒,默認(rèn)實現(xiàn)委托給GetLayerDefn()->GetName()葡缰。
  • virtual OGRwkbGeometryType GetGeomType();
    獲取幾何類型,默認(rèn)實現(xiàn)委托給GetLayerDefn()->GetGeomType()忱反。
  • virtual int FindFieldIndex( const char *pszFieldName, int bExactMatch );
    根據(jù)名稱獲取域下標(biāo)泛释,默認(rèn)實現(xiàn)委托給GetLayerDefn()->GetFieldIndex( pszFieldName )
  • virtual OGRSpatialReference *GetSpatialRef();
    獲取空間參考系缭受,默認(rèn)實現(xiàn)委托給GetLayerDefn()->GetGeomFieldDefn(0)->GetSpatialRef()胁澳。
  • virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) CPL_WARN_UNUSED_RESULT;
    獲取范圍,默認(rèn)實現(xiàn)是委托給GetExtentInternal()米者。GetExtentInternal()會遍歷feature韭畸,并匯總feature的幾何后得出矩形范圍宇智,最后會調(diào)用`ResetReading()``。
  • virtual OGRErr SyncToDisk();
    將緩存數(shù)據(jù)同步到硬盤胰丁,默認(rèn)實現(xiàn)為空邏輯随橘。
  • virtual OGRStyleTable *GetStyleTable();
    獲取樣式表,默認(rèn)實現(xiàn)為返回成員變量m_poStyleTable锦庸。
  • virtual void SetStyleTableDirectly( OGRStyleTable *poStyleTable );
    直接設(shè)置樣式表机蔗,默認(rèn)實現(xiàn)為將形參賦值給成員變量m_poStyleTable
  • virtual void SetStyleTable(OGRStyleTable *poStyleTable);
    設(shè)置樣式表甘萧,默認(rèn)實現(xiàn)為delete成員變量m_poStyleTable萝嘁,之后調(diào)用OGRStyleTable::Clone()
  • virtual OGRErr StartTransaction() CPL_WARN_UNUSED_RESULT;
    開啟事務(wù)扬卷,默認(rèn)實現(xiàn)為空邏輯牙言。
  • virtual OGRErr CommitTransaction() CPL_WARN_UNUSED_RESULT;
    提交事務(wù),默認(rèn)實現(xiàn)為空邏輯怪得。
  • virtual OGRErr RollbackTransaction();
    回滾咱枉,默認(rèn)實現(xiàn)為空邏輯。
  • virtual const char *GetFIDColumn();
    獲取FID列名徒恋,默認(rèn)實現(xiàn)為返回空字符串蚕断。
  • virtual const char *GetGeometryColumn();
    獲取幾何列,默認(rèn)實現(xiàn)委托給GetLayerDefn()->GetGeomFieldDefn(0)->GetNameRef()入挣。
  • virtual OGRErr SetIgnoredFields( const char **papszFields );
    設(shè)置忽略的域亿乳,有默認(rèn)實現(xiàn)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财岔,一起剝皮案震驚了整個濱河市风皿,隨后出現(xiàn)的幾起案子河爹,更是在濱河造成了極大的恐慌匠璧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咸这,死亡現(xiàn)場離奇詭異夷恍,居然都是意外死亡,警方通過查閱死者的電腦和手機媳维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門酿雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侄刽,你說我怎么就攤上這事指黎。” “怎么了州丹?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵醋安,是天一觀的道長杂彭。 經(jīng)常有香客問我,道長吓揪,這世上最難降的妖魔是什么亲怠? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮柠辞,結(jié)果婚禮上团秽,老公的妹妹穿的比我還像新娘。我一直安慰自己叭首,他們只是感情好习勤,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焙格,像睡著了一般姻报。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上间螟,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天吴旋,我揣著相機與錄音,去河邊找鬼厢破。 笑死荣瑟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摩泪。 我是一名探鬼主播笆焰,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼见坑!你這毒婦竟也來了嚷掠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荞驴,失蹤者是張志新(化名)和其女友劉穎不皆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊楼,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡霹娄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲫骗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犬耻。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篡腌,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布计济,位于F島的核電站晴楔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏峭咒。R本人自食惡果不足惜税弃,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凑队。 院中可真熱鬧则果,春花似錦、人聲如沸漩氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叫惊。三九已至款青,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霍狰,已是汗流浹背抡草。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔗坯,地道東北人康震。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像宾濒,于是被迫代替她去往敵國和親腿短。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容