最近因为项目需要,需做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;
}

最新文章

  1. css3 翻转和旋转的区别
  2. Maven提高篇系列之(一)——多模块 vs 继承
  3. 为什么Android应该根据屏幕分辨率来加载不同的图片文件
  4. javaScript基础练习题-下拉框制作(CSS)
  5. angular 自定义指令
  6. 提高PHP开发质量的36个方法(精品)
  7. laravel5.2 学习之服务提供者
  8. Myeclipse中无法删除部署在tomcat上的工程
  9. 解决JSP页面无法使用EasyUI里面class=&quot;easyui-dialog&quot;的问题
  10. Uber将在泰国首推&quot;优步摩托&quot;服务
  11. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)
  12. 安卓天天练练(五)CompoundButton
  13. 富文本 Htmll类 html标签
  14. 关于css的伪类和伪元素
  15. bootstrap-table操作之“删除”
  16. win10免安装版本的MySQL的下载安装和配置
  17. .Net Core:Middleware中间件管道
  18. Linux之ansible 常用模块
  19. linux c 获取console 结果
  20. 硬编码转换单位||vue

热门文章

  1. Centos7下安装CUDA
  2. python学习,day4:生成器,通过yield实现单线程情况下的并发运算
  3. [转] Mock以及Mockito的使用
  4. linux ln 命令,相当于windows快捷方式
  5. RHCE 共享文件系统
  6. 装B 自卫神器 -
  7. unity字库精简
  8. [中英对照]Booting Process in Linux RHEL 7 | Linux RHEL 7启动过程
  9. Java时间的使用
  10. module使用和设置