GDAL线面互转换

来源:互联网 发布:淘宝买衣服不撞衫 编辑:程序博客网 时间:2024/05/17 02:42

最近因为项目需要,需做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;igetX(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;igetX(i);y=pOGRLinearRing->getY(i);ogrLineString.addPoint(x,y);}pOGRMultiLineString->addGeometry(&ogrLineString);for(int i=0;igetInteriorRing(i);int pointCount=pOGRLinearRing0->getNumPoints();double x=0; double y=0;for(int i=0;igetX(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;igetGeometryRef(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;igetX(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;igetGeometryRef(i));pOGRMultiPolygon->addGeometry(pOGRGeo);}return pOGRMultiPolygon;}default:return NULL;}return NULL;}

0 0