SDTSPolygonReader *SDTSTransfer::GetLayerPolygonReader( int iEntry ) { SDTSPolygonReader *poPolyReader; if( iEntry < 0 || iEntry >= nLayers || oCATD.GetEntryType( panLayerCATDEntry[iEntry] ) != SLTPoly ) { return NULL; } poPolyReader = new SDTSPolygonReader(); if( !poPolyReader->Open( oCATD.GetEntryFilePath( panLayerCATDEntry[iEntry] ) ) ) { delete poPolyReader; return NULL; } else { return poPolyReader; } }
SDTSPolygonReader *SDTSTransfer::GetLayerPolygonReader( int iEntry ) { if( iEntry < 0 || iEntry >= nLayers || oCATD.GetEntryType( panLayerCATDEntry[iEntry] ) != SLTPoly ) { return nullptr; } SDTSPolygonReader *poPolyReader = new SDTSPolygonReader(); if( !poPolyReader->Open( oCATD.GetEntryFilePath( panLayerCATDEntry[iEntry] ) ) ) { panLayerCATDEntry[iEntry] = SLTUnknown; // to prevent further attempt delete poPolyReader; return nullptr; } return poPolyReader; }
static void WritePolygonShapefile( const char * pszShapefile, SDTSTransfer * poTransfer, const char * pszMODN ) { SDTSPolygonReader *poPolyReader; /* -------------------------------------------------------------------- */ /* Fetch a reference to the indexed polygon reader. */ /* -------------------------------------------------------------------- */ poPolyReader = (SDTSPolygonReader *) poTransfer->GetLayerIndexedReader( poTransfer->FindLayer( pszMODN ) ); if( poPolyReader == NULL ) { fprintf( stderr, "Failed to open %s.\n", poTransfer->GetCATD()->GetModuleFilePath( pszMODN ) ); return; } /* -------------------------------------------------------------------- */ /* Assemble polygon geometries from all the line layers. */ /* -------------------------------------------------------------------- */ poPolyReader->AssembleRings( poTransfer, poTransfer->FindLayer(pszMODN) ); /* -------------------------------------------------------------------- */ /* Create the Shapefile. */ /* -------------------------------------------------------------------- */ SHPHandle hSHP; hSHP = SHPCreate( pszShapefile, SHPT_POLYGON ); if( hSHP == NULL ) { fprintf( stderr, "Unable to create shapefile `%s'\n", pszShapefile ); return; } /* -------------------------------------------------------------------- */ /* Create the database file, and our basic set of attributes. */ /* -------------------------------------------------------------------- */ DBFHandle hDBF; int nSDTSRecordField; char szDBFFilename[1024]; sprintf( szDBFFilename, "%s.dbf", pszShapefile ); hDBF = DBFCreate( szDBFFilename ); if( hDBF == NULL ) { fprintf( stderr, "Unable to create shapefile .dbf for `%s'\n", pszShapefile ); return; } nSDTSRecordField = DBFAddField( hDBF, "SDTSRecId", FTInteger, 8, 0 ); char **papszModRefs = poPolyReader->ScanModuleReferences(); AddPrimaryAttrToDBFSchema( hDBF, poTransfer, papszModRefs ); CSLDestroy( papszModRefs ); /* ==================================================================== */ /* Process all the polygon features in the module. */ /* ==================================================================== */ SDTSRawPolygon *poRawPoly; poPolyReader->Rewind(); while( (poRawPoly = (SDTSRawPolygon *) poPolyReader->GetNextFeature()) != NULL ) { int iShape; /* -------------------------------------------------------------------- */ /* Write out a shape with the vertices. */ /* -------------------------------------------------------------------- */ SHPObject *psShape; psShape = SHPCreateObject( SHPT_POLYGON, -1, poRawPoly->nRings, poRawPoly->panRingStart, NULL, poRawPoly->nVertices, poRawPoly->padfX, poRawPoly->padfY, poRawPoly->padfZ, NULL ); iShape = SHPWriteObject( hSHP, -1, psShape ); SHPDestroyObject( psShape ); /* -------------------------------------------------------------------- */ /* Write out the attributes. */ /* -------------------------------------------------------------------- */ DBFWriteIntegerAttribute( hDBF, iShape, nSDTSRecordField, poRawPoly->oModId.nRecord ); WritePrimaryAttrToDBF( hDBF, iShape, poTransfer, poRawPoly ); if( !poPolyReader->IsIndexed() ) delete poRawPoly; } /* -------------------------------------------------------------------- */ /* Close, and cleanup. */ /* -------------------------------------------------------------------- */ DBFClose( hDBF ); SHPClose( hSHP ); }
void SDTSLineReader::AttachToPolygons( SDTSTransfer * poTransfer, int iTargetPolyLayer ) { /* -------------------------------------------------------------------- */ /* We force a filling of the index because when we attach the */ /* lines we are just providing a pointer back to the line */ /* features in this readers index. If they aren't cached in */ /* the index then the pointer will be invalid. */ /* -------------------------------------------------------------------- */ FillIndex(); /* ==================================================================== */ /* Loop over all lines, attaching them to the polygons they */ /* have as right and left faces. */ /* ==================================================================== */ Rewind(); SDTSRawLine *poLine; SDTSPolygonReader *poPolyReader = NULL; while( (poLine = reinterpret_cast<SDTSRawLine *>( GetNextFeature()) ) != NULL ) { /* -------------------------------------------------------------------- */ /* Skip lines with the same left and right polygon face. These */ /* are dangles, and will not contribute in any useful fashion */ /* to the resulting polygon. */ /* -------------------------------------------------------------------- */ if( poLine->oLeftPoly.nRecord == poLine->oRightPoly.nRecord ) continue; /* -------------------------------------------------------------------- */ /* If we don't have our indexed polygon reader yet, try to get */ /* it now. */ /* -------------------------------------------------------------------- */ if( poPolyReader == NULL ) { int iPolyLayer = -1; if( poLine->oLeftPoly.nRecord != -1 ) { iPolyLayer = poTransfer->FindLayer(poLine->oLeftPoly.szModule); } else if( poLine->oRightPoly.nRecord != -1 ) { iPolyLayer = poTransfer->FindLayer(poLine->oRightPoly.szModule); } if( iPolyLayer == -1 ) continue; if( iPolyLayer != iTargetPolyLayer ) continue; poPolyReader = reinterpret_cast<SDTSPolygonReader *>( poTransfer->GetLayerIndexedReader(iPolyLayer) ); if( poPolyReader == NULL ) return; } /* -------------------------------------------------------------------- */ /* Attach line to right and/or left polygons. */ /* -------------------------------------------------------------------- */ if( poLine->oLeftPoly.nRecord != -1 ) { SDTSRawPolygon *poPoly = reinterpret_cast<SDTSRawPolygon *>( poPolyReader->GetIndexedFeatureRef( poLine->oLeftPoly.nRecord ) ); if( poPoly != NULL ) poPoly->AddEdge( poLine ); } if( poLine->oRightPoly.nRecord != -1 ) { SDTSRawPolygon *poPoly = reinterpret_cast<SDTSRawPolygon *>( poPolyReader->GetIndexedFeatureRef( poLine->oRightPoly.nRecord ) ); if( poPoly != NULL ) poPoly->AddEdge( poLine ); } } }