⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s57reader.cpp

📁 支持各种栅格图像和矢量图像读取的库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        poFeature->SetField( "DSSI_NOLR",                     poDSIDRecord->GetIntSubfield( "DSSI", 0, "NOLR", 0 ));        poFeature->SetField( "DSSI_NOIN",                     poDSIDRecord->GetIntSubfield( "DSSI", 0, "NOIN", 0 ));        poFeature->SetField( "DSSI_NOCN",                     poDSIDRecord->GetIntSubfield( "DSSI", 0, "NOCN", 0 ));        poFeature->SetField( "DSSI_NOED",                     poDSIDRecord->GetIntSubfield( "DSSI", 0, "NOED", 0 ));        poFeature->SetField( "DSSI_NOFA",                     poDSIDRecord->GetIntSubfield( "DSSI", 0, "NOFA", 0 ));    }/* -------------------------------------------------------------------- *//*      Apply DSPM record.                                              *//* -------------------------------------------------------------------- */    if( poDSPMRecord != NULL )    {        poFeature->SetField( "DSPM_HDAT",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "HDAT", 0 ));        poFeature->SetField( "DSPM_VDAT",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "VDAT", 0 ));        poFeature->SetField( "DSPM_SDAT",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "SDAT", 0 ));        poFeature->SetField( "DSPM_CSCL",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "CSCL", 0 ));        poFeature->SetField( "DSPM_DUNI",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "DUNI", 0 ));        poFeature->SetField( "DSPM_HUNI",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "HUNI", 0 ));        poFeature->SetField( "DSPM_PUNI",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "PUNI", 0 ));        poFeature->SetField( "DSPM_COUN",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "COUN", 0 ));        poFeature->SetField( "DSPM_COMF",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "COMF", 0 ));        poFeature->SetField( "DSPM_SOMF",                      poDSPMRecord->GetIntSubfield( "DSPM", 0, "SOMF", 0 ));        poFeature->SetField( "DSPM_COMT",                      poDSPMRecord->GetStringSubfield( "DSPM", 0, "COMT", 0 ));    }    poFeature->SetFID( nNextDSIDIndex++ );    return poFeature;}/************************************************************************//*                             ReadVector()                             *//*                                                                      *//*      Read a vector primitive objects based on the type (RCNM_)       *//*      and index within the related index.                             *//************************************************************************/OGRFeature *S57Reader::ReadVector( int nFeatureId, int nRCNM ){    DDFRecordIndex *poIndex;    const char *pszFDName = NULL;/* -------------------------------------------------------------------- *//*      What type of vector are we fetching.                            *//* -------------------------------------------------------------------- */    switch( nRCNM )    {      case RCNM_VI:        poIndex = &oVI_Index;        pszFDName = OGRN_VI;        break;              case RCNM_VC:        poIndex = &oVC_Index;        pszFDName = OGRN_VC;        break;              case RCNM_VE:        poIndex = &oVE_Index;        pszFDName = OGRN_VE;        break;      case RCNM_VF:        poIndex = &oVF_Index;        pszFDName = OGRN_VF;        break;              default:        CPLAssert( FALSE );        return NULL;    }    if( nFeatureId < 0 || nFeatureId >= poIndex->GetCount() )        return NULL;    DDFRecord *poRecord = poIndex->GetByIndex( nFeatureId );/* -------------------------------------------------------------------- *//*      Find the feature definition to use.                             *//* -------------------------------------------------------------------- */    OGRFeatureDefn *poFDefn = NULL;    for( int i = 0; i < nFDefnCount; i++ )    {        if( EQUAL(papoFDefnList[i]->GetName(),pszFDName) )                      {            poFDefn = papoFDefnList[i];            break;        }    }        if( poFDefn == NULL )    {        CPLAssert( FALSE );        return NULL;    }/* -------------------------------------------------------------------- *//*      Create feature, and assign standard fields.                     *//* -------------------------------------------------------------------- */    OGRFeature *poFeature = new OGRFeature( poFDefn );        poFeature->SetFID( nFeatureId );    poFeature->SetField( "RCNM",                          poRecord->GetIntSubfield( "VRID", 0, "RCNM",0) );    poFeature->SetField( "RCID",                          poRecord->GetIntSubfield( "VRID", 0, "RCID",0) );    poFeature->SetField( "RVER",                          poRecord->GetIntSubfield( "VRID", 0, "RVER",0) );    poFeature->SetField( "RUIN",                          poRecord->GetIntSubfield( "VRID", 0, "RUIN",0) );/* -------------------------------------------------------------------- *//*      Collect point geometries.                                       *//* -------------------------------------------------------------------- */    if( nRCNM == RCNM_VI || nRCNM == RCNM_VC )     {        double dfX=0.0, dfY=0.0, dfZ=0.0;        if( poRecord->FindField( "SG2D" ) != NULL )        {            dfX = poRecord->GetIntSubfield("SG2D",0,"XCOO",0) / (double)nCOMF;            dfY = poRecord->GetIntSubfield("SG2D",0,"YCOO",0) / (double)nCOMF;            poFeature->SetGeometryDirectly( new OGRPoint( dfX, dfY ) );        }        else if( poRecord->FindField( "SG3D" ) != NULL ) /* presume sounding*/        {            int i, nVCount = poRecord->FindField("SG3D")->GetRepeatCount();            if( nVCount == 1 )            {                dfX =poRecord->GetIntSubfield("SG3D",0,"XCOO",0)/(double)nCOMF;                dfY =poRecord->GetIntSubfield("SG3D",0,"YCOO",0)/(double)nCOMF;                dfZ =poRecord->GetIntSubfield("SG3D",0,"VE3D",0)/(double)nSOMF;                poFeature->SetGeometryDirectly( new OGRPoint( dfX, dfY, dfZ ));            }            else            {                OGRMultiPoint *poMP = new OGRMultiPoint();                for( i = 0; i < nVCount; i++ )                {                    dfX = poRecord->GetIntSubfield("SG3D",0,"XCOO",i)                        / (double)nCOMF;                    dfY = poRecord->GetIntSubfield("SG3D",0,"YCOO",i)                        / (double)nCOMF;                    dfZ = poRecord->GetIntSubfield("SG3D",0,"VE3D",i)                        / (double)nSOMF;                                        poMP->addGeometryDirectly( new OGRPoint( dfX, dfY, dfZ ) );                }                poFeature->SetGeometryDirectly( poMP );            }        }    }/* -------------------------------------------------------------------- *//*      Collect an edge geometry.                                       *//* -------------------------------------------------------------------- */    else if( nRCNM == RCNM_VE && poRecord->FindField( "SG2D" ) != NULL )    {        int i, nVCount = poRecord->FindField("SG2D")->GetRepeatCount();        OGRLineString *poLine = new OGRLineString();        poLine->setNumPoints( nVCount );                for( i = 0; i < nVCount; i++ )        {            poLine->setPoint(                 i,                 poRecord->GetIntSubfield("SG2D",0,"XCOO",i) / (double)nCOMF,                poRecord->GetIntSubfield("SG2D",0,"YCOO",i) / (double)nCOMF );        }        poFeature->SetGeometryDirectly( poLine );    }/* -------------------------------------------------------------------- *//*      Special edge fields.                                            *//* -------------------------------------------------------------------- */    DDFField *poVRPT;    if( nRCNM == RCNM_VE         && (poVRPT = poRecord->FindField( "VRPT" )) != NULL )    {        poFeature->SetField( "NAME_RCNM_0", RCNM_VC );        poFeature->SetField( "NAME_RCID_0", ParseName( poVRPT, 0 ) );        poFeature->SetField( "ORNT_0",                              poRecord->GetIntSubfield("VRPT",0,"ORNT",0) );        poFeature->SetField( "USAG_0",                              poRecord->GetIntSubfield("VRPT",0,"USAG",0) );        poFeature->SetField( "TOPI_0",                              poRecord->GetIntSubfield("VRPT",0,"TOPI",0) );        poFeature->SetField( "MASK_0",                              poRecord->GetIntSubfield("VRPT",0,"MASK",0) );                                             poFeature->SetField( "NAME_RCNM_1", RCNM_VC );        poFeature->SetField( "NAME_RCID_1", ParseName( poVRPT, 1 ) );        poFeature->SetField( "ORNT_1",                              poRecord->GetIntSubfield("VRPT",0,"ORNT",1) );        poFeature->SetField( "USAG_1",                              poRecord->GetIntSubfield("VRPT",0,"USAG",1) );        poFeature->SetField( "TOPI_1",                              poRecord->GetIntSubfield("VRPT",0,"TOPI",1) );        poFeature->SetField( "MASK_1",                              poRecord->GetIntSubfield("VRPT",0,"MASK",1) );    }    return poFeature;}/************************************************************************//*                             FetchPoint()                             *//*                                                                      *//*      Fetch the location of a spatial point object.                   *//************************************************************************/int S57Reader::FetchPoint( int nRCNM, int nRCID,                           double * pdfX, double * pdfY, double * pdfZ ){    DDFRecord   *poSRecord;        if( nRCNM == RCNM_VI )        poSRecord = oVI_Index.FindRecord( nRCID );    else        poSRecord = oVC_Index.FindRecord( nRCID );    if( poSRecord == NULL )        return FALSE;    double      dfX = 0.0, dfY = 0.0, dfZ = 0.0;    if( poSRecord->FindField( "SG2D" ) != NULL )    {        dfX = poSRecord->GetIntSubfield("SG2D",0,"XCOO",0) / (double)nCOMF;        dfY = poSRecord->GetIntSubfield("SG2D",0,"YCOO",0) / (double)nCOMF;    }    else if( poSRecord->FindField( "SG3D" ) != NULL )    {        dfX = poSRecord->GetIntSubfield("SG3D",0,"XCOO",0) / (double)nCOMF;        dfY = poSRecord->GetIntSubfield("SG3D",0,"YCOO",0) / (double)nCOMF;        dfZ = poSRecord->GetIntSubfield("SG3D",0,"VE3D",0) / (double)nSOMF;    }    else        return FALSE;    if( pdfX != NULL )        *pdfX = dfX;    if( pdfY != NULL )        *pdfY = dfY;    if( pdfZ != NULL )        *pdfZ = dfZ;    return TRUE;}/************************************************************************//*                  S57StrokeArcToOGRGeometry_Angles()                  *//************************************************************************/static OGRLineString *S57StrokeArcToOGRGeometry_Angles( double dfCenterX, double dfCenterY,                                   double dfRadius,                                   double dfStartAngle, double dfEndAngle,                                  int nVertexCount ){    OGRLineString      *poLine = new OGRLineString;    double             dfArcX, dfArcY, dfSlice;    int                iPoint;    nVertexCount = MAX(2,nVertexCount);    dfSlice = (dfEndAngle-dfStartAngle)/(nVertexCount-1);    poLine->setNumPoints( nVertexCount );            for( iPoint=0; iPoint < nVertexCount; iPoint++ )    {        double      dfAngle;        dfAngle = (dfStartAngle + iPoint * dfSlice) * PI / 180.0;                    dfArcX = dfCenterX + cos(dfAngle) * dfRadius;        dfArcY = dfCenterY + sin(dfAngle) * dfRadius;        poLine->setPoint( iPoint, dfArcX, dfArcY );    }    return poLine;}/************************************************************************//*                  S57StrokeArcToOGRGeometry_Points()                  *//************************************************************************/static OGRLineString *S57StrokeArcToOGRGeometry_Points( double dfStartX, double dfStartY,                                  double dfCenterX, double dfCenterY,                                  double dfEndX, double dfEndY,                                  int nVertexCount )    {    double      dfStartAngle, dfEndAngle;    double      dfRadius;    if( dfStartX == dfEndX && dfStartY == dfEndY )    {        dfStartAngle = 0.0;        dfEndAngle = 360.0;    }    else    {        double  dfDeltaX, dfDeltaY;        dfDeltaX = dfStartX - dfCenterX;        dfDeltaY = dfStartY - dfCenterY;        dfStartAngle = atan2(dfDeltaY,dfDeltaX) * 180.0 / PI;        dfDeltaX = dfEndX - dfCenterX;        dfDeltaY = dfEndY - dfCenterY;        dfEndAngle = atan2(dfDeltaY,dfDeltaX) * 180.0 / PI;#ifdef notdef        if( dfStartAngle > dfAlongAngle && dfAlongAngle > dfEndAngle )        {            double dfTempAngle;            dfTempAngle = dfStartAngle;            dfStartAngle = dfEndAngle;            dfEndAngle = dfTempAngle;        }#endif        while( dfStartAngle < dfEndAngle )            dfStartAngle += 360.0;//        while( dfAlongAngle < dfStartAngle )//            dfAlongAngle += 360.0;//        while( dfEndAngle < dfAlongAngle )//            dfEndAngle += 360.0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -