[xsd-users] Struggling with CityGML 2.0.0 parsing
Olivier Tournaire
olitour at gmail.com
Sat Feb 23 09:53:42 EST 2013
Hi all,
This is my first post on the mailing list, and have already searched in the
past message, but did not found a way to fix the issue I am currently
facing while trying to parse a CityGML 2.0.0 file.
I have generate the code using the 2.0.0 schemas available at
http://www.citygml.org/?id=1540. I used the following options, mainly
inspired by code synthesis wiki pages:
* xAL / xlink
--generate-polymorphic
--polymorphic-type-all
--generate-inline
--generate-forward
--disable-warning F001
--disable-warning F002
* smil:
--generate-polymorphic
--namespace-map http://www.w3.org/1999/02/22-rdf-syntax-ns#=rdif
--anonymous-regex %.* transitionFilterPrototype/calcMode%calcMode2%
--generate-inline
--generate-forward
--show-sloc
--disable-warning F001
--disable-warning F002
* gml:
--root-element-none
--generate-polymorphic
--polymorphic-type-all
--generate-serialization
--generate-inline
--generate-forward
--generate-doxygen
--root-element Array
--root-element Bag
--disable-warning F001
--disable-warning F002
* citygml base:
--root-element CityModel
--generate-polymorphic
--polymorphic-type-all
--generate-inline
--generate-forward
--generate-serialization
--generate-doxygen
--namespace-map http://www.opengis.net/citygml/profiles/base/2.0=citygml
--disable-warning F001
--disable-warning F002
* citygml:
--root-element CityModel
--generate-polymorphic
--polymorphic-type-all
--generate-serialization
--generate-inline
--generate-forward
--generate-doxygen
--namespace-map http://www.opengis.net/citygml/2.0=citygml
--namespace-regex %.* http://www.opengis.net/citygml/([
^/]*)/2.0%citygml::$1%
--disable-warning F001
--disable-warning F002
The code seems to be well generated, and the doxygen doc is really usefull.
However, I still have some warnings, but I do not know if they are
important or if I can ignore them. I compile the code as a .so with g++
4.6.3.
For smil:
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd: warning
T004: generating parsing functions for 4 global elements
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd: info:
use --root-element-* options to specify document root(s)
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:35:34:
warning T005: assuming type 'animateType' is polymorphic
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd:37:96:
info: because type 'animateType' is used in a substitution group declared
here
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:35:34:
info: use --polymorphic-type to indicate this type is polymorphic when
compiling schemas that reference it
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:71:40:
warning T005: assuming type 'animateMotionType' is polymorphic
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd:38:114:
info: because type 'animateMotionType' is used in a substitution group
declared here
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:71:40:
info: use --polymorphic-type to indicate this type is polymorphic when
compiling schemas that reference it
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:87:39:
warning T005: assuming type 'animateColorType' is polymorphic
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd:39:111:
info: because type 'animateColorType' is used in a substitution group
declared here
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:87:39:
info: use --polymorphic-type to indicate this type is polymorphic when
compiling schemas that reference it
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:103:30:
warning T005: assuming type 'setType' is polymorphic
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20.xsd:40:84:
info: because type 'setType' is used in a substitution group declared here
/home/olivier/work/dev/citygml/CityGML_2.0.0/3.1.1/smil/smil20-language.xsd:103:30:
info: use --polymorphic-type to indicate this type is polymorphic when
compiling schemas that reference it
For xAL:
/home/olivier/work/dev/citygml/CityGML_2.0.0/xAL/xAL.xsd: warning T004:
generating parsing functions for 18 global elements
/home/olivier/work/dev/citygml/CityGML_2.0.0/xAL/xAL.xsd: info: use
--root-element-* options to specify document root(s)
I don think that these warnings are a real problem, since I can link a test
program against the created libraries without any problem. Now, I have a
problem with a simple program trying to parse a CityGML file.
Here is my code:
#include <iostream>
#include "CityGML.hxx"
#include "3.1.1/base/gml.hxx"
#include <typeinfo>
using namespace std;
using namespace citygml;
using namespace citygml::building;
using namespace gml;
int main(int argc, char** argv)
{
string filename("/home/olivier/work/dev/citygml/CityGML_2.0.0/Examples/Building_LOD0-4/Building_and_garage_LOD2-EPSG25832.gml");
auto_ptr<CityModelType> iCity( citygml::CityModel(filename) );
cout << "name --> " << iCity->name().front() << endl;
if ( iCity->description().present() )
cout << "description --> " << iCity->description() << endl;
else
cout << "[no description available]" << endl;
if ( iCity->id().present() )
cout << "id --> " << iCity->id() << endl;
else
cout << "[no id available]" << endl;
if ( iCity->location().present() )
;
else
cout << "[no location available]" << endl;
if( iCity->boundedBy().present() )
{
if( iCity->boundedBy()->Envelope().present() )
;
if( iCity->boundedBy()->Null().present() )
;
}
else
cout << "[no boundBy available]" << endl;
cout << "Loaded model contains " << iCity->featureMember().size()
<< " features" << endl;
AbstractFeatureCollectionType::featureMember_sequence::const_iterator
it = iCity->featureMember().begin(), ite =
iCity->featureMember().end();
for(;it!=ite;++it)
{
cout << "Looping..." << endl;
FeaturePropertyType feature = *it;
AbstractFeatureType featureType = feature._Feature().get();
if ( dynamic_cast<AbstractCityObjectType*>(featureType._clone()) )
cout << "AbstractCityObjectType !" << endl;
else if ( dynamic_cast<BuildingType*>(featureType._clone()) )
cout << "BuildingType !" << endl;
}
CityModelType cmt;
cmt._GenericApplicationPropertyOfCityModel();
return 0;
}
The problem is in the for loop on the AbstractFeatureCollectionType::
featureMember_sequence . First I need to use the _clone() method, however
g++ warns me that the dynamic_cast can never succeeds. The second point is
that there are 2 features in my sample file
(Building_and_garage_LOD2-EPSG25832.gml in the Examples directory). The
first one is a building. Here is the begining of the file:
<?xml version="1.0" encoding="utf-8"?>
<!-- CityGML Version No. 2.0, February 2012 -->
<!-- CityGML - GML 3.1.1 application schema for 3D city models -->
<!-- International encoding standard of the Open Geospatial Consortium, see
http://www.opengeospatial.org/standards/citygml -->
<!-- Jointly developed by the Special Interest Group 3D (SIG 3D) of GDI-DE,
see http://www.sig3d.org -->
<!-- For further information see: http://www.citygml.org -->
<CityModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="
http://www.opengis.net/citygml/2.0"
xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:xlink="
http://www.w3.org/1999/xlink"
xmlns:gml="http://www.opengis.net/gml" xmlns:dem="
http://www.opengis.net/citygml/relief/2.0"
xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0../../CityGML/building.xsd
http://www.opengis.net/citygml/relief/2.0 ../../CityGML/relief.xsd">
<gml:name>3D city model LOD2 without Appearance</gml:name>
<gml:boundedBy>
<gml:Envelope srsDimension="3"
srsName="urn:ogc:def:crs,crs:EPSG::25832,crs:EPSG::5783">
<gml:lowerCorner>458868.0 5438343.0 112.0</gml:lowerCorner>
<gml:upperCorner>458892.0 5438362.0 117.0</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<cityObjectMember>
<bldg:Building gml:id="GML_7b1a5a6f-ddad-4c3d-a507-3eb9ee0a8e68">
<gml:name>Example Building LOD2</gml:name>
.....
I can access the name correctly, but none of my dynamic_cast actually
succeeds, and I do not understand why. Could you please explain why, and
what should I do to get the concrete type of each feature?
Hope you could help.
Best regards,
Olivier
More information about the xsd-users
mailing list