使用GDAL/OGR读写矢量文件
感觉GIS中矢量相关内容还是挺庞杂的,并且由于版本迭代的关系,使用GDAL/OGR读写矢量的资料也有点不太一样。这里总结了一个读写矢量的示例,实现代码如下:
#include <iostream>
#include <gdal/ogrsf_frmts.h>
using namespace std;
bool ReadDXF(string filePath, vector<vector<OGRPoint>>& vertexPoint)
{
GDALDataset *poDS = (GDALDataset*)GDALOpenEx(filePath.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL);
if (!poDS)
{
printf("无法读取该文件,试检查格式是否正确!");
return false;
}
if (poDS->GetLayerCount()<1)
{
printf("该文件的层数小于1,试检查格式是否正确!");
return false;
}
OGRLayer *poLayer = poDS->GetLayer(0); //读取层
poLayer->ResetReading();
OGRFeature *poFeature;
while ((poFeature = poLayer->GetNextFeature()) != NULL)
{
OGRGeometry *pGeo = poFeature->GetGeometryRef();
OGRwkbGeometryType pGeoType = pGeo->getGeometryType();
if (pGeoType == wkbLineString || pGeoType == wkbLineString25D)
{
OGRLinearRing *pCurve = (OGRLinearRing*)pGeo;
if (pCurve->getNumPoints() < 1)
{
continue;
}
vector<OGRPoint> pl;
for (int i = 0; i<pCurve->getNumPoints(); i++)
{
OGRPoint point;
pCurve->getPoint(i, &point);
pl.push_back(point);
}
vertexPoint.push_back(pl);
}
////
//OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
//int n = poFDefn->GetFieldCount(); //获得字段的数目,不包括前两个字段(FID,Shape);
//for (int iField = 0; iField <n; iField++)
//{
// //输出每个字段的值
// cout << poFeature->GetFieldAsString(iField) << " ";
//}
//cout << endl;
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
poDS = nullptr;
return true;
}
bool WriteShp(string filePath, vector<vector<OGRPoint>> vertexPoint)
{
//创建
GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("ESRI Shapefile");
if (!driver)
{
printf("Get Driver ESRI Shapefile Error!\n");
return false;
}
GDALDataset* dataset = driver->Create(filePath.c_str(), 0, 0, 0, GDT_Unknown, NULL);
OGRLayer* poLayer = dataset->CreateLayer("houseType", NULL, wkbPolygon, NULL);
//创建属性字段
{
// 字符串
OGRFieldDefn oField1("名称", OFTString);
oField1.SetWidth(8);
if (poLayer->CreateField(&oField1) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
// 浮点数
OGRFieldDefn oField2("面积", OFTReal);
oField2.SetPrecision(3);
if (poLayer->CreateField(&oField2) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
// 整型
OGRFieldDefn oField3("结点数", OFTInteger);
if (poLayer->CreateField(&oField3) != OGRERR_NONE) {
printf("Creating Name field failed.\n"); return FALSE;
}
}
//创建特征
for (auto& iter : vertexPoint)
{
OGRFeature *poFeature = new OGRFeature(poLayer->GetLayerDefn());
OGRLinearRing ogrring;
int pNum = (int)iter.size();
ogrring.setNumPoints(pNum);
for (int i = 0; i < iter.size(); i++)
{
ogrring.setPoint(i, iter[i].getX(), iter[i].getY(), iter[i].getZ());
//cout << iter[i].x() << '\t' << iter[i].y() << '\t' << iter[i].z() << endl;
}
//cout << "-----------------------------\n";
OGRPolygon polygon;
polygon.addRing(&ogrring);
poFeature->SetGeometry(&polygon);
poFeature->SetField("名称", "多边形");
poFeature->SetField("面积", polygon.get_Area());
poFeature->SetField("结点数", pNum);
if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
{
printf("Failed to create feature in shapefile.\n");
return false;
}
}
//释放
GDALClose(dataset);
dataset = nullptr;
//GDALDestroyDriverManager();
return true;
}
int main()
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //支持中文路径
CPLSetConfigOption("SHAPE_ENCODING", ""); //解决中文乱码问题
string filePath = "D:/2.dxf";
vector<vector<OGRPoint>> vertexPoint;
if (!ReadDXF(filePath, vertexPoint))
{
return 1;
}
string newPath = "C:/Users/charlee/Desktop/SHP/dst.shp";
WriteShp(newPath, vertexPoint);
return 0;
}
在这个示例中,读取一个DXF文件中的线(环)特征,将其转换成面,然后保存在一个SHP中。同时,还给该SHP文件写入了相应的属性字段。
读取的DXF文件:
创建并保存的SHP文件:
使用GDAL/OGR读写矢量文件的更多相关文章
- GDAL读写矢量文件——Python
在Python中使用OGR时,先要导入OGR库,如果需要对中文的支持,还需要导入GDAL库,具体代码如下.Python创建的shp结果如图1所示. 图1 Python创建矢量结果 #-*- codin ...
- GDAL集成对KML文件的支持
目录 1. 正文 1.1. 编译LibKML 1.1.1. 第三方库支持 1.1.2. 编译错误 1.2. 配置GDAL 1.3. 链接问题 2. 参考 1. 正文 GDAL可以支持将KML作为矢量文 ...
- GEOS库学习之五:与GDAL/OGR结合使用
要学习GEOS库,肯定绕不开地理方面的东西.如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了.实际上只需要OGR就行 ...
- [转载]C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...
- 用opencsv文件读写CSV文件
首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...
- 在.net中读写config文件的各种方法
阅读目录 开始 config文件 - 自定义配置节点 config文件 - Property config文件 - Element config文件 - CDATA config文件 - Collec ...
- MFC vs2012 Office2013 读写excel文件
近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果...废话少说,过程如下: 笔者环境:win7 64+VS2012+Office2 ...
- Java读写资源文件类Properties
Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注 ...
- c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)
c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...
随机推荐
- Eclipse设置Working Set管理项目和detach合并分离窗口
当项目多了的时候,使用Working Set分组管理项目很有必要了,不然一大推项目在一起 找起来麻烦,看起来也难受~ 所以根据给项目不同分类就很有必要了. 之前myeclipse设置了,今天装了一 ...
- Java基础IO类之字节输入输出流
一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...
- python的reduce,map,zip,filter和sorted函数
一. reduce(function,Iterable),它的形式和map()函数一样.不过参数function必须有两个参数. reduce()函数作用是:把结果继续和序列的下一个元素做累积计 ...
- Django3.0 异步通信初体验
此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...
- 如何提高 PHP 代码的质量?第二部分 单元测试
在“如何提高 PHP 代码的质量?”的前一部分中:我们设置了一些自动化工具来自动检查我们的代码.这很有帮助,但关于我们的代码如何满足业务需求并没有给我们留下任何印象.我们现在需要创建特定代码域的测试. ...
- Dropzone.js拖拽上传(简单示例)
今天碰到一个需求,页面上有“点击上传”的按钮,点击可以执行上传事件,从桌面拖拽图片拖拽到任何地方,都可以执行上传,且不影响点击按钮事件.下面是简单示例: 简单示例如下: <!DOCTYPE ht ...
- CA-RNN论文读取
***CA-RNN: Using Context-Aligned Recurrent Neural Networks for Modeling Sentence Similarity(CA-RNN:使 ...
- 转:java 解析excel,带合并单元的excel
收集了一些对博主有帮助的博文,如下 >>>>>>>>>>>第一部分: 首先,mavn导入jar包 <!-- 解析excel需要导 ...
- sbt assembly a fat jar for spark-submit cluster model
在用spark-submit提交作业时,用sbt package打包好的jar程序,可以很好的运行在client模式,当在cluster模式, 一直报错:Exception in thread &qu ...
- set容器
set容器简介: 1) set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2) set采用红黑树变体的数据结构实现,红 ...