ogrsdelayer.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 1,305 行 · 第 1/4 页
CPP
1,305 行
LONG *panSubParts; LONG *panParts; LFLOAT *padfZ = NULL; SE_shape_get_num_points( hShape, 0, 0, &nPointCount ); SE_shape_get_num_parts( hShape, &nPartCount, &nSubPartCount ); pasPoints = (SE_POINT *) CPLMalloc(nPointCount * sizeof(SE_POINT)); panParts = (LONG *) CPLMalloc(nPartCount * sizeof(LONG)); panSubParts = (LONG *) CPLMalloc(nSubPartCount * sizeof(LONG)); if( SE_shape_is_3D( hShape ) ) padfZ = (LFLOAT *) CPLMalloc(nPointCount * sizeof(LFLOAT)); nSDEErr = SE_shape_get_all_points( hShape, SE_DEFAULT_ROTATION, panParts, panSubParts, pasPoints, padfZ, NULL ); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_shape_get_all_points" ); return NULL; }/* -------------------------------------------------------------------- *//* Handle simple point. *//* -------------------------------------------------------------------- */ switch( nSDEGeomType ) { case SG_POINT_SHAPE: { CPLAssert( nPointCount == 1 ); CPLAssert( nSubPartCount == 1 ); CPLAssert( nPartCount == 1 ); if( padfZ ) poGeom = new OGRPoint( pasPoints[0].x, pasPoints[0].y, padfZ[0] ); else poGeom = new OGRPoint( pasPoints[0].x, pasPoints[0].y ); } break;/* -------------------------------------------------------------------- *//* Handle simple point. *//* -------------------------------------------------------------------- */ case SG_MULTI_POINT_SHAPE: { OGRMultiPoint *poMP = new OGRMultiPoint(); int iPart; CPLAssert( nPartCount == nSubPartCount ); // one vertex per point. CPLAssert( nPointCount == nPartCount ); for( iPart = 0; iPart < nPartCount; iPart++ ) { if( padfZ != NULL ) poMP->addGeometryDirectly( new OGRPoint( pasPoints[iPart].x, pasPoints[iPart].y, padfZ[iPart] ) ); else poMP->addGeometryDirectly( new OGRPoint( pasPoints[iPart].x, pasPoints[iPart].y ) ); } poGeom = poMP; } break;/* -------------------------------------------------------------------- *//* Handle line. *//* -------------------------------------------------------------------- */ case SG_LINE_SHAPE: case SG_SIMPLE_LINE_SHAPE: { OGRLineString *poLine = new OGRLineString(); int i; CPLAssert( nPartCount == 1 && nSubPartCount == 1 ); poLine->setNumPoints( nPointCount ); for( i = 0; i < nPointCount; i++ ) { if( padfZ ) poLine->setPoint( i, pasPoints[i].x, pasPoints[i].y, padfZ[i] ); else poLine->setPoint( i, pasPoints[i].x, pasPoints[i].y ); } poGeom = poLine; } break;/* -------------------------------------------------------------------- *//* Handle multi line. *//* -------------------------------------------------------------------- */ case SG_MULTI_LINE_SHAPE: case SG_MULTI_SIMPLE_LINE_SHAPE: { OGRMultiLineString *poMLS = new OGRMultiLineString(); int iPart; CPLAssert( nPartCount == nSubPartCount ); for( iPart = 0; iPart < nPartCount; iPart++ ) { OGRLineString *poLine = new OGRLineString(); int i, nLineVertCount; CPLAssert( panParts[iPart] == iPart ); // 1:1 correspondance if( iPart == nPartCount-1 ) nLineVertCount = nPointCount - panSubParts[iPart]; else nLineVertCount = panSubParts[iPart+1] - panSubParts[iPart]; poLine->setNumPoints( nLineVertCount ); for( i = 0; i < nLineVertCount; i++ ) { int iVert = i + panSubParts[iPart]; if( padfZ ) poLine->setPoint( i, pasPoints[iVert].x, pasPoints[iVert].y, padfZ[iVert] ); else poLine->setPoint( i, pasPoints[iVert].x, pasPoints[iVert].y ); } poMLS->addGeometryDirectly( poLine ); } poGeom = poMLS; } break;/* -------------------------------------------------------------------- *//* Handle polygon and multipolygon. Each subpart is a ring. *//* -------------------------------------------------------------------- */ case SG_AREA_SHAPE: case SG_MULTI_AREA_SHAPE: { int iPart; OGRMultiPolygon *poMP = NULL; if( nSDEGeomType == SG_MULTI_AREA_SHAPE ) poMP = new OGRMultiPolygon(); for( iPart = 0; iPart < nPartCount; iPart++ ) { OGRPolygon *poPoly = new OGRPolygon(); int iVert, iSubPart; int nNextSubPart; if( iPart == nPartCount-1 ) nNextSubPart = nSubPartCount; else nNextSubPart = panParts[iPart+1]; for( iSubPart = panParts[iPart]; iSubPart < nNextSubPart; iSubPart++ ) { OGRLinearRing *poRing = new OGRLinearRing(); int nRingVertCount; if( iSubPart == nSubPartCount-1 ) nRingVertCount = nPointCount - panSubParts[iSubPart]; else nRingVertCount = panSubParts[iSubPart+1] - panSubParts[iSubPart]; poRing->setNumPoints( nRingVertCount ); for( iVert=0; iVert < nRingVertCount; iVert++ ) { if( padfZ ) poRing->setPoint( iVert, pasPoints[iVert+panSubParts[iSubPart]].x, pasPoints[iVert+panSubParts[iSubPart]].y, padfZ[iVert+panSubParts[iSubPart]] ); else poRing->setPoint( iVert, pasPoints[iVert+panSubParts[iSubPart]].x, pasPoints[iVert+panSubParts[iSubPart]].y ); } poPoly->addRingDirectly( poRing ); } if( poMP ) poMP->addGeometryDirectly( poPoly ); else poGeom = poPoly; } if( poMP ) poGeom = poMP; } break;/* -------------------------------------------------------------------- *//* Report unsupported geometries. *//* -------------------------------------------------------------------- */ default: { CPLError( CE_Warning, CPLE_NotSupported, "Unsupported geometry type: %d", nSDEGeomType ); } }/* -------------------------------------------------------------------- *//* Cleanup *//* -------------------------------------------------------------------- */ CPLFree( pasPoints ); CPLFree( panParts ); CPLFree( panSubParts ); CPLFree( padfZ ); return poGeom;}/************************************************************************//* TranslateSDERecord() *//************************************************************************/OGRFeature *OGRSDELayer::TranslateSDERecord(){ unsigned int i; int nSDEErr; OGRFeature *poFeat = new OGRFeature( poFeatureDefn );/* -------------------------------------------------------------------- *//* Translate field values. *//* -------------------------------------------------------------------- */ for( i = 0; i < anFieldMap.size(); i++ ) { OGRFieldDefn *poFieldDef = poFeatureDefn->GetFieldDefn( i ); switch( anFieldTypeMap[i] ) { case SE_SMALLINT_TYPE: { short nShort; nSDEErr = SE_stream_get_smallint( hStream, anFieldMap[i]+1, &nShort ); if( nSDEErr == SE_SUCCESS ) poFeat->SetField( i, (int) nShort ); else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_smallint" ); return NULL; } } break; case SE_INTEGER_TYPE: { LONG nValue; nSDEErr = SE_stream_get_integer( hStream, anFieldMap[i]+1, &nValue ); if( nSDEErr == SE_SUCCESS ) poFeat->SetField( i, (int) nValue ); else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_integer" ); return NULL; } } break; case SE_FLOAT_TYPE: { float fValue; nSDEErr = SE_stream_get_float( hStream, anFieldMap[i]+1, &fValue ); if( nSDEErr == SE_SUCCESS ) poFeat->SetField( i, (double) fValue ); else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_float" ); return NULL; } } break; case SE_DOUBLE_TYPE: { double dfValue; nSDEErr = SE_stream_get_double( hStream, anFieldMap[i]+1, &dfValue ); if( nSDEErr == SE_SUCCESS ) poFeat->SetField( i, dfValue ); else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_double" ); return NULL; } } break; case SE_STRING_TYPE: { char *pszTempString = (char *) CPLMalloc(poFieldDef->GetWidth()+1); nSDEErr = SE_stream_get_string( hStream, anFieldMap[i]+1, pszTempString ); if( nSDEErr == SE_SUCCESS ) poFeat->SetField( i, pszTempString ); else if( nSDEErr != SE_NULL_VALUE ) { poDS->IssueSDEError( nSDEErr, "SE_stream_get_string" ); return NULL; } CPLFree( pszTempString ); } break; case SE_BLOB_TYPE: {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?