?? ili2reader.cpp
字號(hào):
// compile ili models model=iom_compileIli(CSLCount(modelFilenames), modelFilenames); if(!model){ CPLError( CE_Failure, CPLE_FileIO, "iom_compileIli failed." ); iom_end(); return FALSE; } // read tables 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); OGRLayer* layer = new OGRILI2Layer(layername, NULL, 0, wkbUnknown, NULL); m_listLayer.push_back(layer); 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); 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")) { //??ili1AttrIdx = atoi(iom_getattrvalue(GetAttrObj(model, obj, "oppend"), "ili1AttrIdx")); roledefs[ili1AttrIdx] = obj; } else { fields[ili1AttrIdx] = obj; } if (ili1AttrIdx > maxIdx) maxIdx = ili1AttrIdx; //CPLDebug( "OGR_ILI", "Field %s Pos: %d", iom_getattrvalue(obj, "name"), ili1AttrIdx); } } iom_releaseobject(fieldele); } iom_releaseiterator(fieldit); for (int i=0; i<=maxIdx; i++) { IOM_OBJECT obj = fields[i]; IOM_OBJECT roleobj = roledefs[i]; if (roleobj) AddField(layer, model, roleobj); if (obj) AddField(layer, model, obj); } } } iom_releaseobject(modelele); modelele=iom_nextobject(modelelei); } iom_releaseiterator(modelelei); iom_releasebasket(model); iom_end(); return 0;}char* fieldName(DOMElement* elem) { string fullname; int depth = 0; DOMNode *node; for (node = elem; node; node = node->getParentNode()) ++depth; depth-=3; //ignore root elements// We cannot do this sort of dynamic stack alloc on MSVC6.// DOMNode* elements[depth]; DOMNode* elements[1000]; CPLAssert( depth < sizeof(elements) / sizeof(DOMNode*) ); int d=0; for (node = elem; d<depth; node = node->getParentNode()) elements[d++] = node; for (d=depth-1; d>=0; --d) { if (d < depth-1) fullname += "_"; fullname += XMLString::transcode(elements[d]->getNodeName()); } return CPLStrdup(fullname.c_str());}void ILI2Reader::setFieldDefn(OGRFeatureDefn *featureDef, DOMElement* elem) { int type = 0; //recursively search children for (DOMElement *childElem = (DOMElement *)elem->getFirstChild(); type == 0 && childElem && childElem->getNodeType() == DOMNode::ELEMENT_NODE; childElem = (DOMElement*)childElem->getNextSibling()) { type = getGeometryTypeOfElem(childElem); if (type == 0) { if (childElem->getFirstChild() && childElem->getFirstChild()->getNodeType() == DOMNode::ELEMENT_NODE) { setFieldDefn(featureDef, childElem); } else { char *fName = fieldName(childElem); if (featureDef->GetFieldIndex(fName) == -1) { CPLDebug( "OGR_ILI", "AddFieldDefn: %s",fName ); OGRFieldDefn *fieldDef = new OGRFieldDefn(fName, OFTString); featureDef->AddFieldDefn(fieldDef); } CPLFree(fName); } } }}void ILI2Reader::SetFieldValues(OGRFeature *feature, DOMElement* elem) { int type = 0; //recursively search children for (DOMElement *childElem = (DOMElement *)elem->getFirstChild(); type == 0 && childElem && childElem->getNodeType() == DOMNode::ELEMENT_NODE; childElem = (DOMElement*)childElem->getNextSibling()) { type = getGeometryTypeOfElem(childElem); if (type == 0) { if (childElem->getFirstChild() && childElem->getFirstChild()->getNodeType() == DOMNode::ELEMENT_NODE) { SetFieldValues(feature, childElem); } else { char *fName = fieldName(childElem); int fIndex = feature->GetFieldIndex(fName); if (fIndex != -1) { char * objVal = getObjValue(childElem); if (objVal == NULL) objVal = getREFValue(childElem); // only to try feature->SetField(fIndex, objVal); } else { m_missAttrs.push_back(fName); } CPLFree(fName); } } else { feature->SetGeometry(getGeometry(childElem, type)); } }}//// ILI2Reader//IILI2Reader::~IILI2Reader() {}ILI2Reader::ILI2Reader() { m_poILI2Handler = NULL; m_poSAXReader = NULL; m_bReadStarted = FALSE; m_pszFilename = NULL; SetupParser();}ILI2Reader::~ILI2Reader() { CPLFree( m_pszFilename ); CleanupParser();}void ILI2Reader::SetArcDegrees(double arcDegrees) { arcIncr = arcDegrees*PI/180;}void ILI2Reader::SetSourceFile( const char *pszFilename ) { CPLFree( m_pszFilename ); m_pszFilename = CPLStrdup( pszFilename );}int ILI2Reader::SetupParser() { static int bXercesInitialized = FALSE; if( !bXercesInitialized ) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { CPLError( CE_Failure, CPLE_AppDefined, "Unable to initalize Xerces C++ based ILI2 reader. Error message:\n%s\n", toCatch.getMessage() ); return FALSE; } bXercesInitialized = TRUE; } // Cleanup any old parser. if( m_poSAXReader != NULL ) CleanupParser(); // Create and initialize parser. m_poSAXReader = XMLReaderFactory::createXMLReader(); m_poILI2Handler = new ILI2Handler( this ); m_poSAXReader->setContentHandler( m_poILI2Handler ); m_poSAXReader->setErrorHandler( m_poILI2Handler ); m_poSAXReader->setLexicalHandler( m_poILI2Handler ); m_poSAXReader->setEntityResolver( m_poILI2Handler ); m_poSAXReader->setDTDHandler( m_poILI2Handler );/* No Validation#if (OGR_ILI2_VALIDATION) m_poSAXReader->setFeature( XMLString::transcode("http://xml.org/sax/features/validation"), true); m_poSAXReader->setFeature( XMLString::transcode("http://xml.org/sax/features/namespaces"), true); m_poSAXReader->setFeature( XMLUni::fgSAX2CoreNameSpaces, true ); m_poSAXReader->setFeature( XMLUni::fgXercesSchema, true );// m_poSAXReader->setDoSchema(true);// m_poSAXReader->setValidationSchemaFullChecking(true);#else*/ m_poSAXReader->setFeature( XMLString::transcode("http://xml.org/sax/features/validation"), false); m_poSAXReader->setFeature( XMLString::transcode("http://xml.org/sax/features/namespaces"), false);//#endif m_bReadStarted = FALSE; return TRUE;}void ILI2Reader::CleanupParser() { if( m_poSAXReader == NULL ) return; delete m_poSAXReader; m_poSAXReader = NULL; delete m_poILI2Handler; m_poILI2Handler = NULL; m_bReadStarted = FALSE;}int ILI2Reader::SaveClasses( const char *pszFile = NULL ) { // Add logic later to determine reasonable default schema file. if( pszFile == NULL ) return FALSE; // parse and create layers and features m_poSAXReader->parse(pszFile); if (m_missAttrs.size() != 0) { m_missAttrs.sort(); m_missAttrs.unique(); string attrs = ""; list<string>::const_iterator it = m_missAttrs.begin(); for (it = m_missAttrs.begin(); it != m_missAttrs.end(); ++it) attrs += *it + ", "; CPLError( CE_Warning, CPLE_NotSupported, "Failed to add new definition to existing layers, attributes not saved: %s", attrs.c_str() ); } return TRUE;}list<OGRLayer *> ILI2Reader::GetLayers() { return m_listLayer;}int ILI2Reader::GetLayerCount() { return m_listLayer.size();}int ILI2Reader::AddFeature(DOMElement *elem) { bool newLayer = true; OGRLayer *curLayer = 0; char *pszName = XMLString::transcode(elem->getTagName()); // test if this layer exist for (list<OGRLayer *>::reverse_iterator layerIt = m_listLayer.rbegin(); layerIt != m_listLayer.rend(); ++layerIt) { OGRFeatureDefn *fDef = (*layerIt)->GetLayerDefn(); if (cmpStr(fDef->GetName(), pszName) == 0) { newLayer = false; curLayer = *layerIt; break; } } // add a layer if (newLayer) { // FIXME in Layer: SRS Writer Type datasource CPLDebug( "OGR_ILI", "Adding layer: %s", pszName ); // new layer data OGRSpatialReference *poSRSIn = NULL; // FIXME fix values for initial layer int bWriterIn = 0; OGRwkbGeometryType eReqType = wkbUnknown; OGRILI2DataSource *poDSIn = NULL; curLayer = new OGRILI2Layer(CPLStrdup(pszName), poSRSIn, bWriterIn, eReqType, poDSIn); m_listLayer.push_back(curLayer); } // the feature and field definition OGRFeatureDefn *featureDef = curLayer->GetLayerDefn(); if (newLayer) { // the TID feature OGRFieldDefn *fieldDef = new OGRFieldDefn(CPLStrdup(ILI2_TID), OFTString); featureDef->AddFieldDefn(fieldDef); setFieldDefn(featureDef, elem); } // add the features OGRFeature *feature = new OGRFeature(featureDef); // the TID feature int fIndex = feature->GetFieldIndex(ILI2_TID); char *fChVal = XMLString::transcode(elem->getAttribute(XMLString::transcode(ILI2_TID))); feature->SetField(fIndex, CPLStrdup(fChVal)); SetFieldValues(feature, elem); curLayer->SetFeature(feature); return 0;}IILI2Reader *CreateILI2Reader() { return new ILI2Reader();}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -