📄 s57reader.cpp
字号:
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 + -