Exemple #1
0
        private static Polyline CreatePolyline(string pointslist, bool toMercator)
        {
            PointCollection path = new PointCollection();

            string[] coords = pointslist.Split(' ');
            MapPoint point = null;
            double   lat, lon;

            for (int i = 0; i < coords.Length; i += 2)
            {
                lat   = double.Parse(coords[i]);
                lon   = double.Parse(coords[i + 1]);
                point = new MapPoint(lon, lat, new SpatialReference(4326));
                path.Add((toMercator) ? point.GeographicToWebMercator() : point);
            }

            Polyline polyline = new Polyline();

            if (path.Count > 0)
            {
                polyline.SpatialReference = path[0].SpatialReference;
                polyline.Paths.Add(path);
            }

            return(polyline);
        }
Exemple #2
0
        private static Polygon CreatePolygon(string exteriorPoints, string interiorPoints, bool toMercator)
        {
            PointCollection exPath = new PointCollection();

            string[] exCoords = exteriorPoints.Split(' ');
            MapPoint point = null;
            double   lat, lon;

            for (int i = 0; i < exCoords.Length; i += 2)
            {
                lat   = double.Parse(exCoords[i]);
                lon   = double.Parse(exCoords[i + 1]);
                point = new MapPoint(lon, lat, new SpatialReference(4326));
                exPath.Add((toMercator) ? point.GeographicToWebMercator() : point);
            }

            Polygon polygon = new Polygon();

            if (exPath.Count > 0)
            {
                polygon.SpatialReference = exPath[0].SpatialReference;
                polygon.Rings.Add(exPath);
            }

            if (!string.IsNullOrEmpty(interiorPoints))
            {
                PointCollection inPath   = new PointCollection();
                string[]        inCoords = interiorPoints.Split(' ');

                for (int i = 0; i < exCoords.Length; i += 2)
                {
                    lat   = double.Parse(exCoords[i]);
                    lon   = double.Parse(exCoords[i + 1]);
                    point = new MapPoint(lon, lat, new SpatialReference(4326));
                    inPath.Add((toMercator) ? point.GeographicToWebMercator() : point);
                }

                polygon.Rings.Add(inPath);
            }

            return(polygon);
        }
Exemple #3
0
        public static MapPoint ParseW3CGeometry(List <XElement> geoElems, bool toMercator)
        {
            MapPoint point = null;
            double   lat = -999.0, lon = -999.0;

            foreach (XElement elem in geoElems)
            {
                if (elem.Name.LocalName.ToLower() == "point")
                {
                    foreach (XElement geoElem in elem.Elements())
                    {
                        if (geoElem.Name.LocalName == "lat")
                        {
                            lat = double.Parse(geoElem.Value);
                        }
                        else if (geoElem.Name.LocalName == "long")
                        {
                            lon = double.Parse(geoElem.Value);
                        }
                    }
                }
                else if (elem.Name.LocalName == "lat")
                {
                    lat = double.Parse(elem.Value);
                }
                else if (elem.Name.LocalName == "long")
                {
                    lon = double.Parse(elem.Value);
                }

                if (lat > -999.0 && lon > -999.0)
                {
                    point = new MapPoint(lon, lat, new SpatialReference(4326));
                    if (toMercator)
                    {
                        point = point.GeographicToWebMercator();
                    }
                }
            }

            return(point);
        }
        /// <summary>
        /// Convert extent to Envelope between Mercator(102100) and Geographic(4326) spatial references
        /// If it is other spatial reference, use GeometryTool to project the envelope
        /// </summary>
        /// <param name="outSRWKID"></param>
        public Envelope ToEnvelope(int outSRWKID)
        {
            Envelope envelope = null;

            if (GeometryTool.IsWebMercatorSR(outSRWKID) && GeometryTool.IsGeographicSR(this.spatialReference))
            {
                MapPoint mPoint1 = new MapPoint(this.xmin, this.ymin, new SpatialReference(4326));
                MapPoint mPoint2 = new MapPoint(this.xmax, this.ymax, new SpatialReference(4326));
                envelope = new Envelope(mPoint1.GeographicToWebMercator(), mPoint2.GeographicToWebMercator());
            }
            else if (GeometryTool.IsWebMercatorSR(this.spatialReference) && GeometryTool.IsGeographicSR(outSRWKID))
            {
                MapPoint mPoint1 = new MapPoint(this.xmin, this.ymin, new SpatialReference(this.spatialReference));
                MapPoint mPoint2 = new MapPoint(this.xmax, this.ymax, new SpatialReference(this.spatialReference));
                envelope = new Envelope(mPoint1.WebMercatorToGeographic(), mPoint2.WebMercatorToGeographic());
            }
            else if (this.spatialReference == outSRWKID)
            {
                envelope = ToEnvelope();
            }

            return(envelope);
        }
        private Polygon CreateBufferCircle(MapPoint center, double radius, bool toMercator)
        {
            double pi36 = Math.PI / 180.0;
            double rx = radius, ry = radius;
            double dx = 1.0, dy = 1.0;

            ScaleLine.ScaleLineUnit units = UnitsHelper.GetUnitsByWKID(center.SpatialReference.WKID);
            if (units == ScaleLine.ScaleLineUnit.DecimalDegrees)
            {
                double[] conversion = UnitsHelper.GetConversionToDegree(center.Y, ScaleLine.ScaleLineUnit.Meters);
                rx = radius * conversion[0];
                ry = radius * conversion[1];
            }
            else
            {
                double conversion = UnitsHelper.GetConversionFromMeter(units);
                rx = radius * conversion;
                ry = radius * conversion;
            }

            PointCollection pointSet      = new PointCollection();

            for (int i = 0; i <= 36; i++)
            {
                dx = center.X + rx * Math.Cos(i * 10 * pi36);
                dy = center.Y + ry * Math.Sin(i * 10 * pi36);
                MapPoint p = new MapPoint(dx, dy, new SpatialReference(center.SpatialReference.WKID));
                pointSet.Add((center.SpatialReference.WKID == 4326 && toMercator) ? p.GeographicToWebMercator() : p);
            }

            Polygon circle                = new Polygon();

            circle.Rings.Add(pointSet);
            circle.SpatialReference = new SpatialReference((center.SpatialReference.WKID == 4326 && toMercator) ? 102113 : center.SpatialReference.WKID);

            return(circle);
        }
Exemple #6
0
        public static Geometry ParseGeoRSSGeometry(XElement geoElem, bool toMercator)
        {
            Geometry geometry = null;

            string[] coords = { };

            switch (geoElem.Name.LocalName)
            {
            case "box":
                coords = geoElem.Value.Trim().Split(' ');
                if (coords.Length == 2)
                {
                    MapPoint point1 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326));
                    MapPoint point2 = new MapPoint(double.Parse(coords[3]), double.Parse(coords[2]), new SpatialReference(4326));
                    geometry = (toMercator) ? (new Envelope(point1.GeographicToWebMercator(), point2.GeographicToWebMercator())) : (new Envelope(point1, point2));
                }
                break;

            case "point":
                coords = geoElem.Value.Trim().Split(' ');
                if (coords.Length == 2)
                {
                    MapPoint point = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326));
                    geometry = (toMercator) ? point.GeographicToWebMercator() : point;
                }
                break;

            case "line":
                geometry = CreatePolyline(geoElem.Value.Trim(), toMercator);
                break;

            case "polygon":
                geometry = CreatePolygon(geoElem.Value.Trim(), "", toMercator);
                break;

            case "where":
                string   pointString = "";
                XElement firstElem   = (XElement)geoElem.FirstNode;
                if (firstElem.Name.NamespaceName.ToLower() == NS_GML)
                {
                    switch (firstElem.Name.LocalName.ToLower())
                    {
                    case "point":
                        pointString = ((XElement)firstElem.FirstNode).Value.Trim();
                        coords      = pointString.Split(' ');
                        if (coords.Length == 2)
                        {
                            MapPoint point = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326));
                            geometry = (toMercator) ? point.GeographicToWebMercator() : point;
                        }
                        break;

                    case "envelope":
                        pointString = ((XElement)firstElem.FirstNode).Value.Trim();
                        coords      = pointString.Split(' ');
                        MapPoint point1 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326));
                        pointString = ((XElement)firstElem.LastNode).Value.Trim();
                        coords      = pointString.Split(' ');
                        MapPoint point2 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326));
                        geometry = (toMercator) ? (new Envelope(point1.GeographicToWebMercator(), point2.GeographicToWebMercator())) : (new Envelope(point1, point2));
                        break;

                    case "linestring":
                        pointString = ((XElement)firstElem.FirstNode).Value.Trim();
                        geometry    = CreatePolyline(pointString, toMercator);
                        break;

                    case "polygon":
                        string exteriorPoints = "";
                        string interiorPoints = "";
                        foreach (XElement elem in firstElem.Elements())
                        {
                            if (elem.Name.LocalName.ToLower() == "exterior")
                            {
                                exteriorPoints = ((XElement)((XElement)elem.FirstNode).FirstNode).Value;
                            }

                            if (elem.Name.LocalName.ToLower() == "interior")
                            {
                                interiorPoints = ((XElement)((XElement)elem.FirstNode).FirstNode).Value;
                            }
                        }

                        geometry = CreatePolygon(exteriorPoints, interiorPoints, toMercator);
                        break;
                    }
                }

                break;
            }

            return(geometry);
        }