Exemple #1
0
        private static async Task <CoordinateCollection> ParseLinearRings(XElement rings, bool optimize, double tolerance)
        {
            CoordinateCollection rCoords = null;

            foreach (var c in rings.Elements())
            {
                if (c.Name.Namespace == gmlNS && string.Compare(c.Name.LocalName, "linearring", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    foreach (var cc in c.Elements())
                    {
                        var coords = await ParsePosList(cc, optimize, tolerance);

                        if (coords != null && coords.Count >= 3)
                        {
                            rCoords = coords;
                            break;
                        }
                    }
                }
            }

            if (optimize)
            {
                rCoords = await SpatialTools.VertexReductionAsync(rCoords, tolerance);
            }

            return(rCoords);
        }
Exemple #2
0
        /// <summary>
        /// Parses a string list of coordinates. Handles 2D and 3D coordinate sets.
        /// </summary>
        /// <param name="dim">Number of values to represent coordinate.</param>
        /// <returns></returns>
        private async Task <CoordinateCollection> ParseCoordinates(XElement node)
        {
            if (node != null)
            {
                var sCoord = XmlUtilities.GetString(node, false);
                var vals   = SplitCoordString(sCoord, CoordArtifactRx, SpaceSplitter);

                var    c = new CoordinateCollection();
                double lon, lat;

                if (vals.Length >= 2)
                {
                    for (int i = 0; i < vals.Length; i = i + 2)
                    {
                        if (double.TryParse(vals[i], NumberStyles.Float, CultureInfo.InvariantCulture, out lat) &&
                            double.TryParse(vals[i + 1], NumberStyles.Float, CultureInfo.InvariantCulture, out lon))
                        {
                            c.Add(new Coordinate(lat, lon));
                        }
                    }
                }

                if (optimize)
                {
                    c = await SpatialTools.VertexReductionAsync(c, tolerance);
                }

                return(c);
            }

            return(null);
        }
Exemple #3
0
        private async Task <CoordinateCollection> ParseRing(string wkt, int minCoords, bool closed, bool optimize)
        {
            string[] coords = wkt.Split(_commonDelimiter, StringSplitOptions.RemoveEmptyEntries);

            var locs = new CoordinateCollection();

            foreach (var coord in coords)
            {
                var c = ParseCoord(coord);
                if (c.HasValue)
                {
                    locs.Add(c.Value);
                }
            }

            if (optimize)
            {
                locs = await SpatialTools.VertexReductionAsync(locs, tolerance);
            }

            if (locs.Count > minCoords)
            {
                //Ensure the ring is closed
                if (closed && !locs[0].Equals(locs[locs.Count - 1]))
                {
                    locs.Add(locs[0]);
                }

                return(locs);
            }

            return(null);
        }
Exemple #4
0
        private async Task <LineString> ParseTrackSegment(XElement node)
        {
            var points = XmlUtilities.GetChildNodes(node, "trkpt");
            var coords = new CoordinateCollection();

            foreach (var p in points)
            {
                var c = ParseWaypointAsCoordinate(p);
                if (c.HasValue)
                {
                    coords.Add(c.Value);
                }
            }

            if (coords.Count >= 0)
            {
                if (optimize)
                {
                    coords = await SpatialTools.VertexReductionAsync(coords, tolerance);
                }

                return(new LineString(coords));
            }

            return(null);
        }
Exemple #5
0
        /// <summary>
        /// Reads LineString shapefile
        /// </summary>
        /// <param name="reader">The shapefile stream</param>
        /// <returns>A list of Geometry objects</returns>
        private async Task <List <Geometry> > ReadLineStringData(BinaryReader reader)
        {
            var items = new List <Geometry>();
            int numParts, numPoints;

            while (reader.BaseStream.Position < reader.BaseStream.Length)
            {
                Geometry item;

                // Read Record Header.
                int id          = ReadRecordHeader(reader);
                var boundingBox = ReadBoundingBox(reader);

                // Read the number of Parts and Points in the shape.
                numParts  = NumberReader.ReadIntLE(reader);
                numPoints = NumberReader.ReadIntLE(reader);

                int[] parts = ReadParts(reader, numParts, numPoints);

                //First read all the rings
                var rings = new List <CoordinateCollection>();

                var multiline = new MultiLineString();
                for (int ringID = 0; ringID < numParts; ringID++)
                {
                    var line = new LineString();

                    for (int i = parts[ringID]; i < parts[ringID + 1]; i++)
                    {
                        line.Vertices.Add(ReadCoordinate(reader));
                    }

                    if (optimize)
                    {
                        line.Vertices = await SpatialTools.VertexReductionAsync(line.Vertices, tolerance);
                    }

                    multiline.Geometries.Add(line);
                }

                if (numParts == 1)
                {
                    item = (Geometry)multiline.Geometries[0];
                }
                else
                {
                    item = multiline;
                }

                item.Metadata.ID = id.ToString();
                item.Metadata.Properties.Add("BoundingBox", boundingBox);

                items.Add(item);
            }

            return(items);
        }
Exemple #6
0
        private static async Task <CoordinateCollection> ParsePosList(XElement node, bool optimize, double tolerance)
        {
            if (node.Name.Namespace == gmlNS && (string.Compare(node.Name.LocalName, "poslist", StringComparison.OrdinalIgnoreCase) == 0 ||
                                                 string.Compare(node.Name.LocalName, "coordinates", StringComparison.OrdinalIgnoreCase) == 0))
            {
                var dimension = XmlUtilities.GetDoubleAttribute(node, "dimension");
                int dim       = 2;

                if (!double.IsNaN(dimension) && dimension > 2)
                {
                    dim = (int)dimension;
                }

                var sCoord = XmlUtilities.GetString(node, false);
                var vals   = CoordArtifactRx.Replace(sCoord, " ").Split(SpaceSplitter, StringSplitOptions.RemoveEmptyEntries);

                var    c = new CoordinateCollection();
                double lat, lon, alt;

                if (dim == 3 && vals.Length >= 3)
                {
                    for (var i = 0; i < vals.Length; i = i + 3)
                    {
                        if (double.TryParse(vals[i], NumberStyles.Float, CultureInfo.InvariantCulture, out lat) &&
                            double.TryParse(vals[i + 1], NumberStyles.Float, CultureInfo.InvariantCulture, out lon) &&
                            double.TryParse(vals[i + 1], NumberStyles.Float, CultureInfo.InvariantCulture, out alt))
                        {
                            c.Add(new Coordinate(lat, lon, alt));
                        }
                    }
                }
                else if (dim == 2 && vals.Length >= 2)
                {
                    for (var i = 0; i < vals.Length; i = i + 2)
                    {
                        if (double.TryParse(vals[i], NumberStyles.Float, CultureInfo.InvariantCulture, out lat) &&
                            double.TryParse(vals[i + 1], NumberStyles.Float, CultureInfo.InvariantCulture, out lon))
                        {
                            c.Add(new Coordinate(lat, lon));
                        }
                    }
                }

                if (optimize)
                {
                    c = await SpatialTools.VertexReductionAsync(c, tolerance);
                }

                return(c);
            }

            return(null);
        }
Exemple #7
0
        private async Task <CoordinateCollection> ParseCoordinates(JArray jsonArray)
        {
            var coords = new CoordinateCollection();

            foreach (var c in jsonArray)
            {
                var coord = ParseCoordinate(c as JArray);
                if (coord.HasValue)
                {
                    coords.Add(coord.Value);
                }
            }

            if (optimize)
            {
                coords = await SpatialTools.VertexReductionAsync(coords, tolerance);
            }

            return(coords);
        }
        private async Task <CoordinateCollection> ReadCoordinates(BinaryReader reader, ByteOrder wkbByteOrder, WKBShapeType type, bool includeAltitude, bool includeM)
        {
            // Get the number of points in this linestring.
            int numPoints = (int)NumberReader.ReadUInt32(reader, wkbByteOrder);

            // Create a new array of coordinates.
            var coords = new CoordinateCollection();

            // Loop on the number of points in the ring.
            for (int i = 0; i < numPoints; i++)
            {
                coords.Add(ReadCoordinate(reader, wkbByteOrder, type, includeAltitude, includeM));
            }

            if (optimize)
            {
                coords = await SpatialTools.VertexReductionAsync(coords, tolerance);
            }

            return(coords);
        }
Exemple #9
0
        private async Task <CoordinateCollection> ParseCoordinates(XElement node)
        {
            if (node != null)
            {
                var    sCoord = XmlUtilities.GetString(node, false);
                double lat, lon, alt;
                var    tuples = SplitCoordString(sCoord, CoordArtifactRx, SpaceSplitter);

                var cc = new CoordinateCollection();

                foreach (var t in tuples)
                {
                    var vals = SplitCoordString(t, CoordArtifactRx, CommaSpaceSplitter);
                    if (vals.Length >= 2 &&
                        double.TryParse(vals[1], NumberStyles.Float, CultureInfo.InvariantCulture, out lat) &&
                        double.TryParse(vals[0], NumberStyles.Float, CultureInfo.InvariantCulture, out lon))
                    {
                        if (vals.Length > 3 && double.TryParse(vals[2], NumberStyles.Float, CultureInfo.InvariantCulture, out alt))
                        {
                            cc.Add(new Coordinate(lat, lon, alt));
                        }
                        else
                        {
                            cc.Add(new Coordinate(lat, lon));
                        }
                    }
                }

                if (optimize)
                {
                    cc = await SpatialTools.VertexReductionAsync(cc, tolerance);
                }

                return(cc);
            }

            return(null);
        }
Exemple #10
0
        private async Task <List <Geometry> > ParseRoute(XElement node, Dictionary <string, ShapeStyle> styles)
        {
            var    geoms    = new List <Geometry>();
            var    line     = new LineString();
            var    metadata = new ShapeMetadata();
            var    coords   = new CoordinateCollection();
            var    style    = new ShapeStyle();
            string nodeName;

            foreach (var n in node.Elements())
            {
                nodeName = n.Name.LocalName;
                switch (nodeName)
                {
                case "name":
                    metadata.Title = XmlUtilities.GetString(n, stripHtml);
                    break;

                case "desc":
                    metadata.Description = XmlUtilities.GetString(n, stripHtml);
                    break;

                case "cmt":
                case "src":
                case "type":
                    SetMetadataString(metadata, nodeName, n, stripHtml);
                    break;

                case "number":    //<number> xsd:nonNegativeInteger </number> [0..1] ?
                    var i = XmlUtilities.GetInt32(n, -1);
                    if (i >= 0 && !metadata.Properties.ContainsKey(nodeName))
                    {
                        metadata.Properties.Add(nodeName, i);
                    }
                    break;

                case "link":
                    var href = XmlUtilities.GetStringAttribute(n, "href");

                    if (!string.IsNullOrWhiteSpace(href) && !metadata.Properties.ContainsKey(nodeName))
                    {
                        metadata.Properties.Add(nodeName, href);
                    }
                    break;

                case "rtept":
                    if (readRouteWaypoints)
                    {
                        var wpt = ParseWaypoint(n, styles);
                        coords.Add(wpt.Coordinate);
                        geoms.Add(wpt);
                    }
                    else
                    {
                        var c = ParseWaypointAsCoordinate(n);
                        if (c.HasValue)
                        {
                            coords.Add(c.Value);
                        }
                    }
                    break;

                case "extensions":
                    ParseExtensions(n, metadata, style);
                    break;

                default:
                    break;
                }
            }

            if (!string.IsNullOrEmpty(metadata.Title) || !string.IsNullOrEmpty(metadata.Description) || metadata.Properties.Count > 0)
            {
                line.Metadata = metadata;
            }

            if (style.StrokeColor.HasValue)
            {
                var styleKey = "embeddedStyle_" + embeddedStyleCnt;
                embeddedStyleCnt++;
                styles.Add(styleKey, style);
                line.StyleKey = styleKey;
            }

            if (coords.Count >= 2)
            {
                if (optimize)
                {
                    coords = await SpatialTools.VertexReductionAsync(coords, tolerance);
                }

                line.Vertices = coords;

                geoms.Add(line);
            }

            return(geoms);
        }