ili2reader.cpp

来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 683 行 · 第 1/2 页

CPP
683
字号
  // 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();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?