使用GDAL/OGR讀取OGRMultiLineString類型數據

最近在開發的時候遇到需要將shp線數據轉爲點數據,也就是要把線上的系列點座標讀取出來,通常用arcgis能完成操作,但在開發中只能通過代碼實現,在AE二次中有專門的類和接口,但用C++進行的二次開發就不那麼好辦,查閱發現GDAL/OGR可以幫助完成此項工作,這裏與大家分享結果。

#include <iostream>
#include <QString>
#include <vector>
#include <QVector>

#include "gdal.h"
#include "gdal_priv.h"
#include "gdal_version.h"
#include "ogrsf_frmts.h"

using namespace std;

void Roam::GetPoints()
{
    GDALAllRegister();
    OGRRegisterAll();
    GDALDataset *poDS;
    poDS=(GDALDataset*);        
    GDALOpenEx("line.shp",GDAL_OF_VECTOR,NULL,NULL,NULL);

    if(poDS==NULL)
    {
        cout<<"open failed "<<endl;
    }else{
        cout<<"is not null"<<endl;
    }

    OGRLayer *poLayer;
    OGRFeature *poFeature;
    OGRGeometry *poGeometry;

    poLayer=poDS->GetLayer(0);

    poFeature=poLayer->GetNextFeature();
    poGeometry=poFeature->GetGeometryRef();

    //判斷類型,這裏wkbMultiLineString表示的是MultiLineString型
    if(poGeometry!=NULL&&wkbFlatten(poGeometry->getGeometryType())==wkbMultiLineString)
    {
        OGRMultiLineString *poMultiLineString=(OGRMultiLineString*)poGeometry;
        int nGeoCount=poMultiLineString->getNumGeometries();
        cout<<"poGeometry IS NOT NULL"<<endl;
        cout<<nGeoCount<<endl;

        OGRGeometry *poLineGeometry;
        vector<double> arryX;
        vector<double>arryY;
        for(int iLine=0;iLine<nGeoCount;iLine++)
        {
            poLineGeometry=poMultiLineString->getGeometryRef(iLine);
            OGRLineString* poLineString=(OGRLineString*)poLineGeometry;

            int nnCount=poLineString->getNumPoints();

            double x,y;
            for(int i=0;i<nnCount;i++)
            {
                x=poLineString->getX(i);
                y=poLineString->getY(i);

                arryX.push_back(x);
                arryY.push_back(y);

//                cout<<"X:"<<x<<",  Y:"<<y<<endl;
//                cout<<"arryX:"<<arryX.size()<<",  "<<"arryY:"<<arryY.size()<<endl;
//                cout<<"nnCount:"<<nnCount<<endl;
            }
//            cout<<"iLine:"<<iLine<<endl;

        }
    }else{
        cout<<"poGeometry IS NULL"<<endl;
    }


}

 

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