使用GDAL/OGR读取OGRMultiLineString类型数据

10 篇文章 0 订阅
3 篇文章 0 订阅

最近在开发的时候遇到需要将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;
    }


}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值