📄 ogrfmelayer.cpp
字号:
eAttrGeomType = wkbPolygon; else if( EQUAL(poAttrValue->data(),"fme_rounded_rectangle") ) eAttrGeomType = wkbPolygon; else if( EQUAL(poAttrValue->data(),"fme_line") ) eAttrGeomType = wkbLineString; else if( EQUAL(poAttrValue->data(),"fme_arc") ) eAttrGeomType = wkbLineString; else if( EQUAL(poAttrValue->data(),"fme_aggregate") ) eAttrGeomType = wkbGeometryCollection; else if( EQUAL(poAttrValue->data(),"fme_no_geom") ) eAttrGeomType = wkbNone; else { CPLDebug( "FME_OLEDB", "geometry field %s has unknown value %s, ignored.", pszAttrName, poAttrValue->data() ); continue; } if( eGeomType == wkbNone ) eGeomType = eAttrGeomType; else if( eGeomType != eAttrGeomType ) eGeomType = wkbUnknown; }/* -------------------------------------------------------------------- *//* Skip '*' attributes which appear to be the raw attribute *//* names from the source reader. The versions that don't start *//* with * appear to be massaged suitably for use, with fme *//* standard data types. *//* -------------------------------------------------------------------- */ if( EQUALN(pszAttrName,"fme_geometry",12) || pszAttrName[0] == '*' || EQUALN(pszAttrName,"fme_geomattr",12) ) { continue; }/* -------------------------------------------------------------------- *//* Parse the type into tokens for easier use. *//* -------------------------------------------------------------------- */ char **papszTokens; papszTokens = CSLTokenizeStringComplex( poAttrValue->data(), "(,", FALSE, FALSE );/* -------------------------------------------------------------------- *//* Establish new fields. *//* -------------------------------------------------------------------- */ OGRFieldType eType; int nWidth, nPrecision = 0; if( CSLCount(papszTokens) == 2 && EQUAL(papszTokens[0],"fme_char") ) { eType = OFTString; nWidth = atoi(papszTokens[1]); } else if( CSLCount(papszTokens) == 3 && EQUAL(papszTokens[0],"fme_decimal") ) { nWidth = atoi(papszTokens[1]); nPrecision = atoi(papszTokens[2]); if( nPrecision == 0 ) eType = OFTInteger; else eType = OFTReal; } else if( CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0],"fme_int16") ) { nWidth = 6; nPrecision = 0; eType = OFTInteger; } else if( CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0],"fme_int32") ) { nWidth = 0; nPrecision = 0; eType = OFTInteger; } else if( CSLCount(papszTokens) == 1 && (EQUAL(papszTokens[0],"fme_real32") || EQUAL(papszTokens[0],"fme_real64")) ) { nWidth = 0; nPrecision = 0; eType = OFTReal; } else if( CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0],"fme_boolean") ) { nWidth = 1; nPrecision = 0; eType = OFTInteger; } else { printf( "Not able to translate field type: %s\n", poAttrValue->data() ); CSLDestroy( papszTokens ); continue; }/* -------------------------------------------------------------------- *//* Add the field to the feature definition. *//* -------------------------------------------------------------------- */ OGRFieldDefn oFieldDefn( pszAttrName, eType ); oFieldDefn.SetWidth( nWidth ); oFieldDefn.SetPrecision( nPrecision ); poFeatureDefn->AddFieldDefn( &oFieldDefn ); CSLDestroy( papszTokens ); }/* -------------------------------------------------------------------- *//* Assign the geometry type ... try to apply 3D-ness as well. *//* -------------------------------------------------------------------- */ if( poSchemaFeature->getDimension() == FME_THREE_D ) eGeomType = (OGRwkbGeometryType) (((int)eGeomType) | wkb25DBit); poFeatureDefn->SetGeomType( eGeomType );/* -------------------------------------------------------------------- *//* Translate the spatial reference system. *//* -------------------------------------------------------------------- */ if( poSchemaFeature->getCoordSys() != NULL && strlen(poSchemaFeature->getCoordSys()) > 0 && poSpatialRef == NULL ) { CPLDebug( "FME_OLEDB", "Layer %s has COORDSYS=%s on schema feature.", poFeatureDefn->GetName(), poSchemaFeature->getCoordSys() ); poSpatialRef = poDS->FME2OGRSpatialRef(poSchemaFeature->getCoordSys()); }/* -------------------------------------------------------------------- *//* Cleanup *//* -------------------------------------------------------------------- */ poDS->GetFMESession()->destroyString( poAttrValue ); poDS->GetFMESession()->destroyStringArray( poAttrNames ); return TRUE;}/************************************************************************//* SetAttributeFilter() *//************************************************************************/OGRErr OGRFMELayer::SetAttributeFilter( const char *pszNewFilter ){ OGRErr eErr; CPLFree( pszAttributeFilter ); pszAttributeFilter = NULL;/* -------------------------------------------------------------------- *//* Allow clearing of attribute query. *//* -------------------------------------------------------------------- */ if( pszNewFilter == NULL || strlen(pszNewFilter) == 0 ) { if( m_poAttrQuery != NULL ) { delete m_poAttrQuery; m_poAttrQuery = NULL; } return OGRERR_NONE; }/* -------------------------------------------------------------------- *//* Compile new query. Note that we currently will only accept *//* queries we recognise as valid. It would be better to pass *//* directly through to Oracle or other databases where we will *//* use the setConstraints method and let them decide on the *//* validity of the query. However, it will be difficult to *//* return the error at this point if we defer setting the *//* constraint. *//* -------------------------------------------------------------------- */ if( !m_poAttrQuery ) m_poAttrQuery = new OGRFeatureQuery(); eErr = m_poAttrQuery->Compile( GetLayerDefn(), pszNewFilter ); if( eErr != OGRERR_NONE ) { delete m_poAttrQuery; m_poAttrQuery = NULL; } else { pszAttributeFilter = CPLStrdup( pszNewFilter ); } ResetReading(); return eErr;}/************************************************************************//* GetSpatialRef() *//************************************************************************/OGRSpatialReference *OGRFMELayer::GetSpatialRef(){ return poSpatialRef;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -