Exemple #1
0
        /// <summary>
        /// This method produces instances of type <see cref="GeoAPI.Geometries.IMultiPolygon"/>.
        /// </summary>
        /// <returns>The created geometries</returns>
        internal override Collection <IGeometry> createGeometries()
        {
            //IMultiPolygon multiPolygon = null;

            IPathNode multiPolygonNode     = new PathNode(_GMLNS, "MultiPolygon", (NameTable)_XmlReader.NameTable);
            IPathNode multiSurfaceNode     = new PathNode(_GMLNS, "MultiSurface", (NameTable)_XmlReader.NameTable);
            IPathNode multiPolygonNodeAlt  = new AlternativePathNodesCollection(multiPolygonNode, multiSurfaceNode);
            IPathNode polygonMemberNode    = new PathNode(_GMLNS, "polygonMember", (NameTable)_XmlReader.NameTable);
            IPathNode surfaceMemberNode    = new PathNode(_GMLNS, "surfaceMember", (NameTable)_XmlReader.NameTable);
            IPathNode polygonMemberNodeAlt = new AlternativePathNodesCollection(polygonMemberNode, surfaceMemberNode);
            IPathNode linearRingNode       = new PathNode(_GMLNS, "LinearRing", (NameTable)_XmlReader.NameTable);

            string[] labelValue = new string[1];
            bool     geomFound  = false;

            try
            {
                // Reading the entire feature's node makes it possible to collect label values that may appear before or after the geometry property
                while ((_FeatureReader = GetSubReaderOf(_XmlReader, null, _FeatureNode)) != null)
                {
                    while (
                        (_GeomReader =
                             GetSubReaderOf(_FeatureReader, labelValue, multiPolygonNodeAlt, polygonMemberNodeAlt)) != null)
                    {
                        GeometryFactory geomFactory = new PolygonFactory(_GeomReader, _FeatureTypeInfo)
                        {
                            AxisOrder = AxisOrder
                        };
                        var polygons = geomFactory.createGeometries();

                        var polygonArray = new IPolygon[polygons.Count];
                        var i            = 0;
                        foreach (IPolygon polygon in polygons)
                        {
                            polygonArray[i++] = polygon;
                        }

                        _Geoms.Add(Factory.CreateMultiPolygon(polygonArray));
                        geomFound = true;
                    }
                    if (geomFound)
                    {
                        AddLabel(labelValue[0], _Geoms[_Geoms.Count - 1]);
                    }
                    geomFound = false;
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError("An exception occured while parsing a multi-polygon geometry: " + ex.Message);
                throw ex;
            }

            return(_Geoms);
        }
        /// <summary>
        /// This method produces instances of type <see cref="GeoAPI.Geometries.IMultiPolygon"/>.
        /// </summary>
        /// <returns>The created geometries</returns>
        internal override Collection<IGeometry> createGeometries()
        {
            //IMultiPolygon multiPolygon = null;

            IPathNode multiPolygonNode = new PathNode(_GMLNS, "MultiPolygon", (NameTable) _XmlReader.NameTable);
            IPathNode multiSurfaceNode = new PathNode(_GMLNS, "MultiSurface", (NameTable) _XmlReader.NameTable);
            IPathNode multiPolygonNodeAlt = new AlternativePathNodesCollection(multiPolygonNode, multiSurfaceNode);
            IPathNode polygonMemberNode = new PathNode(_GMLNS, "polygonMember", (NameTable) _XmlReader.NameTable);
            IPathNode surfaceMemberNode = new PathNode(_GMLNS, "surfaceMember", (NameTable) _XmlReader.NameTable);
            IPathNode polygonMemberNodeAlt = new AlternativePathNodesCollection(polygonMemberNode, surfaceMemberNode);
            IPathNode linearRingNode = new PathNode(_GMLNS, "LinearRing", (NameTable) _XmlReader.NameTable);
            string[] labelValue = new string[1];
            bool geomFound = false;

            try
            {
                // Reading the entire feature's node makes it possible to collect label values that may appear before or after the geometry property
                while ((_FeatureReader = GetSubReaderOf(_XmlReader, null, _FeatureNode)) != null)
                {
                    while (
                        (_GeomReader =
                         GetSubReaderOf(_FeatureReader, labelValue, multiPolygonNodeAlt, polygonMemberNodeAlt)) != null)
                    {
                        GeometryFactory geomFactory = new PolygonFactory(_GeomReader, _FeatureTypeInfo);
                        var polygons = geomFactory.createGeometries();

                        var polygonArray = new IPolygon[polygons.Count];
                        var i = 0;
                        foreach (IPolygon polygon in polygons)
                            polygonArray[i++] = polygon;

                        _Geoms.Add(Factory.CreateMultiPolygon(polygonArray));
                        geomFound = true;
                    }
                    if (geomFound) AddLabel(labelValue[0], _Geoms[_Geoms.Count - 1]);
                    geomFound = false;
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError("An exception occured while parsing a multi-polygon geometry: " + ex.Message);
                throw ex;
            }

            return _Geoms;
        }