GDAL矢量(.shp)文件读写与创建

2024-09-01 09:18
文章标签 创建 读写 gdal shp 矢量

本文主要是介绍GDAL矢量(.shp)文件读写与创建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gdal18版本读写矢量与创建,具体李明录老师的书本更详细
以下代码是求两个矢量的交集:

    GDALAllRegister();OGRRegisterAll();CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");OGRDataSource *podata = OGRSFDriverRegistrar::Open(str_checkshp.c_str(),1);///str_checkshp为矢量路径,字符串类if (podata == NULL){cout <<"file:" <<str_checkshp << " open checkshp fail!!" << endl;}OGRLayer *poSourceLayer = podata->GetLayer(0);if (poSourceLayer == NULL){cout << "file:" << str_checkshp << "open checkshp_layer fail!!" << endl;}poSourceLayer->ResetReading();OGRFeature* pFea = poSourceLayer->GetNextFeature();if (pFea == NULL){cout << "file:" << str_checkshp << " feature is not exist!!" << endl;}OGRGeometry *poGeometry= poFeature->GetGeometryRef();
///获取矢量2的geo
OGRDataSource *podata2 = OGRSFDriverRegistrar::Open(str_checkshp2.c_str(),1);
///str_checkshp2为矢量路径,字符串类型if (podata2 == NULL){cout <<"file:" <<str_checkshp2 << " open checkshp fail!!" << endl;}OGRLayer *poSourceLayer2 = podata2->GetLayer(0);if (poSourceLayer2 == NULL){cout << "file:" << str_checkshp2 << "open checkshp_layer fail!!" << endl;}poSourceLayer2->ResetReading();OGRFeature* pFea2 = poSourceLayer2->GetNextFeature();if (pFea2 == NULL){cout << "file:" << str_checkshp2 << " feature is not exist!!" << endl;}OGRGeometry *poGeometry2= poFeature2->GetGeometryRef();///创建矢量OGRSFDriver *poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);///获取驱动if (poDriver == NULL){cout << "驱动不可用" << endl;return FALSE;}OGRDataSource *poNewDS = poDriver->CreateDataSource(strShpNewfliedir.c_str(), NULL);OGRSpatialReference *sp = poSourceLayer2->GetSpatialRef();OGRSpatialReference* oSRS = sp;///获取空间参考OGRLayer *poNewLayer = poNewDS->CreateLayer("newlayer", oSRS, wkbPolygon, NULL);
OGRFeatureDefn *poDefn = poLayer->GetLayerDefn();OGRFeature *poFeatureIntersection = OGRFeature::CreateFeature(poDefn);OGRGeometry *poGeometry3 = poGeometry1->Difference(poGeometry2);poFeatureIntersection->SetGeometry(poGeometry3);poLayer->CreateFeature(poFeatureIntersection);OGRFeature::DestroyFeature(poFeatureIntersection);OGRFeature::DestroyFeature(pFea );OGRFeature::DestroyFeature(pFea2);GDALClose(poNewDS);GDALClose(podata2);GDALClose(podata);return 0;

GDAL201矢量读写与创建
暂时没有中文书籍,就记录了下来,方便拷贝,提高码代码效率

if (OGRGeometryFactory::haveGEOS() == false){cout << "GDAL库未包含GEOS库" << endl;return 0;}// 打开栅格文件GDALDataset* poSrcDS1 = (GDALDataset*)GDALOpenEx(pszSrc1File, GDAL_OF_VECTOR, NULL, NULL, NULL);if (poSrcDS1 == NULL){return 0;}OGRLayer* poLayer1 = poSrcDS1->GetLayer(0);poLayer1->ResetReading();OGRFeature *poFeature1 = poLayer1->GetNextFeature();OGRGeometry *poGeometry1 = poFeature1->GetGeometryRef();GDALDataset* poSrcDS2 = (GDALDataset*)GDALOpenEx(pszSrc21File, GDAL_OF_VECTOR, NULL, NULL, NULL);if (poSrcDS2 == NULL){return 0;}OGRLayer* poLayer2 = poSrcDS2->GetLayer(0);poLayer2->ResetReading();OGRFeature *poFeature2 = poLayer2->GetNextFeature();OGRGeometry *poGeometry2= poFeature2->GetGeometryRef();OGRGeometry *poGeometry3 = poGeometry1->Difference(poGeometry2);// 创建输出矢量文件GDALDriver *poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("ESRI Shapefile");if (poDriver == NULL){printf("%s驱动不可用!\n", "ESRI Shapefile");GDALClose((GDALDatasetH)poSrcDS1);GDALClose((GDALDatasetH)poSrcDS2);return 0;}//根据文件名创建输出矢量文件GDALDataset* poDstDS = poDriver->Create(pszDstFile, 0, 0, 0, GDT_Unknown, NULL);if (poDstDS == NULL){GDALClose((GDALDatasetH)poSrcDS1);GDALClose((GDALDatasetH)poSrcDS2);return 0;}// 定义空间参考,与输入图像相同OGRSpatialReference *poSpatialRef = new OGRSpatialReference(poSrcDS1->GetProjectionRef());if (poSpatialRef==NULL){return 0;}OGRLayer* poLayer = poDstDS->CreateLayer("Result", poSpatialRef, wkbPolygon, NULL);if (poDstDS == NULL){GDALClose((GDALDatasetH)poSrcDS1);GDALClose((GDALDatasetH)poSrcDS2);delete poSpatialRef;poSpatialRef = NULL;return 0;}OGRFeatureDefn *poDefn = poLayer->GetLayerDefn();OGRFeature *poFeatureIntersection = OGRFeature::CreateFeature(poDefn);poFeatureIntersection->SetGeometry(poGeometry3);poLayer->CreateFeature(poFeatureIntersection);OGRFeature::DestroyFeature(poFeatureIntersection);OGRFeature::DestroyFeature(poFeature1);OGRFeature::DestroyFeature(poFeature2);GDALClose(poSrcDS1);GDALClose(poSrcDS2);GDALClose(poDstDS);return 0;

最后附上gdal201版本的编译完成的库,包含了geos。欢迎下载
http://download.csdn.net/download/u013230291/10000023

GDAL18下载地址:http://download.csdn.net/download/u013230291/9920097

这篇关于GDAL矢量(.shp)文件读写与创建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126531

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand