GDAL线面互转换
最近因为项目需要,需做GDAL线面互转的功能,查阅部分资料完成,下面把核心部分的代码贴出来,留个记录,也欢迎大家提问题指正完善。
/*
* @brief ConvertPolygonToPolyline 转换面为线
* @param[in] OGRGeometry* polygon 要转换的面
* @return OGRGeometry* 转换成功后的线
* @author
* @date
* @note 2015年11月04日 小八创建;
*/
OGRGeometry* FeatureLayerOperator::ConvertPolygonToPolyline(OGRGeometry* polygon)
{
// 线生成
OGRwkbGeometryType sourceGeometryType=polygon->getGeometryType();
sourceGeometryType=wkbFlatten(sourceGeometryType); OGRwkbGeometryType targetGeometryType;
switch(sourceGeometryType)
{
case OGRwkbGeometryType::wkbPolygon:
{
OGRPolygon* pOGRPolygon=(OGRPolygon*) polygon;
int innerCount=pOGRPolygon->getNumInteriorRings();
if(innerCount==)
{
targetGeometryType = OGRwkbGeometryType::wkbLineString;
OGRLineString* pOGRLineString=(OGRLineString*)OGRGeometryFactory::createGeometry(targetGeometryType); OGRLinearRing* pOGRLinearRing = pOGRPolygon->getExteriorRing();
int pointCount=pOGRLinearRing->getNumPoints();
double x=; double y=;
for(int i=;i<pointCount;i++)
{
x=pOGRLinearRing->getX(i);
y=pOGRLinearRing->getY(i);
pOGRLineString->addPoint(x,y);
} return pOGRLineString;
}
else
{
targetGeometryType = OGRwkbGeometryType::wkbMultiLineString;
OGRMultiLineString* pOGRMultiLineString=(OGRMultiLineString*)OGRGeometryFactory::createGeometry(targetGeometryType); // 添加外环
OGRLineString ogrLineString;
OGRLinearRing* pOGRLinearRing = pOGRPolygon->getExteriorRing();
int pointCount=pOGRLinearRing->getNumPoints();
double x=; double y=;
for(int i=;i<pointCount;i++)
{
x=pOGRLinearRing->getX(i);
y=pOGRLinearRing->getY(i);
ogrLineString.addPoint(x,y);
}
pOGRMultiLineString->addGeometry(&ogrLineString); for(int i=;i<innerCount;i++)
{
// 添加内环
OGRLineString ogrLineString0;
OGRLinearRing* pOGRLinearRing0 = pOGRPolygon->getInteriorRing(i);
int pointCount=pOGRLinearRing0->getNumPoints();
double x=; double y=;
for(int i=;i<pointCount;i++)
{
x=pOGRLinearRing0->getX(i);
y=pOGRLinearRing0->getY(i);
ogrLineString0.addPoint(x,y);
}
pOGRMultiLineString->addGeometry(&ogrLineString0);
} return pOGRMultiLineString;
}
}
case OGRwkbGeometryType::wkbMultiPolygon:
{
targetGeometryType = OGRwkbGeometryType::wkbMultiLineString;
OGRMultiLineString* pOGRMultiLineString=(OGRMultiLineString*)OGRGeometryFactory::createGeometry(targetGeometryType); OGRGeometryCollection* pOGRPolygons=(OGRGeometryCollection*) polygon;
int geometryCount=pOGRPolygons->getNumGeometries(); for(int i=;i<geometryCount;i++)
{
OGRGeometry* pOGRGeo=ConvertPolygonToPolyline(pOGRPolygons->getGeometryRef(i));
pOGRMultiLineString->addGeometry(pOGRGeo);
} return pOGRMultiLineString;
}
default:
return NULL;
} return NULL;
} /*
* @brief ConvertPolylineToPolygon 转换线为面
* @param[in] OGRGeometry* polygon 要转换的面
* @return OGRGeometry* 转换成功后的线
* @author
* @date
* @note 2015年11月04日 小八创建;
*/
OGRGeometry* FeatureLayerOperator::ConvertPolylineToPolygon(OGRGeometry* polyline)
{
// 线生成
OGRwkbGeometryType sourceGeometryType=polyline->getGeometryType();
sourceGeometryType=wkbFlatten(sourceGeometryType); OGRwkbGeometryType targetGeometryType;
switch(sourceGeometryType)
{
case OGRwkbGeometryType::wkbLineString:
{
OGRLineString* pOGRLineString=(OGRLineString*) polyline;
targetGeometryType = OGRwkbGeometryType::wkbPolygon; OGRPolygon* pOGRPolygon=(OGRPolygon*)OGRGeometryFactory::createGeometry(targetGeometryType); OGRLinearRing pOGRLinearRing;
int pointCount=pOGRLineString->getNumPoints();
double x=; double y=;
for(int i=;i<pointCount;i++)
{
x=pOGRLineString->getX(i);
y=pOGRLineString->getY(i);
pOGRLinearRing.addPoint(x,y);
}
pOGRLinearRing.closeRings();
pOGRPolygon->addRing(&pOGRLinearRing);
return pOGRPolygon;
}
case OGRwkbGeometryType::wkbMultiLineString:
{
targetGeometryType = OGRwkbGeometryType::wkbMultiPolygon;
OGRMultiPolygon* pOGRMultiPolygon=(OGRMultiPolygon*)OGRGeometryFactory::createGeometry(targetGeometryType); OGRGeometryCollection* pOGRPolylines=(OGRGeometryCollection*)polyline;
int geometryCount=pOGRPolylines->getNumGeometries(); for(int i=;i<geometryCount;i++)
{
OGRGeometry* pOGRGeo=ConvertPolylineToPolygon(pOGRPolylines->getGeometryRef(i));
pOGRMultiPolygon->addGeometry(pOGRGeo);
} return pOGRMultiPolygon;
}
default:
return NULL;
} return NULL;
}
GDAL线面互转换的更多相关文章
- GDAL线面互转换(2)
在上一个文章中介绍了线转化为面和面转化为线,其主要的实现思路就是把面中的点取出来构成线,把线中的点取出来构成面,实际上就是一个硬拷贝,无奈客户的实际需求并非如此,客户想要线转面的时候几条相交线构成面, ...
- opengl中场景变换|2D与3D互转换(转)
opengl中场景变换|2D与3D互转换 我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1.从不同的位置去观察它.(视图变换) 2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我 ...
- PHP时间戳和日期互转换
在php中我们要把时间戳转换日期可以直接使用date函数来实现,如果要把日期转换成时间戳可以使用strtotime()函数实现,下面我来给大家举例说明. 1.php中时间转换函数 strtotime ...
- Javascript Array和String的互转换。
Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...
- Javascript Array和String的互转换
Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...
- C#二进制与字符串互转换,十六进制转换为字符串、float、int
/// <summary> /// 将 字符串 转成 二进制 “10011100000000011100011111111101” /// </summary> /// ...
- Image与Base64String的互转换
public Image Base64ToImage(string base64String) { // Convert Base64 String to byte[] byte[] imageByt ...
- Gdal 1.11.0 添加 Postgresql 9.1 sqlite3 支持
OS环境Ubuntu12.04 32bit 因为公司一个功能要用到gdal 的ogr2ogr命令转换shp数据,需要能往postgis和sqlite 中插入数据. 用gdal1.11.0的源码默认安装 ...
- c#中将IP地址转换成无符号整形数的方法与逆变换方法
我们知道 IP地址就是给每个连接在Internet上的主机分配的一个32bit地址. 按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节.而c#中 ...
随机推荐
- 编辑距离 区间dp
题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...
- 【性能测试】:loadrunner直压MYSQL数据库的脚本开发
有时性能测试,会涉及到直接压测数据库,测试数据库处理sql的水平,或者通过sql脚本向数据库写数据做铺地数据 这里贴上一个自己用的对数据库操作的脚本 一,首先要去下载一个LR压MYSQL的一个库文件, ...
- [转] org.scalatest.FunSuite Scala Examples - Scala FunSuite 测试的例子
[From] https://www.programcreek.com/scala/org.scalatest.FunSuite org.scalatest.FunSuite Scala Examp ...
- 本地docker镜像上传到腾讯云镜像仓库。
和上篇上传到Docker Hub类似,只是登录时切换成腾讯云镜像仓库地址(ccr.ccs.tencentyun.com/longdbtencentdocker/publongdb)即可. docker ...
- 虚拟机下设置CentOS 7使用固定IP地址
1.设置虚拟机使用桥接网络 2.查看安装虚拟机软件的电脑IP信息 3.启动CentOS 7进行设置
- JVectorMap地图插件.Net版开源
jVectorMap地图插件只要浏览器技术JavaScript.CSS,HTML,SVG或VML就可以浏览使用,不需要Flash或其他专有的浏览 器插件.所以jVectorMap在所有现代移动浏览器上 ...
- mysql:服务器错误代码
服务器错误代码和消息 原文:https://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html MySQL的程序有几种类型的错误信息时 ...
- WCF系列教程之WCF中的会话
本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一.WCF会话简介 1.在WCF应用程序中,回话将一组消息相互关 ...
- 《LeetBook》leetcode题解(7): Reverse Integer[E]——处理溢出的技巧
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 书的地址:https://hk029.gitbooks.io/leetboo ...
- CentOS 6.4下安装JIRA6.3.6破解汉化
JIRA产品非常完善且功能强大,安装配置简单,多语言支持.界面十分友好,和其他系统如CVS.Subversion(SVN).VSS.LDAP.邮件服务整合得相当好,文档齐全,可用性以及可扩展性方面都十 ...