?? ogrshapelayer.cpp
字號(hào):
/* * Reading shape feature failed. */ return NULL;}/************************************************************************//* SetFeature() *//************************************************************************/OGRErr OGRShapeLayer::SetFeature( OGRFeature *poFeature ){ bHeaderDirty = TRUE; return SHPWriteOGRFeature( hSHP, hDBF, poFeatureDefn, poFeature );}/************************************************************************//* DeleteFeature() *//************************************************************************/OGRErr OGRShapeLayer::DeleteFeature( long nFID ){ if( nFID < 0 || (hSHP != NULL && nFID >= hSHP->nRecords) || (hDBF != NULL && nFID >= hDBF->nRecords) ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to delete shape with feature id (%d) which does " "not exist.", nFID ); return OGRERR_FAILURE; } if( !hDBF ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to delete shape in shapefile with no .dbf file.\n" "Deletion is done by marking record deleted in dbf\n" "and is not supported without a .dbf file." ); return OGRERR_FAILURE; } if( DBFIsRecordDeleted( hDBF, nFID ) ) { CPLError( CE_Failure, CPLE_AppDefined, "Attempt to delete shape with feature id (%d), but it is marked deleted already.", nFID ); return OGRERR_FAILURE; } if( !DBFMarkRecordDeleted( hDBF, nFID, TRUE ) ) return OGRERR_FAILURE; bHeaderDirty = TRUE; return OGRERR_NONE;}/************************************************************************//* CreateFeature() *//************************************************************************/OGRErr OGRShapeLayer::CreateFeature( OGRFeature *poFeature ){ OGRErr eErr; bHeaderDirty = TRUE; poFeature->SetFID( OGRNullFID ); if( nTotalShapeCount == 0 && eRequestedGeomType == wkbUnknown && poFeature->GetGeometryRef() != NULL ) { OGRGeometry *poGeom = poFeature->GetGeometryRef(); int nShapeType; switch( poGeom->getGeometryType() ) { case wkbPoint: nShapeType = SHPT_POINT; eRequestedGeomType = wkbPoint; break; case wkbPoint25D: nShapeType = SHPT_POINTZ; eRequestedGeomType = wkbPoint25D; break; case wkbMultiPoint: nShapeType = SHPT_MULTIPOINT; eRequestedGeomType = wkbMultiPoint; break; case wkbMultiPoint25D: nShapeType = SHPT_MULTIPOINTZ; eRequestedGeomType = wkbMultiPoint25D; break; case wkbLineString: nShapeType = SHPT_ARC; eRequestedGeomType = wkbLineString; break; case wkbLineString25D: nShapeType = SHPT_ARCZ; eRequestedGeomType = wkbLineString25D; break; case wkbPolygon: case wkbMultiPolygon: nShapeType = SHPT_POLYGON; eRequestedGeomType = wkbPolygon; break; case wkbPolygon25D: case wkbMultiPolygon25D: nShapeType = SHPT_POLYGONZ; eRequestedGeomType = wkbPolygon25D; break; default: nShapeType = -1; break; } if( nShapeType != -1 ) { ResetGeomType( nShapeType ); } } eErr = SHPWriteOGRFeature( hSHP, hDBF, poFeatureDefn, poFeature ); if( hSHP != NULL ) nTotalShapeCount = hSHP->nRecords; else nTotalShapeCount = hDBF->nRecords; return eErr;}/************************************************************************//* GetFeatureCount() *//* *//* If a spatial filter is in effect, we turn control over to *//* the generic counter. Otherwise we return the total count. *//* Eventually we should consider implementing a more efficient *//* way of counting features matching a spatial query. *//************************************************************************/int OGRShapeLayer::GetFeatureCount( int bForce ){ if( m_poFilterGeom != NULL || m_poAttrQuery != NULL ) return OGRLayer::GetFeatureCount( bForce ); else return nTotalShapeCount;}/************************************************************************//* GetExtent() *//* *//* Fetch extent of the data currently stored in the dataset. *//* The bForce flag has no effect on SHO files since that value *//* is always in the header. *//* *//* Returns OGRERR_NONE/OGRRERR_FAILURE. *//************************************************************************/OGRErr OGRShapeLayer::GetExtent (OGREnvelope *psExtent, int bForce){ double adMin[4], adMax[4]; if( hSHP == NULL ) return OGRERR_FAILURE; SHPGetInfo(hSHP, NULL, NULL, adMin, adMax); psExtent->MinX = adMin[0]; psExtent->MinY = adMin[1]; psExtent->MaxX = adMax[0]; psExtent->MaxY = adMax[1]; return OGRERR_NONE;}/************************************************************************//* TestCapability() *//************************************************************************/int OGRShapeLayer::TestCapability( const char * pszCap ){ if( EQUAL(pszCap,OLCRandomRead) ) return TRUE; else if( EQUAL(pszCap,OLCSequentialWrite) || EQUAL(pszCap,OLCRandomWrite) ) return bUpdateAccess; else if( EQUAL(pszCap,OLCFastFeatureCount) ) return m_poFilterGeom == NULL; else if( EQUAL(pszCap,OLCDeleteFeature) ) return TRUE; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return FALSE; else if( EQUAL(pszCap,OLCFastGetExtent) ) return TRUE; else if( EQUAL(pszCap,OLCFastSetNextByIndex) ) return m_poFilterGeom == NULL && m_poAttrQuery == NULL; else if( EQUAL(pszCap,OLCCreateField) ) return TRUE; else return FALSE;}/************************************************************************//* CreateField() *//************************************************************************/OGRErr OGRShapeLayer::CreateField( OGRFieldDefn *poField, int bApproxOK ){ CPLAssert( NULL != poField ); int iNewField; if( GetFeatureCount(TRUE) != 0 ) { CPLError( CE_Failure, CPLE_NotSupported, "Can't create fields on a Shapefile layer with features.\n"); return OGRERR_FAILURE; } if( !bUpdateAccess ) { CPLError( CE_Failure, CPLE_NotSupported, "Can't create fields on a read-only shapefile layer.\n"); return OGRERR_FAILURE; }/* -------------------------------------------------------------------- *//* Normalize field name *//* -------------------------------------------------------------------- */ char * pszNewFieldName = NULL; size_t nNameSize = strlen( poField->GetNameRef() ); pszNewFieldName = CPLScanString( poField->GetNameRef(), nNameSize, TRUE, TRUE); if( !EQUAL(poField->GetNameRef(),pszNewFieldName) ) CPLDebug( "Shape", "Normalized field name: '%s' to '%s'", poField->GetNameRef(), pszNewFieldName ); // Set field name with normalized value poField->SetName( pszNewFieldName ); CPLFree( pszNewFieldName );/* -------------------------------------------------------------------- *//* Add field to layer *//* -------------------------------------------------------------------- */ if( poField->GetType() == OFTInteger ) { if( poField->GetWidth() == 0 ) iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTInteger, 11, 0 ); else iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTInteger, poField->GetWidth(), 0 ); if( iNewField != -1 ) poFeatureDefn->AddFieldDefn( poField ); } else if( poField->GetType() == OFTReal ) { if( poField->GetWidth() == 0 ) iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTDouble, 24, 15 ); else iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTDouble, poField->GetWidth(), poField->GetPrecision() ); if( iNewField != -1 ) poFeatureDefn->AddFieldDefn( poField ); } else if( poField->GetType() == OFTString ) { if( poField->GetWidth() < 1 ) iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTString, 80, 0 ); else iNewField = DBFAddField( hDBF, poField->GetNameRef(), FTString, poField->GetWidth(), 0 ); if( iNewField != -1 ) poFeatureDefn->AddFieldDefn( poField ); } else if( poField->GetType() == OFTDate ) { iNewField = DBFAddNativeFieldType( hDBF, poField->GetNameRef(), 'D', 8, 0 ); if( iNewField != -1 ) poFeatureDefn->AddFieldDefn( poField ); } else if( poField->GetType() == OFTDateTime ) { CPLError( CE_Warning, CPLE_NotSupported, "Field %s create as date field, though DateTime requested.\n", poField->GetNameRef() ); iNewField = DBFAddNativeFieldType( hDBF, poField->GetNameRef(), 'D', 8, 0 ); if( iNewField != -1 ) poFeatureDefn->AddFieldDefn( poField ); } else { CPLError( CE_Failure, CPLE_NotSupported, "Can't create fields of type %s on shapefile layers.\n", OGRFieldDefn::GetFieldTypeName(poField->GetType()) ); return OGRERR_FAILURE; } if( iNewField != -1 ) { return OGRERR_NONE; } else { CPLError( CE_Failure, CPLE_AppDefined, "Can't create field %s in Shape DBF file, reason unknown.\n", poField->GetNameRef() ); return OGRERR_FAILURE; }}/************************************************************************//* GetSpatialRef() *//************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -