最近因为项目需要,需做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线面互转换的更多相关文章

  1. GDAL线面互转换(2)

    在上一个文章中介绍了线转化为面和面转化为线,其主要的实现思路就是把面中的点取出来构成线,把线中的点取出来构成面,实际上就是一个硬拷贝,无奈客户的实际需求并非如此,客户想要线转面的时候几条相交线构成面, ...

  2. opengl中场景变换|2D与3D互转换(转)

    opengl中场景变换|2D与3D互转换 我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1.从不同的位置去观察它.(视图变换) 2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我 ...

  3. PHP时间戳和日期互转换

    在php中我们要把时间戳转换日期可以直接使用date函数来实现,如果要把日期转换成时间戳可以使用strtotime()函数实现,下面我来给大家举例说明. 1.php中时间转换函数 strtotime ...

  4. Javascript Array和String的互转换。

    Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...

  5. Javascript Array和String的互转换

    Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...

  6. C#二进制与字符串互转换,十六进制转换为字符串、float、int

    /// <summary>     /// 将 字符串 转成 二进制 “10011100000000011100011111111101” /// </summary> /// ...

  7. Image与Base64String的互转换

    public Image Base64ToImage(string base64String) { // Convert Base64 String to byte[] byte[] imageByt ...

  8. Gdal 1.11.0 添加 Postgresql 9.1 sqlite3 支持

    OS环境Ubuntu12.04 32bit 因为公司一个功能要用到gdal 的ogr2ogr命令转换shp数据,需要能往postgis和sqlite 中插入数据. 用gdal1.11.0的源码默认安装 ...

  9. c#中将IP地址转换成无符号整形数的方法与逆变换方法

    我们知道 IP地址就是给每个连接在Internet上的主机分配的一个32bit地址. 按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节.而c#中 ...

随机推荐

  1. jenkins+appium android app自动化测试

    jenkins安装 pytest+jenkins安装+allure报告 新建任务 其他默认,保存 立即构建 test_login.py from src.pages import login_page ...

  2. Python unittest第二篇:测试夹具

    关于测试夹具,我们知道,以类为对象的话,在python里对应的方法分别是test_isupper.test_upper, 那么以测试case为单位呢? 这时候,就要提到我们的setup()和tearD ...

  3. 安卓手机移动端Web开发调试之Chrome远程调试(Remote Debugging)

    一.让安卓打debug模式的apk包 二.将电脑中的chrome升级到最新版本,在chrome浏览器地址栏中输入chrome://inspect/#devices: 在智能手机还未普及时,移动设备的调 ...

  4. bingoyes' tiny dream

    Gauss Elimination bool Gauss(){ int now=1,nxt; double t; R(i,1,n){ //enumerate the column for(nxt=no ...

  5. TP5 隐藏入口文件 index.php

    找到public下的.htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine ...

  6. 使用NHibernate(1)--资料汇总

    NHibernate最新版本是4.0,目前还只是alpha版,没有发布.稳定版本是3.3,项目中用的也是这个版本,所以以后的介绍都是基于这个版本的. 在网上找了一下相关的学习资料,现汇总如下: NHi ...

  7. Java多线程(二)同步与等待唤醒

     1:数据安全问题 1.1:什么情况下会出现数据安全问题? 多个线程对同一个资源进行操作,并且操作资源的语句有多条.那么这个时候这些语句因为cpu的随机性,有可能被多个线程分开执行.导致数据安全问题. ...

  8. 使用vue的v-model自定义 checkbox组件

    <template id='c'> <input type="checkbox" :checked="checked" v-on:change ...

  9. display:block、inline、inline-block的区别及应用案例

    A.display:block就是将元素显示为块级元素. block元素的特点是: 1.总是在新行上开始: 2.高度,行高以及顶和底边距都可控制: 3.宽度缺省是它的容器的100%,除非设定一个宽度; ...

  10. memcached 学习笔记 1

    一 简介 1 What is Memcached? Free & open source, high-performance, distributed memory object cachin ...