使用C++读取点shp文件的坐标

加载ogrsf_fmt矢量处理库

#include<ogrsf_fmt>

读取点矢量文件

void ProcessOfPoint(const char *point_file){
    //打开注册机
    GDALAllRegister();
    GDALDataset* poDS;

    poDS=(GDALDataset*) OpenEx(point_file,GDAL_OF_VECTOR,NULL,NULL,NULL);
    if(poDS == NULL){
        printf("打开文件失败!\n");
        exit(1) //正常退出
    }
}

需要注意的是,别忘了打开支持所有文件格式的注册函数,这里是为了省事使用GDALAllRegister()函数。

读取shp文件

按照shp文件格式去逐层读取信息,主要逻辑就是 layer -> feature -> field -> geometry,就是图层 -> 要素 -> 属性段 -> 几何体。举个例子我只有一个有五十个点的shp文件,shp文件一般就是只有一个图层,而栅格数据,比如TIFF格式数据有很多个波段时,就会有好几个图层,这个要素就是指的是某一个点对象了,这个点对象有属性和几何体两个重要性质,属性描述状态或者质量,几何体描述其形状,当然点的形状就是点,没什么可以解释的,但是线段和面是有形状的。OK,介绍到这里,应该明白了shp文件的基本组成形式。

//查询图层
OGRLayer* poLayer
poLayer=poDS->GetLayer(0);  //安装图层索引去查询,当然还有按照图层名称去查询的GetLayerByName("图层名称")

//查询要素
OGRFeature* poFeature;
//重置图层,使其从头开始
poLayer->ResetReading();
while((poFeature=poLayer->GetNextFeature())!=NULL){
    for(auto &&oField:*poFeature){
        if(oField.IsNull()){
            printf("该要素的该属性字段为null");
            continue;
        }
        switch(oField.GetType()){
            case OFTInteger:  printf("%d ", oField.GetAsInteger());
            break;
            case OFTInteger64:   printf(CPL_FRMT_GIB",", oField.GetAsInteger64());
            break;
            case OFTReal:   printf("%3f  ", oField.GetAsDouble());
            break;
            case  OFTString: printf("%s  ", oField.GetAsString());
            break;
            default:printf("%s   ", oField.GetAsString());//这个GetAsString()无论原本属性字段类型是什么样的都可以将其转换为 sting。
            break;
        }
    }
        }

获取坐标

OGRGeometry* poGeometry;
poGemetry=poFeature->GetGeometryRef
if(poGeometry!=NULL && wkbFlatten(poGeometry-getGeometryType()==wkbPoint)){
    OGRPoint* Point=poGeimetry->toPoint();
    printf("%.3f:%.3f\n",Point->getX(),Point->getY());
}
else
printf("没有查询到点要素\n");

关闭文件

//要素使用完后,要立马摧毁掉

OGRFeature::DestroyFeature( poFeature );

最后不要忘记关闭文件,以防出错

GDALClose(poDS);

总体代码

#include "ogrsf_frmts.h"

void ProcessOfPoint(const char* point_file) {
    // 注册所有的驱动
    GDALAllRegister();
    GDALDataset* poDS;
    //打开一个点状要素
    poDS = (GDALDataset * ) GDALOpenEx(point_file, GDAL_OF_VECTOR, NULL, NULL, NULL);
    if (poDS == NULL) {
        printf("Open the point file failed\n");
        exit(1);
    }
    //打开点状要素的图层
   OGRLayer *poLayer;
   poLayer = poDS->GetLayer(0);

   OGRFeature* poFeature;
   poLayer->ResetReading();
   while ((poFeature = poLayer->GetNextFeature() )!= NULL) {
       for (auto&& oField : *poFeature) {
           if (oField.IsNull()) {
               printf("(null)");
               continue;
           }
           if (oField.IsUnset()) {
               printf("(unset)");
               continue;
           }
           switch (oField.GetType()) {
           case OFTInteger:  printf("%d ", oField.GetAsInteger());
               break;
           case OFTInteger64:   printf(CPL_FRMT_GIB",", oField.GetAsInteger64());
               break;
           case OFTReal:   printf("%3f  ", oField.GetAsDouble());
               break;
           case  OFTString: printf("%s  ", oField.GetAsString());
               break;
           default:printf("%s   ", oField.GetAsString());
               break;
           }
       }
       //处理几何数据,获取X,Y坐标
       OGRGeometry* poGeometry;
       poGeometry = poFeature->GetGeometryRef();
       if (poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType())== wkbPoint) {
           OGRPoint *point = poGeometry->toPoint();
           printf("%.3f:%.3f\n", point->getX(), point->getY());

       }
       else
       {
           printf("no point\n");
       }
       OGRFeature::DestroyFeature(poFeature);
   }
   GDALClose(poDS);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值