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 + -
显示快捷键?