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

相关文章

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

java创建xls文件放到指定文件夹中实现方式

《java创建xls文件放到指定文件夹中实现方式》本文介绍了如何在Java中使用ApachePOI库创建和操作Excel文件,重点是如何创建一个XLS文件并将其放置到指定文件夹中... 目录Java创建XLS文件并放到指定文件夹中步骤一:引入依赖步骤二:创建XLS文件总结Java创建XLS文件并放到指定文件

MySQL数据库读写分离与负载均衡的实现逻辑

《MySQL数据库读写分离与负载均衡的实现逻辑》读写分离与负载均衡是数据库优化的关键策略,读写分离的核心是将数据库的读操作与写操作分离,本文给大家介绍MySQL数据库读写分离与负载均衡的实现方式,感兴... 目录读写分离与负载均衡的核心概念与目的读写分离的必要性与实现逻辑读写分离的实现方式及优缺点读负载均衡

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他