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

相关文章

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键