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); } }
void AddFieldDefinitions(NodeVector oArcLineTypes) { for (NodeVector::const_iterator it = oFields.begin(); it != oFields.end(); ++it) { if (*it == NULL) continue; const char* psName = CPLGetXMLValue( *it, "Name", NULL ); const char* psTypeRef = CPLGetXMLValue( *it, "Type.REF", NULL ); if (psTypeRef == NULL) //Assoc Role AddField(psName, OFTString); //FIXME: numeric? else { CPLXMLNode* psElementNode = oTidLookup[psTypeRef]; const char* typeName = psElementNode->pszValue; if (EQUAL(typeName, "IlisMeta07.ModelData.TextType")) { //Kind Text,MText AddField(psName, OFTString); } else if (EQUAL(typeName, "IlisMeta07.ModelData.EnumType")) { AddField(psName, (iliVersion == 1) ? OFTInteger : OFTString); } else if (EQUAL(typeName, "IlisMeta07.ModelData.BooleanType")) { AddField(psName, OFTString); //?? } else if (EQUAL(typeName, "IlisMeta07.ModelData.NumType")) { //// Unit INTERLIS.ANYUNIT, INTERLIS.TIME, INTERLIS.h, INTERLIS.min, INTERLIS.s, INTERLIS.M, INTERLIS.d AddField(psName, OFTReal); } else if (EQUAL(typeName, "IlisMeta07.ModelData.BlackboxType")) { AddField(psName, OFTString); } else if (EQUAL(typeName, "IlisMeta07.ModelData.FormattedType")) { AddField(psName, GetFormattedType(*it)); } else if (EQUAL(typeName, "IlisMeta07.ModelData.MultiValue")) { //min -> Multiplicity/IlisMeta07.ModelData.Multiplicity/Min //max -> Multiplicity/IlisMeta07.ModelData.Multiplicity/Max const char* psClassRef = CPLGetXMLValue( psElementNode, "BaseType.REF", NULL ); if (psClassRef) { IliClass* psParentClass = oClasses[oTidLookup[psClassRef]]; poStructFieldInfos[psName] = psParentClass->GetName(); CPLDebug( "OGR_ILI", "Register table %s for struct field '%s'", poStructFieldInfos[psName].c_str(), psName); /* Option: Embed fields if max == 1 CPLDebug( "OGR_ILI", "Adding embedded struct members of MultiValue field '%s' from Class %s", psName, psClassRef); AddFieldDefinitions(psParentClass->oFields); */ } } else if (EQUAL(typeName, "IlisMeta07.ModelData.CoordType")) { AddCoord(psName, psElementNode); } else if (EQUAL(typeName, "IlisMeta07.ModelData.LineType")) { const char* psKind = CPLGetXMLValue( psElementNode, "Kind", NULL ); poGeomFieldInfos[psName].iliGeomType = psKind; bool isLinearType = (std::find(oArcLineTypes.begin(), oArcLineTypes.end(), psElementNode) == oArcLineTypes.end()); bool linearGeom = isLinearType || CSLTestBoolean(CPLGetConfigOption("OGR_STROKE_CURVE", "FALSE")); OGRwkbGeometryType multiLineType = linearGeom ? wkbMultiLineString : wkbMultiCurve; OGRwkbGeometryType polyType = linearGeom ? wkbPolygon : wkbCurvePolygon; if (iliVersion == 1) { if (EQUAL(psKind, "Area")) { CPLString lineLayerName = GetName() + CPLString("_") + psName; AddGeomTable(lineLayerName, psName, multiLineType); //Add geometry field for polygonized areas AddGeomField(psName, wkbPolygon); //We add the area helper point geometry after polygon //for better behaviour of clients with limited multi geometry support CPLString areaPointGeomName = psName + CPLString("__Point"); AddCoord(areaPointGeomName, psElementNode); } else if (EQUAL(psKind, "Surface")) { CPLString geomLayerName = GetName() + CPLString("_") + psName; AddGeomTable(geomLayerName, psName, multiLineType, true); AddGeomField(psName, polyType); } else { // Polyline, DirectedPolyline AddGeomField(psName, multiLineType); } } else { if (EQUAL(psKind, "Area") || EQUAL(psKind, "Surface")) { AddGeomField(psName, polyType); } else { // Polyline, DirectedPolyline AddGeomField(psName, multiLineType); } } } else { //ClassRefType CPLError(CE_Warning, CPLE_NotSupported, "Field '%s' of class %s has unsupported type %s", psName, GetName(), typeName); } } } }