void AddGeomField(const char* psName, OGRwkbGeometryType geomType) { OGRGeomFieldDefn fieldDef(psName, geomType); //oGFld.SetSpatialRef(geomlayer->GetSpatialRef()); poTableDefn->AddGeomFieldDefn(&fieldDef); CPLDebug( "OGR_ILI", "Adding geometry field '%s' to Class %s", psName, GetName()); }
void ILI1Reader::AddCoord(OGRILI1Layer* layer, IOM_BASKET model, IOM_OBJECT modelele, IOM_OBJECT typeobj) { unsigned int dim = ::GetCoordDim(model, typeobj); for (unsigned int i=0; i<dim; i++) { OGRFieldDefn fieldDef(CPLSPrintf("%s_%d", iom_getattrvalue(modelele, "name"), i), OFTReal); layer->GetLayerDefn()->AddFieldDefn(&fieldDef); //CPLDebug( "AddCoord OGR_ILI", "Field %s: OFTReal", fieldDef.GetNameRef()); } }
void ILI1Reader::AddField(OGRILI1Layer* layer, IOM_BASKET model, IOM_OBJECT obj) { const char* typenam = "Reference"; if (EQUAL(iom_getobjecttag(obj),"iom04.metamodel.LocalAttribute")) typenam = GetTypeName(model, obj); //CPLDebug( "OGR_ILI", "Field %s: %s", iom_getattrvalue(obj, "name"), typenam); if (EQUAL(typenam, "iom04.metamodel.SurfaceType")) { OGRILI1Layer* polyLayer = AddGeomTable(layer->GetLayerDefn()->GetName(), iom_getattrvalue(obj, "name"), wkbPolygon); layer->SetSurfacePolyLayer(polyLayer); //TODO: add line attributes to geometry } else if (EQUAL(typenam, "iom04.metamodel.AreaType")) { IOM_OBJECT controlPointDomain = GetAttrObj(model, GetTypeObj(model, obj), "controlPointDomain"); if (controlPointDomain) { AddCoord(layer, model, obj, GetTypeObj(model, controlPointDomain)); layer->GetLayerDefn()->SetGeomType(wkbPoint); } OGRILI1Layer* areaLineLayer = AddGeomTable(layer->GetLayerDefn()->GetName(), iom_getattrvalue(obj, "name"), wkbMultiLineString); #ifdef POLYGONIZE_AREAS OGRILI1Layer* areaLayer = new OGRILI1Layer(CPLSPrintf("%s__Areas",layer->GetLayerDefn()->GetName()), NULL, 0, wkbPolygon, NULL); AddLayer(areaLayer); areaLayer->SetAreaLayers(layer, areaLineLayer); #endif } else if (EQUAL(typenam, "iom04.metamodel.PolylineType") ) { layer->GetLayerDefn()->SetGeomType(wkbMultiLineString); } else if (EQUAL(typenam, "iom04.metamodel.CoordType")) { AddCoord(layer, model, obj, GetTypeObj(model, obj)); if (layer->GetLayerDefn()->GetGeomType() == wkbUnknown) layer->GetLayerDefn()->SetGeomType(wkbPoint); } else if (EQUAL(typenam, "iom04.metamodel.NumericType") ) { OGRFieldDefn fieldDef(iom_getattrvalue(obj, "name"), OFTReal); layer->GetLayerDefn()->AddFieldDefn(&fieldDef); } else if (EQUAL(typenam, "iom04.metamodel.EnumerationType") ) { OGRFieldDefn fieldDef(iom_getattrvalue(obj, "name"), OFTInteger); layer->GetLayerDefn()->AddFieldDefn(&fieldDef); } else { OGRFieldDefn fieldDef(iom_getattrvalue(obj, "name"), OFTString); layer->GetLayerDefn()->AddFieldDefn(&fieldDef); } }
// Add additional Geometry table for Interlis 1 void AddGeomTable(CPLString layerName, const char* psFieldName, OGRwkbGeometryType eType, bool bRefTIDField = false) { OGRFeatureDefn* poGeomTableDefn = new OGRFeatureDefn(layerName); OGRFieldDefn fieldDef("_TID", OFTString); poGeomTableDefn->AddFieldDefn(&fieldDef); if (bRefTIDField) { OGRFieldDefn fieldDefRef("_RefTID", OFTString); poGeomTableDefn->AddFieldDefn(&fieldDefRef); } poGeomTableDefn->DeleteGeomFieldDefn(0); OGRGeomFieldDefn fieldDefGeom(psFieldName, eType); poGeomTableDefn->AddGeomFieldDefn(&fieldDefGeom); CPLDebug( "OGR_ILI", "Adding geometry table %s for field %s", poGeomTableDefn->GetName(), psFieldName); poGeomFieldInfos[psFieldName].geomTable = poGeomTableDefn; }
OGRILI1Layer* ILI1Reader::AddGeomTable(const char* datalayername, const char* geomname, OGRwkbGeometryType eType) { static char layername[512]; layername[0] = '\0'; strcat(layername, datalayername); strcat(layername, "_"); strcat(layername, geomname); OGRILI1Layer* geomlayer = new OGRILI1Layer(layername, NULL, 0, eType, NULL); AddLayer(geomlayer); OGRFieldDefn fieldDef("_TID", OFTString); geomlayer->GetLayerDefn()->AddFieldDefn(&fieldDef); if (eType == wkbPolygon) { OGRFieldDefn fieldDefRef("_RefTID", OFTString); geomlayer->GetLayerDefn()->AddFieldDefn(&fieldDefRef); } OGRFieldDefn fieldDef2("ILI_Geometry", OFTString); //in write mode only? geomlayer->GetLayerDefn()->AddFieldDefn(&fieldDef2); return geomlayer; }
int ILI1Reader::ReadModel(const char *pszModelFilename) { IOM_BASKET model; IOM_ITERATOR modelelei; IOM_OBJECT modelele; iom_init(); // set error listener to a iom provided one, that just // dumps all errors to stderr iom_seterrlistener(iom_stderrlistener); // compile ili model char *iomarr[1] = {(char *)pszModelFilename}; model=iom_compileIli(1, iomarr); if(!model){ CPLError( CE_Failure, CPLE_FileIO, "iom_compileIli failed." ); iom_end(); return FALSE; } // create new layer with meta information (ILI table name and geometry column index) // while reading the features from the ITF we have to know which column is the geometry column metaLayer = new OGRILI1Layer("Metatable", NULL, 0, wkbUnknown, NULL); OGRFieldDefn fieldDef1("layername", OFTString); metaLayer->GetLayerDefn()->AddFieldDefn(&fieldDef1); OGRFieldDefn fieldDef2("geomIdx", OFTInteger); metaLayer->GetLayerDefn()->AddFieldDefn(&fieldDef2); OGRFieldDefn fieldDef3("geomlayername", OFTString); metaLayer->GetLayerDefn()->AddFieldDefn(&fieldDef3); // read tables int j = 0; modelelei=iom_iteratorobject(model); modelele=iom_nextobject(modelelei); while(modelele){ const char *tag=iom_getobjecttag(modelele); if (tag && EQUAL(tag,"iom04.metamodel.Table")) { const char* topic = iom_getattrvalue(GetAttrObj(model, modelele, "container"), "name"); if (!EQUAL(topic, "INTERLIS")) { const char* layername = GetLayerName(model, modelele); OGRSpatialReference *poSRSIn = NULL; int bWriterIn = 0; OGRwkbGeometryType eReqType = wkbUnknown; OGRILI1DataSource *poDSIn = NULL; CPLDebug( "OGR_ILI", "Reading table model '%s'", layername ); // read fields IOM_OBJECT fields[255]; IOM_OBJECT roledefs[255]; memset(fields, 0, 255); memset(roledefs, 0, 255); int maxIdx = -1; IOM_ITERATOR fieldit=iom_iteratorobject(model); std::vector<IOM_OBJECT> attributes; for (IOM_OBJECT fieldele=iom_nextobject(fieldit); fieldele; fieldele=iom_nextobject(fieldit)){ const char *etag=iom_getobjecttag(fieldele); if (etag && (EQUAL(etag,"iom04.metamodel.ViewableAttributesAndRoles"))) { IOM_OBJECT table = GetAttrObj(model, fieldele, "viewable"); if (table == modelele) { IOM_OBJECT obj = GetAttrObj(model, fieldele, "attributesAndRoles"); int ili1AttrIdx = GetAttrObjPos(fieldele, "attributesAndRoles")-1; if (EQUAL(iom_getobjecttag(obj),"iom04.metamodel.RoleDef")) { int ili1AttrIdxOppend = atoi(iom_getattrvalue(GetAttrObj(model, obj, "oppend"), "ili1AttrIdx")); if (ili1AttrIdxOppend>=0) { roledefs[ili1AttrIdxOppend] = obj; if (ili1AttrIdxOppend > maxIdx) maxIdx = ili1AttrIdxOppend; } } else { fields[ili1AttrIdx] = obj; if (ili1AttrIdx > maxIdx) maxIdx = ili1AttrIdx; } } } iom_releaseobject(fieldele); } iom_releaseiterator(fieldit); // if multiple gets positive we have more than one geometry column (only points) int multiple = -1; for (int i=0; i<=maxIdx; i++) { IOM_OBJECT obj = fields[i]; if (obj) { attributes.push_back(obj); if (EQUAL(GetTypeName(model, obj), "iom04.metamodel.CoordType")) multiple++; } } std::vector<IOM_OBJECT>::iterator it = attributes.begin(); for (int i=0; i<=maxIdx; i++) { IOM_OBJECT obj = roledefs[i]; if (obj) attributes.insert(attributes.begin() + i, obj); } OGRFeature *feature = NULL; char* geomlayername = '\0'; OGRILI1Layer* layer = NULL; for(int i=0; i<attributes.size(); i++) { IOM_OBJECT obj = attributes.at(i); const char* typenam = GetTypeName(model, obj); if (EQUAL(typenam, "iom04.metamodel.CoordType") || EQUAL(typenam, "iom04.metamodel.AreaType")) { feature = OGRFeature::CreateFeature(metaLayer->GetLayerDefn()); feature->SetFID(j+1); feature->SetField("layername", layername); feature->SetField("geomIdx", i); if(multiple > 0) { geomlayername = GetPointLayerName(layername, iom_getattrvalue(obj, "name")); feature->SetField("geomlayername", geomlayername); layer = new OGRILI1Layer(geomlayername, poSRSIn, bWriterIn, eReqType, poDSIn); AddLayer(layer); } else { feature->SetField("geomlayername", layername); layer = new OGRILI1Layer(layername, poSRSIn, bWriterIn, eReqType, poDSIn); AddLayer(layer); } metaLayer->AddFeature(feature); } } if(layer == NULL) { layer = new OGRILI1Layer(layername, poSRSIn, bWriterIn, eReqType, poDSIn); AddLayer(layer); } OGRFieldDefn fieldDef("_TID", OFTString); layer->GetLayerDefn()->AddFieldDefn(&fieldDef); for(int i=0; i<attributes.size(); i++) { IOM_OBJECT obj = attributes.at(i); AddField(layer, model, obj); } // additional point layer added if(multiple > 0) { for(int i = 1; i <= multiple; i++) { OGRILI1Layer* pointLayer = papoLayers[nLayers-(i+1)]; for (int j=0; j < layer->GetLayerDefn()->GetFieldCount(); j++) { pointLayer->CreateField(layer->GetLayerDefn()->GetFieldDefn(j)); } if (pointLayer->GetLayerDefn()->GetGeomType() == wkbUnknown) pointLayer->GetLayerDefn()->SetGeomType(wkbPoint); } } if (papoLayers[nLayers-1]->GetLayerDefn()->GetFieldCount() == 0) { //Area layer added OGRILI1Layer* areaLayer = papoLayers[nLayers-1]; for (int i=0; i < layer->GetLayerDefn()->GetFieldCount(); i++) { areaLayer->CreateField(layer->GetLayerDefn()->GetFieldDefn(i)); } } } } iom_releaseobject(modelele); modelele=iom_nextobject(modelelei); j++; } iom_releaseiterator(modelelei); iom_releasebasket(model); iom_end(); return 0; }
void AddField(const char* psName, OGRFieldType fieldType) { OGRFieldDefn fieldDef(psName, fieldType); poTableDefn->AddFieldDefn(&fieldDef); CPLDebug( "OGR_ILI", "Adding field '%s' to Class %s", psName, GetName()); }