GDAL線面相互変換
12819 ワード
最近プロジェクトの需要のため、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)
{
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)
{
x=pOGRLinearRing->getX(i);
y=pOGRLinearRing->getY(i);
ogrLineString.addPoint(x,y);
}
pOGRMultiLineString->addGeometry(&ogrLineString);
for(int i=0;i)
{
//
OGRLineString ogrLineString0;
OGRLinearRing* pOGRLinearRing0 = pOGRPolygon->getInteriorRing(i);
int pointCount=pOGRLinearRing0->getNumPoints();
double x=0; double y=0;
for(int i=0;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)
{
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)
{
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)
{
OGRGeometry* pOGRGeo=ConvertPolylineToPolygon(pOGRPolylines->getGeometryRef(i));
pOGRMultiPolygon->addGeometry(pOGRGeo);
}
return pOGRMultiPolygon;
}
default:
return NULL;
}
return NULL;
}