?? shape2ogr.cpp
字號:
SHPDestroyObject( psShape ); CPLFree( papoRings ); CPLFree( panRingStart ); CPLFree( padfX ); CPLFree( padfY ); CPLFree( padfZ ); } else { /* do nothing for multipatch */ return OGRERR_UNSUPPORTED_GEOMETRY_TYPE; } return OGRERR_NONE;}/************************************************************************//* SHPReadOGRFeatureDefn() *//************************************************************************/OGRFeatureDefn *SHPReadOGRFeatureDefn( const char * pszName, SHPHandle hSHP, DBFHandle hDBF ){ OGRFeatureDefn *poDefn = new OGRFeatureDefn( pszName ); int iField; poDefn->Reference(); for( iField = 0; hDBF != NULL && iField < DBFGetFieldCount( hDBF ); iField++ ) { char szFieldName[20]; int nWidth, nPrecision; DBFFieldType eDBFType; OGRFieldDefn oField("", OFTInteger); char chNativeType; chNativeType = DBFGetNativeFieldType( hDBF, iField ); eDBFType = DBFGetFieldInfo( hDBF, iField, szFieldName, &nWidth, &nPrecision ); oField.SetName( szFieldName ); oField.SetWidth( nWidth ); oField.SetPrecision( nPrecision ); if( chNativeType == 'D' ) { /* XXX - mloskot: * Shapefile date has following 8-chars long format: 20060101. * OGR splits it as YYYY/MM/DD, so 2 additional characters are required. * Is this correct assumtion? What about time part of date? * Shouldn't this format look as datetime: YYYY/MM/DD HH:MM:SS * with 4 additional characters? */ oField.SetWidth( nWidth + 2 ); oField.SetType( OFTDate ); } else if( eDBFType == FTDouble ) oField.SetType( OFTReal ); else if( eDBFType == FTInteger ) oField.SetType( OFTInteger ); else oField.SetType( OFTString ); poDefn->AddFieldDefn( &oField ); } if( hSHP == NULL ) poDefn->SetGeomType( wkbNone ); else { switch( hSHP->nShapeType ) { case SHPT_POINT: case SHPT_POINTM: poDefn->SetGeomType( wkbPoint ); break; case SHPT_POINTZ: poDefn->SetGeomType( wkbPoint25D ); break; case SHPT_ARC: case SHPT_ARCM: poDefn->SetGeomType( wkbLineString ); break; case SHPT_ARCZ: poDefn->SetGeomType( wkbLineString25D ); break; case SHPT_MULTIPOINT: case SHPT_MULTIPOINTM: poDefn->SetGeomType( wkbMultiPoint ); break; case SHPT_MULTIPOINTZ: poDefn->SetGeomType( wkbMultiPoint25D ); break; case SHPT_POLYGON: case SHPT_POLYGONM: poDefn->SetGeomType( wkbPolygon ); break; case SHPT_POLYGONZ: poDefn->SetGeomType( wkbPolygon25D ); break; } } return poDefn;}/************************************************************************//* SHPReadOGRFeature() *//************************************************************************/OGRFeature *SHPReadOGRFeature( SHPHandle hSHP, DBFHandle hDBF, OGRFeatureDefn * poDefn, int iShape ){ if( iShape < 0 || (hSHP != NULL && iShape >= hSHP->nRecords) || (hDBF != NULL && iShape >= hDBF->nRecords) ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to read shape with feature id (%d) out of available" " range.", iShape ); return NULL; } if( hDBF && DBFIsRecordDeleted( hDBF, iShape ) ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to read shape with feature id (%d), but it is marked deleted.", iShape ); return NULL; } OGRFeature *poFeature = new OGRFeature( poDefn );/* -------------------------------------------------------------------- *//* Fetch geometry from Shapefile to OGRFeature. *//* -------------------------------------------------------------------- */ if( hSHP != NULL ) { OGRGeometry* poGeometry = NULL; poGeometry = SHPReadOGRObject( hSHP, iShape ); /* * NOTE - mloskot: * Two possibilities are expected here (bot hare tested by GDAL Autotests): * 1. Read valid geometry and assign it directly. * 2. Read and assign null geometry if it can not be read correctly from a shapefile * * It's NOT required here to test poGeometry == NULL. */ poFeature->SetGeometryDirectly( poGeometry ); }/* -------------------------------------------------------------------- *//* Fetch feature attributes to OGRFeature fields. *//* -------------------------------------------------------------------- */ for( int iField = 0; iField < poDefn->GetFieldCount(); iField++ ) { // Skip null fields. if( DBFIsAttributeNULL( hDBF, iShape, iField ) ) continue; switch( poDefn->GetFieldDefn(iField)->GetType() ) { case OFTString: poFeature->SetField( iField, DBFReadStringAttribute( hDBF, iShape, iField ) ); break; case OFTInteger: poFeature->SetField( iField, DBFReadIntegerAttribute( hDBF, iShape, iField ) ); break; case OFTReal: poFeature->SetField( iField, DBFReadDoubleAttribute( hDBF, iShape, iField ) ); break; case OFTDate: { OGRField sFld; int nFullDate = DBFReadIntegerAttribute( hDBF, iShape, iField ); memset( &sFld, 0, sizeof(sFld) ); sFld.Date.Year = nFullDate / 10000; sFld.Date.Month = (nFullDate / 100) % 100; sFld.Date.Day = nFullDate % 100; poFeature->SetField( iField, &sFld ); } break; default: CPLAssert( FALSE ); } } if( poFeature != NULL ) poFeature->SetFID( iShape ); return( poFeature );}/************************************************************************//* SHPWriteOGRFeature() *//* *//* Write to an existing feature in a shapefile, or create a new *//* feature. *//************************************************************************/OGRErr SHPWriteOGRFeature( SHPHandle hSHP, DBFHandle hDBF, OGRFeatureDefn * poDefn, OGRFeature * poFeature ){#ifdef notdef/* -------------------------------------------------------------------- *//* Don't write objects with missing geometry. *//* -------------------------------------------------------------------- */ if( poFeature->GetGeometryRef() == NULL && hSHP != NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to write feature without geometry not supported" " for shapefile driver." ); return OGRERR_UNSUPPORTED_GEOMETRY_TYPE; }#endif/* -------------------------------------------------------------------- *//* Write the geometry. *//* -------------------------------------------------------------------- */ OGRErr eErr; if( hSHP != NULL ) { eErr = SHPWriteOGRObject( hSHP, poFeature->GetFID(), poFeature->GetGeometryRef() ); if( eErr != OGRERR_NONE ) return eErr; } /* -------------------------------------------------------------------- *//* If this is a new feature, establish it's feature id. *//* -------------------------------------------------------------------- */ if( poFeature->GetFID() == OGRNullFID ) poFeature->SetFID( DBFGetRecordCount( hDBF ) );/* -------------------------------------------------------------------- *//* If this is the first feature to be written, verify that we *//* have at least one attribute in the DBF file. If not, create *//* a dummy FID attribute to satisfy the requirement that there *//* be at least one attribute. *//* -------------------------------------------------------------------- */ if( DBFGetRecordCount( hDBF ) == 0 && DBFGetFieldCount( hDBF ) == 0 ) { CPLDebug( "OGR", "Created dummy FID field for shapefile since schema is empty."); DBFAddField( hDBF, "FID", FTInteger, 11, 0 ); }/* -------------------------------------------------------------------- *//* Write out dummy field value if it exists. *//* -------------------------------------------------------------------- */ if( DBFGetFieldCount( hDBF ) == 1 && poDefn->GetFieldCount() == 0 ) { DBFWriteIntegerAttribute( hDBF, poFeature->GetFID(), 0, poFeature->GetFID() ); }/* -------------------------------------------------------------------- *//* Write all the fields. *//* -------------------------------------------------------------------- */ for( int iField = 0; iField < poDefn->GetFieldCount(); iField++ ) { if( !poFeature->IsFieldSet( iField ) ) { DBFWriteNULLAttribute( hDBF, poFeature->GetFID(), iField ); continue; } switch( poDefn->GetFieldDefn(iField)->GetType() ) { case OFTString: DBFWriteStringAttribute( hDBF, poFeature->GetFID(), iField, poFeature->GetFieldAsString( iField )); break; case OFTInteger: DBFWriteIntegerAttribute( hDBF, poFeature->GetFID(), iField, poFeature->GetFieldAsInteger(iField) ); break; case OFTReal: DBFWriteDoubleAttribute( hDBF, poFeature->GetFID(), iField, poFeature->GetFieldAsDouble(iField) ); break; case OFTDate: int nYear, nMonth, nDay; if( poFeature->GetFieldAsDateTime( iField, &nYear, &nMonth, &nDay, NULL, NULL, NULL, NULL ) ) { DBFWriteIntegerAttribute( hDBF, poFeature->GetFID(), iField, nYear*10000 + nMonth*100 + nDay ); } } break; default: CPLAssert( FALSE ); } } return OGRERR_NONE;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -