最近因为项目需要,需做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. 【EF数据库链接报错】“The underlying provider failed on open”

    EF在操作数据库时要反复链接.断开数据库,如果连接字符串是windows 服务验证,而不是用的用户名和密码,那么尝试访问数据库的用户是NT AUTHORITY\NETWORK SERVICE.权限不够 ...

  2. Scrapyd-Client的安装

    1. pip安装 这里推荐使用pip安装,相关命令如下: pip3 install scrapyd-client 2.验证安装 安装成功后会有一个可用命令,叫作scrapyd-deploy,即部署命令 ...

  3. javascript语言使用技巧及注意事项总结

    1.首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. var a=b=10;//其中a是局部变量,b是全局变量 2.使用===比= ...

  4. 【分步详解】两个有序数组中的中位数和Top K问题

    (这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...

  5. kmp java implement--转

    http://cs.nyu.edu/~yap/classes/basic/progs/patternMatching/KMP.java /** * @file KMP.java * @synopsis ...

  6. ES6 读书笔记

    一.let和const命令 二.变量的解构赋值 三.字符串的扩展 四.数值的扩展 五.正则的扩展 六.数组的扩展 七.函数的扩展 八.对象的扩展 九.symbol 十.proxy和reflect 十一 ...

  7. mysql的join连接查询优化经历

    工作中接开发主管反馈,有个资讯接口调用时有出现响应较慢,需要优化. 接口返回有时较慢??第一反应是接口的redis缓存过期时有大量请求穿过redis缓存,对mysql访问压力较大造成的. 先看PHP代 ...

  8. (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括

    一.Xpath 解析   xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则: nodename :选取此节点的所有子节点 // : ...

  9. 屏幕置顶(WindowManager服务)

    https://www.cnblogs.com/mythou/p/3244208.html

  10. replace替换,全局和局部替换

    <script> var a=document.getElementById("introduce").innerHTML; var b=a.replace(/jone ...