使用C++的OGR库获取shp文件的空间参考

添加头文件

gdal库在处理矢量文件的时候,需要引入ogrsf_frmts.h头文件,要是需要处理空间参考系统,主要指定义坐标系,修改坐标系操作,那我们就得引入ogr_srs_api.h头文件了,SRS指的是Spatial Reference System,这个SRS包括三个部分,分别是坐标系统、基准面、投影,这些部分相互关联,共同定义了地理数据的位置和形状。

  1. 坐标系统(Coordinate System):坐标系统定义了地理数据的坐标表示方法,包括坐标轴的方向、单位以及原点的位置。常见的坐标系统包括经纬度坐标系统和投影坐标系统。

  2. 基准面(Datum):基准面是用于测量和表示地球表面形状和位置的基准。它定义了地理数据的原点、参考椭球体以及与地球的相对位置。常见的基准面包括WGS84、NAD83等。

  3. 投影(Projection):投影是将地球表面的三维坐标投影到平面上的方法。地球是一个三维的椭球体,为了在平面地图上准确表示地理位置,需要使用投影将地球表面的曲线投影为平面上的直线或曲线。

获取shp文件

GDALAllRegister();
GDALDataset* poDS = static_cast<GDALDataset*>(GDALOpenEx(shp_file, GDAL_OF_VECTOR, NULL, NULL, NULL));
//判断文件是否打开
if (poDS == NULL) {
    printf("create dataset failed\n");
    exit(1);
}

GDALOpenEx()函数返回一个GDALDataset*类型的指针,因此我们可创建一个GDALDataset*类型变量poDS,GDALOpenEx() 的输入参数分别是“文件路径、文件类型、驱动选项(一般默认NULL即可)、打开数据层次水平选项(一般也默认NULL即可)、辅助字符串(一般也默认NULL即可)”,倘如获取失败,返回NULL

获取图层坐标系信息

 // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);
    if (poLayer == nullptr) {
        printf("无法获取图层\n");
        exit(1);
    }

    // 获取图层的坐标系
    OGRSpatialReference* poSpatialRef = poLayer->GetSpatialRef();
    //判断获取空间参考是否成功
    if (poSpatialRef == nullptr) {
        printf("无法获取坐标系\n");
        exit(1);
    }

使用GetSpatialRef()函数获取图层空间参考信息,这个函数返回值是OGRSpatialReference*类型,因此我们引入这个类型的变量 poSpatialRef ,倘如获取失败,返回NULL

输出坐标信息

    // 输出坐标系信息
    char* pszWKT = nullptr;
    poSpatialRef->exportToWkt(&pszWKT);
    printf("坐标系信息:\n%s\n", pszWKT);

    // 释放资源
    CPLFree(pszWKT);
    GDALClose(poDS);

我们要使用exportToWkt()函数将坐标信息转换成wkt文本,至于为什么要引入wkt文本呢?这是因为在 GDAL(Geospatial Data Abstraction Library)库中引入 Well-Known Text(WKT)类型数据是为了方便地表示和传输空间参考系统(Spatial Reference System,SRS)信息。WKT 是一种用文本形式表示空间参考系统的标准格式,它能够准确描述坐标系统、基准面和投影等信息。

引入 WKT 类型数据的好处包括:

  1. 标准化:WKT 是一种标准格式,能够统一表示各种空间参考系统的信息,便于不同系统之间的交换和共享。

  2. 可读性:WKT 使用文本形式表示空间参考系统,易于阅读和理解。这使得在程序中使用 WKT 格式的 SRS 信息更加直观和方便。

  3. 轻量级:WKT 格式的数据相对于其他二进制格式的 SRS 数据来说更加轻量级,便于存储和传输。
    需要注意这个exportToWkt()的传入参数是一个二级指针,最后别忘了把资源全部释放掉。

这是全部代码

#include "ogrsf_frmts.h"
#include "ogr_srs_api.h"
void getSRS(const char* shp_file) {
    GDALAllRegister();
    GDALDataset* poDS = static_cast<GDALDataset*>(GDALOpenEx(shp_file, GDAL_OF_VECTOR, NULL, NULL, NULL));
    if (poDS == NULL) {
        printf("create dataset failed\n");
        exit(1);
    }
    // 获取第一个图层
    OGRLayer* poLayer = poDS->GetLayer(0);
    if (poLayer == nullptr) {
        printf("无法获取图层\n");
        exit(1);
    }

    // 获取图层的坐标系
    OGRSpatialReference* poSpatialRef = poLayer->GetSpatialRef();
    if (poSpatialRef == nullptr) {
        printf("无法获取坐标系\n");
        exit(1);
    }

    // 输出坐标系信息
    char* pszWKT = nullptr;
    poSpatialRef->exportToWkt(&pszWKT);
    printf("坐标系信息:\n%s\n", pszWKT);

    // 释放资源
    CPLFree(pszWKT);
    GDALClose(poDS);
}

其中这个shp_file我选的是arcgis10.2自带的数据,一般在你的arcgis安装包的...\ArcGIS10.2\Desktop10.2\ArcGlobeData\continent.shp"

输出结果如下
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值