Beispiel #1
0
        /// <summary>
        ///  Creates a FeatureCollection from a list of OGC layers within a ViewContext
        /// </summary>
        public FeatureCollection(ViewContext context, StringDictionary parameters)
        {
            string srs = string.Empty;

            GeospatialServices.Ogc.Wmc.BoundingBox mapBbox = null;
            double mapScale     = 0;
            int    featureCount = int.MaxValue;

            if (parameters[OgcParameters.Service] == GeospatialServices.Ogc.Common.ServiceNames.WFS.ToString())
            {
                if (parameters[WfsParameters.SrsName] != null)
                {
                    srs = parameters[WfsParameters.SrsName];
                }

                if (parameters[WmsParameters.Bbox] != null)
                {
                    mapBbox = new GeospatialServices.Ogc.Wmc.BoundingBox(parameters[WmsParameters.Bbox], OgcUtilities.GetSridFromCrs(srs));
                }

                if (parameters[WfsParameters.MaxFeatures] != null)
                {
                    featureCount = int.Parse(parameters[WfsParameters.MaxFeatures]);
                }
            }
            else // WMS
            {
                //if (parameters[WmsParameters.Crs] != null)
                //{
                //    srs = parameters[WmsParameters.Crs];
                //}

                //if (parameters[WmsParameters.I] != null && parameters[WmsParameters.J] != null)
                //{
                //    float x = float.Parse(parameters[WmsParameters.I]);
                //    float y = float.Parse(parameters[WmsParameters.J]);

                //    SharpMapLib.Map map = new SharpMapLib.Map(new System.Drawing.Size(int.Parse(parameters[WmsParameters.Width]), int.Parse(parameters[WmsParameters.Height])));
                //    SharpMapGeometries.BoundingBox tempBbox = SharpMapWeb.Wms.WmsServer.ParseBBOX(parameters[WmsParameters.Bbox]);
                //    map.ZoomToBox(tempBbox);

                //    // Calculate the Map Scale for filtering out layers that are not visible
                //    // in the current map scale
                //    mapScale = map.Zoom * (6378137 * 2 * Math.PI) / (map.Size.Width * 0.00028 * 360);

                //    // Keep a dictionary of queried layer groups and associated bounding boxes
                //    // after adjusting for the layer group buffers passed in
                //    if (parameters[Sdi.Ogc.Common.OgcExtendedParameters.Buffers] != null)
                //    {
                //        int buffer = 0;
                //        layerGroupBboxs = new Dictionary<string, SharpMapGeometries.BoundingBox>();
                //        string[] queryLayerGroups = parameters[WmsParameters.QueryLayers].Split(new char[] { ',' });
                //        string[] buffers = parameters[OgcExtendedParameters.Buffers].Split(new char[] { ',' });

                //        for (int i = 0; i < queryLayerGroups.Length; i++)
                //        {
                //            if (int.TryParse(buffers[i], out buffer))
                //            {
                //                tempBbox = new global::SharpMap.Geometries.BoundingBox(map.ImageToWorld(new System.Drawing.PointF(x - buffer, y + buffer)), map.ImageToWorld(new System.Drawing.PointF(x + buffer, y - buffer)));
                //                layerGroupBboxs.Add(queryLayerGroups[i], tempBbox);
                //            }
                //        }
                //    }
                //}

                if (parameters[WmsParameters.FeatureCount] != null)
                {
                    featureCount = int.Parse(parameters[WmsParameters.FeatureCount]);
                }
            }

            if (mapBbox == null)
            {
                if (context.General.BoundingBox != null)
                {
                    mapBbox = context.General.BoundingBox;
                }
                else
                {
                    throw new WmsFault(WmsExceptionCode.InvalidFormat, "Bounding box not found");
                }
            }

            //bool excludeGmlFeatures = (!String.IsNullOrEmpty(parameters[OgcExtendedParameters.ExcludeGmlFeatures]) &&
            //                            parameters[OgcExtendedParameters.ExcludeGmlFeatures].ToLowerInvariant() == "true") ? true : false;
            bool excludeGmlFeatures = false;

            foreach (GeospatialServices.Ogc.Wmc.Layer wmcLayer in context.Layers)
            {
                if (mapScale != 0)
                {
                    // The layer is not visible at this map scale
                    //      if (wmsLayer.MinScaleDenominatorSpecified && mapScale < wmsLayer.MinScaleDenominator)
                    //                                   continue;
                    //      if (wmsLayer.MaxScaleDenominatorSpecified && mapScale >= wmsLayer.MaxScaleDenominator)
                    //              continue;
                }

                Feature        feature        = null;
                XmlDocument    document       = new XmlDocument();
                XmlElement     element        = null;
                XmlNode        node           = null;
                XmlAttribute   attribute      = null;
                FeatureDataRow featureDataRow = null;

                GeospatialServices.Runtime.FeatureDataSet featureDataSet = new GeospatialServices.Runtime.FeatureDataSet();
                wmcLayer.ExecuteSpatialQuery(mapBbox.ToSqlGeometry, featureDataSet);

                if (featureDataSet != null)
                {
                    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();

                    namespaces.Add(Declarations.Wfs110Prefix, Declarations.Wfs110NameSpace);
                    namespaces.Add(Declarations.DefaultPrefix, Declarations.DefaultNameSpace);
                    namespaces.Add(Declarations.WmsPrefix, Declarations.WmsNameSpace);
                    namespaces.Add(Declarations.OgcPrefix, Declarations.OgcNameSpace);
                    namespaces.Add(Declarations.GmlPrefix, Declarations.GmlNameSpace);
                    namespaces.Add(Declarations.GmlSfPrefix, Declarations.GmlSfNameSpace);
                    namespaces.Add(Declarations.XlinkPrefix, Declarations.XlinkNameSpace);

                    XmlSerializer serializer = new XmlSerializer(typeof(SfGeometry), Declarations.GmlSfNameSpace);

                    SfGeometry   sfGeometry         = null;
                    AbstractGML  gml                = null;
                    MemoryStream stream             = null;
                    XmlDocument  featueDocument     = null;
                    string       featureNameElement = wmcLayer.Name;

                    int totalFeatures = 0;
                    if (featureDataSet.Tables.Count > 0)
                    {
                        totalFeatures = Math.Min(featureDataSet.Tables[0].Count, featureCount);
                    }

                    for (int i = 0; i < totalFeatures; i++)
                    {
                        featureDataRow = featureDataSet.Tables[0][i];

                        feature = new Feature();
                        this.FeatureMemberList.Add(feature);

                        element = document.CreateElement(Declarations.GmlSfPrefix, featureNameElement, Declarations.GmlSfNameSpace);
                        feature.ElementList.Add(element);

                        attribute = document.CreateAttribute(Declarations.GmlPrefix, "id", Declarations.GmlNameSpace);
                        element.Attributes.Append(attribute);

                        attribute.Value = "id" + Guid.NewGuid().ToString();     //TODO: not correct, guids should be 'static'

                        // add the attributes
                        foreach (DataColumn featureDataColumn in featureDataSet.Tables[0].Columns)
                        {
                            node = document.CreateNode(XmlNodeType.Element, Declarations.GmlSfPrefix, featureDataColumn.ColumnName, Declarations.GmlSfNameSpace);
                            element.AppendChild(node);
                            node.InnerText = featureDataRow[featureDataColumn.ColumnName].ToString().Trim();
                        }

                        // add the layer Title
                        node = document.CreateNode(XmlNodeType.Element, Declarations.GmlSfPrefix, "LayerTitle", Declarations.GmlSfNameSpace);
                        element.AppendChild(node);
                        node.InnerText = wmcLayer.Title;

                        // only include the gml features if requested
                        if (!excludeGmlFeatures)
                        {
                            node = document.CreateNode(XmlNodeType.Element, Declarations.GmlSfPrefix, "sfElement", Declarations.GmlSfNameSpace);
                            element.AppendChild(node);
                            gml        = AbstractGML.GetFromSqlGeometry(featureDataRow.Geometry);
                            sfGeometry = new SfGeometry(gml);
                            stream     = new MemoryStream();
                            serializer.Serialize(stream, sfGeometry, namespaces);
                            stream.Position = 0;
                            featueDocument  = new XmlDocument();
                            featueDocument.Load(stream);
                            node.InnerXml = featueDocument.DocumentElement.InnerXml;
                        }
                    }
                }
            }
        }
Beispiel #2
0
 public SfGeometry(AbstractGML item)
 {
     _Item = item;
 }
Beispiel #3
0
        public static AbstractGML GetFromSqlGeometry(SqlGeometry geometry)
        {
            AbstractGML gmlGeometry = null;
            string      geomType    = (string)geometry.STGeometryType();

            switch (geomType)
            {
            case "Point":
            {
                GeospatialServices.Ogc.Wms.GmlSf.Point gmlPoint = GetGmlSfPoint(geometry);
                gmlGeometry = gmlPoint;
            }
            break;

            case "LineString":
            {
                GeospatialServices.Ogc.Wms.GmlSf.Curve gmlCurve = GetGmlSfCurve(geometry);
                gmlGeometry = gmlCurve;
            }
            break;

            case "Polygon":
            {
                GeospatialServices.Ogc.Wms.GmlSf.Surface gmlSurface = GetGmlSfSurface(geometry);
                gmlGeometry = gmlSurface;
            }
            break;

            case "MultiPoint":
            {
                GeospatialServices.Ogc.Wms.GmlSf.MultiPoint gmlMultiPoint = GetGmlSfMultiPoint(geometry);
                gmlGeometry = gmlMultiPoint;
            }
            break;

            case "MultiLineString":
            {
                GeospatialServices.Ogc.Wms.GmlSf.MultiCurve gmlMultiCurve = GetGmlSfMultiCurve(geometry);
                gmlGeometry = gmlMultiCurve;
            }
            break;

            case "MultiPolygon":
            {
                GeospatialServices.Ogc.Wms.GmlSf.MultiSurface gmlMultiSurface = GetGmlSfMultiSurface(geometry);
                gmlGeometry = gmlMultiSurface;
            }
            break;

            case "GeometryCollection":
            {
                GeospatialServices.Ogc.Wms.GmlSf.MultiGeometry gmlMultiGeometry = new GeospatialServices.Ogc.Wms.GmlSf.MultiGeometry();
                GeospatialServices.Ogc.Wms.GmlSf.MultiSurface  gmlMultiSurface  = null;
                GeospatialServices.Ogc.Wms.GmlSf.MultiPoint    gmlMultiPoint    = null;
                GeospatialServices.Ogc.Wms.GmlSf.MultiCurve    gmlMultiCurve    = null;
                GeospatialServices.Ogc.Wms.GmlSf.Surface       gmlSurface       = null;
                GeospatialServices.Ogc.Wms.GmlSf.Point         gmlPoint         = null;
                GeospatialServices.Ogc.Wms.GmlSf.Curve         gmlCurve         = null;
                GeospatialServices.Ogc.Wms.GmlSf.AbstractGeometricAggregate gmlAbstractGeometricAggregate = null;

                for (int i = 1; i <= geometry.STNumGeometries(); i++)
                {
                    if (geometry.STGeometryN(i).STGeometryType() == "Point")
                    {
                        if (gmlMultiPoint == null)
                        {
                            gmlMultiPoint = new GeospatialServices.Ogc.Wms.GmlSf.MultiPoint();
                            gmlMultiGeometry.MultiGeometryMemberList.Add(new MultiGeometryProperty(gmlMultiPoint));
                        }
                        gmlPoint = GetGmlSfPoint(geometry.STGeometryN(i));
                        gmlMultiPoint.PointMemberList.Add(new PointProperty(gmlPoint));
                    }
                    if (geometry.STGeometryN(i).STGeometryType() == "LineString")
                    {
                        if (gmlMultiCurve == null)
                        {
                            gmlMultiCurve = new GeospatialServices.Ogc.Wms.GmlSf.MultiCurve();
                            gmlMultiGeometry.MultiGeometryMemberList.Add(new MultiGeometryProperty(gmlMultiCurve));
                        }
                        gmlCurve = GetGmlSfCurve(geometry.STGeometryN(i));
                        gmlMultiCurve.CurveMemberList.Add(new CurveProperty(gmlCurve));
                    }
                    else if (geometry.STGeometryN(i).STGeometryType() == "Polygon")
                    {
                        if (gmlMultiSurface == null)
                        {
                            gmlMultiSurface = new GeospatialServices.Ogc.Wms.GmlSf.MultiSurface();
                            gmlMultiGeometry.MultiGeometryMemberList.Add(new MultiGeometryProperty(gmlMultiSurface));
                        }
                        gmlSurface = GetGmlSfSurface(geometry.STGeometryN(i));
                        gmlMultiSurface.SurfaceMemberList.Add(new SurfaceProperty(gmlSurface));
                    }
                    else         // MultiPoint, MultiLineString, Multipolygon, GeometricCollection
                    {
                        gmlAbstractGeometricAggregate = (GeospatialServices.Ogc.Wms.GmlSf.AbstractGeometricAggregate)GetFromSqlGeometry(geometry.STGeometryN(i));
                        gmlMultiGeometry.MultiGeometryMemberList.Add(new MultiGeometryProperty(gmlAbstractGeometricAggregate));
                    }
                }
                gmlGeometry = gmlMultiGeometry;
            }
            break;
            }
            return(gmlGeometry);
        }