最近因为项目需要,需做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==0) { targetGeometryType = OGRwkbGeometryType::wkbLineString; OGRLineString* pOGRLineString=(OGRLineString*)OGRGeometryFactory::createGeometry(targetGeometryType); OGRLinearRing* pOGRLinearRing = pOGRPolygon->getExteriorRing(); int pointCount=pOGRLinearRing->getNumPoints(); double x=0; double y=0; for(int i=0;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=0; double y=0; for(int i=0;i<pointCount;i++) { x=pOGRLinearRing->getX(i); y=pOGRLinearRing->getY(i); ogrLineString.addPoint(x,y); } pOGRMultiLineString->addGeometry(&ogrLineString); for(int i=0;i<innerCount;i++) { // 添加内环 OGRLineString ogrLineString0; OGRLinearRing* pOGRLinearRing0 = pOGRPolygon->getInteriorRing(i); int pointCount=pOGRLinearRing0->getNumPoints(); double x=0; double y=0; for(int i=0;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=0;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=0; double y=0; for(int i=0;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=0;i<geometryCount;i++) { OGRGeometry* pOGRGeo=ConvertPolylineToPolygon(pOGRPolylines->getGeometryRef(i)); pOGRMultiPolygon->addGeometry(pOGRGeo); } return pOGRMultiPolygon; } default: return NULL; } return NULL; }
原文:http://www.cnblogs.com/LiangXiaoBa/p/4938439.html