void OGROGDILayer::ResetReading() { ecs_LayerSelection sSelectionLayer; sSelectionLayer.Select = m_pszOGDILayerName; sSelectionLayer.F = m_eFamily; ecs_Result *psResult = cln_SelectLayer(m_nClientID, &sSelectionLayer); if( ECSERROR( psResult ) ) { CPLError( CE_Failure, CPLE_AppDefined, "Access to layer '%s' Failed: %s\n", m_pszOGDILayerName, psResult->message ? psResult->message : "(no message string)" ); return; } /* Reset spatial filter */ if( m_poFilterGeom != NULL ) { OGREnvelope oEnv; m_poFilterGeom->getEnvelope(&oEnv); m_sFilterBounds.north = oEnv.MaxY; m_sFilterBounds.south = oEnv.MinY; m_sFilterBounds.east = oEnv.MinX; m_sFilterBounds.west = oEnv.MaxX; psResult = cln_SelectRegion( m_nClientID, &m_sFilterBounds); if( ECSERROR(psResult) ) { CPLError( CE_Failure, CPLE_AppDefined, "SelectRegion failed: %s", psResult->message ? psResult->message : "(no message string)" ); return; } } else { /* Reset to global bounds */ psResult = cln_SelectRegion( m_nClientID, m_poODS->GetGlobalBounds() ); if( ECSERROR(psResult) ) { CPLError( CE_Failure, CPLE_AppDefined, "SelectRegion failed: %s", psResult->message ? psResult->message : "(no message string)"); return; } } m_iNextShapeId = 0; m_nFilteredOutShapes = 0; }
void OGROGDILayer::BuildFeatureDefn() { ecs_Result *psResult; ecs_ObjAttributeFormat *oaf; int i, numFields; const char *pszGeomName; OGRwkbGeometryType eLayerGeomType; /* -------------------------------------------------------------------- */ /* Feature Defn name will be "<OGDILyrName>_<FeatureFamily>" */ /* -------------------------------------------------------------------- */ switch(m_eFamily) { case Point: pszGeomName = "point"; eLayerGeomType = wkbPoint; break; case Line: pszGeomName = "line"; eLayerGeomType = wkbLineString; break; case Area: pszGeomName = "area"; eLayerGeomType = wkbPolygon; break; case Text: pszGeomName = "text"; eLayerGeomType = wkbPoint; break; default: pszGeomName = "unknown"; eLayerGeomType = wkbUnknown; break; } char* pszFeatureDefnName; if (m_poODS->LaunderLayerNames()) { pszFeatureDefnName = CPLStrdup(m_pszOGDILayerName); char* pszAt = strchr(pszFeatureDefnName, '@'); if (pszAt) *pszAt = '_'; char* pszLeftParenthesis = strchr(pszFeatureDefnName, '('); if (pszLeftParenthesis) *pszLeftParenthesis = '\0'; } else pszFeatureDefnName = CPLStrdup(CPLSPrintf("%s_%s", m_pszOGDILayerName, pszGeomName )); m_poFeatureDefn = new OGRFeatureDefn(pszFeatureDefnName); SetDescription( m_poFeatureDefn->GetName() ); CPLFree(pszFeatureDefnName); pszFeatureDefnName = NULL; m_poFeatureDefn->SetGeomType(eLayerGeomType); m_poFeatureDefn->Reference(); m_poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(m_poSpatialRef); /* -------------------------------------------------------------------- */ /* Fetch schema from OGDI server and map to OGR types */ /* -------------------------------------------------------------------- */ psResult = cln_GetAttributesFormat( m_nClientID ); if( ECSERROR( psResult ) ) { CPLError(CE_Failure, CPLE_AppDefined, "ECSERROR: %s\n", psResult->message); return; } oaf = &(ECSRESULT(psResult).oaf); numFields = oaf->oa.oa_len; for( i = 0; i < numFields; i++ ) { OGRFieldDefn oField("", OFTInteger); oField.SetName( oaf->oa.oa_val[i].name ); oField.SetPrecision( 0 ); switch( oaf->oa.oa_val[i].type ) { case Decimal: case Smallint: case Integer: oField.SetType( OFTInteger ); // TODO: Fix spelling - lenght -> length if( oaf->oa.oa_val[i].lenght > 0 ) oField.SetWidth( oaf->oa.oa_val[i].lenght ); else oField.SetWidth( 11 ); break; case Numeric: case Real: case Float: case Double: oField.SetType( OFTReal ); if( oaf->oa.oa_val[i].lenght > 0 ) { oField.SetWidth( oaf->oa.oa_val[i].lenght ); oField.SetPrecision( oaf->oa.oa_val[i].precision ); } else { oField.SetWidth( 18 ); oField.SetPrecision( 7 ); } break; case Char: case Varchar: case Longvarchar: default: oField.SetType( OFTString ); if( oaf->oa.oa_val[i].lenght > 0 ) oField.SetWidth( oaf->oa.oa_val[i].lenght ); else oField.SetWidth( 64 ); break; } m_poFeatureDefn->AddFieldDefn( &oField ); } /* -------------------------------------------------------------------- */ /* Add a text attribute for text objects. */ /* -------------------------------------------------------------------- */ if( m_eFamily == Text ) { OGRFieldDefn oField("text", OFTString); m_poFeatureDefn->AddFieldDefn( &oField ); } }
OGRFeature *OGROGDILayer::GetNextRawFeature() { /* -------------------------------------------------------------------- */ /* Retrieve object from OGDI server and create new feature */ /* -------------------------------------------------------------------- */ ecs_Result *psResult = cln_GetNextObject(m_nClientID); if (! ECSSUCCESS(psResult)) { if( ECSERROR( psResult ) && (psResult->message == NULL || strstr(psResult->message, "End of selection") == NULL) ) { CPLError( CE_Failure, CPLE_AppDefined, "Access to next object of layer '%s' failed: %s\n", m_pszOGDILayerName, psResult->message ? psResult->message : "(no error string)" ); } // We probably reached EOF... keep track of shape count. m_nTotalShapeCount = m_iNextShapeId - m_nFilteredOutShapes; return NULL; } OGRFeature *poFeature = new OGRFeature(m_poFeatureDefn); poFeature->SetFID( m_iNextShapeId++ ); m_nFeaturesRead++; /* -------------------------------------------------------------------- */ /* Process geometry */ /* -------------------------------------------------------------------- */ if (m_eFamily == Point) { ecs_Point *psPoint = &(ECSGEOM(psResult).point); OGRPoint *poOGRPoint = new OGRPoint(psPoint->c.x, psPoint->c.y); poOGRPoint->assignSpatialReference(m_poSpatialRef); poFeature->SetGeometryDirectly(poOGRPoint); } else if (m_eFamily == Line) { ecs_Line *psLine = &(ECSGEOM(psResult).line); OGRLineString *poOGRLine = new OGRLineString(); poOGRLine->setNumPoints( psLine->c.c_len ); for( int i = 0; i < (int) psLine->c.c_len; i++ ) { poOGRLine->setPoint(i, psLine->c.c_val[i].x, psLine->c.c_val[i].y); } poOGRLine->assignSpatialReference(m_poSpatialRef); poFeature->SetGeometryDirectly(poOGRLine); } else if (m_eFamily == Area) { ecs_Area *psArea = &(ECSGEOM(psResult).area); OGRPolygon *poOGRPolygon = new OGRPolygon(); for( int iRing = 0; iRing < (int) psArea->ring.ring_len; iRing++ ) { ecs_FeatureRing *psRing = &(psArea->ring.ring_val[iRing]); OGRLinearRing *poOGRRing = new OGRLinearRing(); poOGRRing->setNumPoints( psRing->c.c_len ); for( int i = 0; i < (int) psRing->c.c_len; i++ ) { poOGRRing->setPoint(i, psRing->c.c_val[i].x, psRing->c.c_val[i].y); } poOGRPolygon->addRingDirectly(poOGRRing); } // __TODO__ // When OGR supports polygon centroids then we should carry them here poOGRPolygon->assignSpatialReference(m_poSpatialRef); poFeature->SetGeometryDirectly(poOGRPolygon); } else if (m_eFamily == Text) { // __TODO__ // For now text is treated as a point and string is lost // ecs_Text *psText = &(ECSGEOM(psResult).text); OGRPoint *poOGRPoint = new OGRPoint(psText->c.x, psText->c.y); poOGRPoint->assignSpatialReference(m_poSpatialRef); poFeature->SetGeometryDirectly(poOGRPoint); } else { CPLAssert(false); } /* -------------------------------------------------------------------- */ /* Set attributes */ /* -------------------------------------------------------------------- */ char *pszAttrList = ECSOBJECTATTR(psResult); for( int iField = 0; iField < m_poFeatureDefn->GetFieldCount(); iField++ ) { char *pszFieldStart = NULL; int nNameLen = 0; /* parse out the next attribute value */ if( !ecs_FindElement( pszAttrList, &pszFieldStart, &pszAttrList, &nNameLen, NULL ) ) { nNameLen = 0; pszFieldStart = pszAttrList; } /* Skip any trailing white space (for string constants). */ if( nNameLen > 0 && pszFieldStart[nNameLen-1] == ' ' ) nNameLen--; /* skip leading white space */ while( pszFieldStart[0] == ' ' && nNameLen > 0 ) { pszFieldStart++; nNameLen--; } /* zero terminate the single field value, but save the */ /* character we overwrote, so we can restore it when done. */ char chSavedChar = pszFieldStart[nNameLen]; pszFieldStart[nNameLen] = '\0'; /* OGR takes care of all field type conversions for us! */ poFeature->SetField(iField, pszFieldStart); pszFieldStart[nNameLen] = chSavedChar; } /* -------------------------------------------------------------------- */ /* Apply the text associated with text features if appropriate. */ /* -------------------------------------------------------------------- */ if( m_eFamily == Text ) { poFeature->SetField( "text", ECSGEOM(psResult).text.desc ); } return poFeature; }