< Summary

Class:Itinero.IO.Json.GeoJson.StandaloneNetworkTileExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/IO/Json/GeoJson/StandaloneNetworkTileExtensions.cs
Covered lines:0
Uncovered lines:87
Coverable lines:87
Total lines:134
Line coverage:0% (0 of 87)
Covered branches:0
Total branches:30
Branch coverage:0% (0 of 30)
Tag:224_14471318300

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
ToGeoJson(...)100%10%
WriteFeatures(...)0%300%

File(s)

/home/runner/work/routing2/routing2/src/Itinero/IO/Json/GeoJson/StandaloneNetworkTileExtensions.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.IO;
 3using System.Linq;
 4using System.Text;
 5using System.Text.Json;
 6using Itinero.Network;
 7using Itinero.Network.Enumerators.Edges;
 8using Itinero.Network.Tiles;
 9using Itinero.Network.Tiles.Standalone;
 10
 11namespace Itinero.IO.Json.GeoJson;
 12
 13/// <summary>
 14/// Contains extension methods to serialize standalone network tiles to geojson.
 15/// </summary>
 16public static class StandaloneNetworkTileExtensions
 17{
 18    /// <summary>
 19    /// Gets a geojson version of the network tile.
 20    /// </summary>
 21    /// <param name="tile">The tile.</param>
 22    /// <returns>A string with geojson.</returns>
 23    public static string ToGeoJson(this StandaloneNetworkTile tile)
 024    {
 025        using var stream = new MemoryStream();
 026        using (var jsonWriter = new Utf8JsonWriter(stream))
 027        {
 028            jsonWriter.WriteFeatureCollectionStart();
 029            jsonWriter.WriteFeatures(tile);
 030            jsonWriter.WriteFeatureCollectionEnd();
 031        }
 32
 033        return Encoding.UTF8.GetString(stream.ToArray());
 034    }
 35
 36    /// <summary>
 37    /// Writes features to the given json writer.
 38    /// </summary>
 39    /// <param name="tile">The tile.</param>
 40    /// <param name="jsonWriter">The json writer.</param>
 41    public static void WriteFeatures(this Utf8JsonWriter jsonWriter, StandaloneNetworkTile tile)
 042    {
 043        var edges = new HashSet<EdgeId>();
 44
 045        var vertex = new VertexId(tile.TileId, 0);
 046        var edgeEnumerator = tile.GetEnumerator();
 047        var secondEdgeEnumerator = tile.GetEnumerator();
 048        while (edgeEnumerator.MoveTo(vertex))
 049        {
 50            // write vertex features.
 051            jsonWriter.WriteVertexFeature(vertex, edgeEnumerator.TailLocation);
 52
 53            // iterate over all edges.
 054            while (edgeEnumerator.MoveNext())
 055            {
 056                if (edges.Contains(edgeEnumerator.EdgeId)) continue;
 057                edges.Add(edgeEnumerator.EdgeId);
 58
 59                // write edge features.
 060                jsonWriter.WriteEdgeFeature(edgeEnumerator);
 61
 062                if (edgeEnumerator.HeadOrder != null)
 063                {
 64                    // check out turn costs at head location.
 065                    secondEdgeEnumerator.MoveTo(edgeEnumerator.Head);
 066                    while (secondEdgeEnumerator.MoveNext())
 067                    {
 068                        if (secondEdgeEnumerator.EdgeId == edgeEnumerator.EdgeId) continue;
 069                        if (secondEdgeEnumerator.TailOrder == null) continue;
 70
 071                        foreach (var turnCost in
 072                                 edgeEnumerator.GetTurnCostFromHead(secondEdgeEnumerator.TailOrder.Value))
 073                        {
 074                            if (turnCost.cost == 0) continue;
 75
 076                            jsonWriter.WriteFeatureStart();
 077                            var attributes = turnCost.attributes.ToList();
 078                            attributes.AddRange(new (string key, string value)[]
 079                            {
 080                                ("edge1_tile_id", edgeEnumerator.EdgeId.TileId.ToString()),
 081                                ("edge1_local_id", edgeEnumerator.EdgeId.LocalId.ToString()),
 082                                ("edge2_tile_id", secondEdgeEnumerator.EdgeId.TileId.ToString()),
 083                                ("edge2_local_id", secondEdgeEnumerator.EdgeId.LocalId.ToString()),
 084                                ("edges_prefix", string.Join(",", turnCost.prefixEdges.Select(x => x.ToString()))),
 085                                ("cost", turnCost.cost.ToString())
 086                            });
 087                            jsonWriter.WriteProperties(attributes);
 088                            jsonWriter.WritePropertyName("geometry");
 089                            jsonWriter.WriteLineString(edgeEnumerator.GetCompleteShape()
 090                                .Concat(secondEdgeEnumerator.GetCompleteShape()));
 091                            jsonWriter.WriteFeatureEnd();
 092                        }
 093                    }
 094                }
 95
 096                if (edgeEnumerator.TailOrder != null)
 097                {
 98                    // check out turn costs at tail location.
 099                    secondEdgeEnumerator.MoveTo(edgeEnumerator.Tail);
 0100                    while (secondEdgeEnumerator.MoveNext())
 0101                    {
 0102                        if (secondEdgeEnumerator.EdgeId == edgeEnumerator.EdgeId) continue;
 0103                        if (secondEdgeEnumerator.TailOrder == null) continue;
 104
 0105                        foreach (var turnCost in
 0106                                 edgeEnumerator.GetTurnCostFromTail(secondEdgeEnumerator.TailOrder.Value))
 0107                        {
 0108                            if (turnCost.cost == 0) continue;
 109
 0110                            jsonWriter.WriteFeatureStart();
 0111                            var attributes = turnCost.attributes.ToList();
 0112                            attributes.AddRange(new (string key, string value)[]
 0113                            {
 0114                                ("edge1_tile_id", edgeEnumerator.EdgeId.TileId.ToString()),
 0115                                ("edge1_local_id", edgeEnumerator.EdgeId.LocalId.ToString()),
 0116                                ("edge2_tile_id", secondEdgeEnumerator.EdgeId.TileId.ToString()),
 0117                                ("edge2_local_id", secondEdgeEnumerator.EdgeId.LocalId.ToString()),
 0118                                ("edges_prefix", string.Join(",", turnCost.prefixEdges.Select(x => x.ToString()))),
 0119                                ("cost", turnCost.cost.ToString())
 0120                            });
 0121                            jsonWriter.WriteProperties(attributes);
 0122                            jsonWriter.WritePropertyName("geometry");
 0123                            jsonWriter.WriteLineString(edgeEnumerator.GetCompleteShape().Reverse()
 0124                                .Concat(secondEdgeEnumerator.GetCompleteShape()));
 0125                            jsonWriter.WriteFeatureEnd();
 0126                        }
 0127                    }
 0128                }
 0129            }
 130
 0131            vertex = new VertexId(vertex.TileId, vertex.LocalId + 1);
 0132        }
 0133    }
 134}

Methods/Properties

ToGeoJson(...)
WriteFeatures(...)