< Summary

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

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
ToGeoJson(...)0%20%
ToGeoJson(...)0%20%
WriteFeatures(...)0%200%
WriteVertexFeature(...)100%10%
WriteVertexFeature(...)100%10%
WriteEdgeFeature(...)0%240%
WriteEdgeFeature(...)0%40%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.IO;
 4using System.Linq;
 5using System.Text;
 6using System.Text.Json;
 7using Itinero.Network;
 8using Itinero.Network.Attributes;
 9using Itinero.Network.Enumerators.Edges;
 10using Itinero.Network.Search;
 11using Itinero.Network.Search.Edges;
 12using Itinero.Profiles;
 13
 14namespace Itinero.IO.Json.GeoJson;
 15
 16/// <summary>
 17/// Contains router db geojson extensions.
 18/// </summary>
 19public static class RouterDbExtensions
 20{
 21    /// <summary>
 22    /// Gets a geojson representation of the data in the router db.
 23    /// </summary>
 24    /// <param name="routerDb">The router db.</param>
 25    /// <param name="box">The bbox of the part of the network to extract.</param>
 26    /// <param name="profiles">The profiles, if output related to profiles is needed.</param>
 27    /// <returns>A string with geojson.</returns>
 28    public static string ToGeoJson(this RoutingNetwork routerDb,
 29        ((double longitude, double latitude, float? e) topLeft, (double longitude, double latitude, float? e)
 30            bottomRight)? box = null, IEnumerable<Profile>? profiles = null)
 031    {
 032        profiles ??= ArraySegment<Profile>.Empty;
 33
 034        using var stream = new MemoryStream();
 035        using (var jsonWriter = new Utf8JsonWriter(stream))
 036        {
 037            jsonWriter.WriteFeatureCollectionStart();
 038            jsonWriter.WriteFeatures(routerDb, box);
 039            jsonWriter.WriteFeatureCollectionEnd();
 040        }
 41
 042        return Encoding.UTF8.GetString(stream.ToArray());
 043    }
 44
 45    /// <summary>
 46    /// Gets a geojson representation of given edge in the routing network.
 47    /// </summary>
 48    /// <param name="routerDb">The routing network.</param>
 49    /// <param name="edgeId">The edge id.</param>
 50    /// <returns>A string with geojson.</returns>
 51    public static string ToGeoJson(this RoutingNetwork routerDb, EdgeId edgeId)
 052    {
 053        var edgeEnumerator = routerDb.GetEdgeEnumerator();
 054        if (!edgeEnumerator.MoveTo(edgeId)) throw new Exception("Edge not found");
 55
 056        using var stream = new MemoryStream();
 057        using (var jsonWriter = new Utf8JsonWriter(stream))
 058        {
 059            jsonWriter.WriteFeatureCollectionStart();
 060            jsonWriter.WriteEdgeFeature(edgeEnumerator);
 061            jsonWriter.WriteFeatureCollectionEnd();
 062        }
 63
 064        return Encoding.UTF8.GetString(stream.ToArray());
 065    }
 66
 67    /// <summary>
 68    /// Writes features to the given json writer.
 69    /// </summary>
 70    /// <param name="jsonWriter">The json writer.</param>
 71    /// <param name="routingNetwork">The routing network.</param>
 72    /// <param name="box">The bounding box.</param>
 73    public static void WriteFeatures(this Utf8JsonWriter jsonWriter, RoutingNetwork routingNetwork,
 74        ((double longitude, double latitude, float? e) topLeft, (double longitude, double latitude, float? e)
 75            bottomRight)? box)
 076    {
 077        var vertices = new HashSet<VertexId>();
 078        var edges = new HashSet<EdgeId>();
 79
 080        if (box == null)
 081        {
 082            var vertexEnumerator = routingNetwork.GetVertexEnumerator();
 083            var edgeEnumerator = routingNetwork.GetEdgeEnumerator();
 084            while (vertexEnumerator.MoveNext())
 085            {
 086                edgeEnumerator.MoveTo(vertexEnumerator.Current);
 87
 088                while (edgeEnumerator.MoveNext())
 089                {
 090                    var tail = edgeEnumerator.Tail;
 091                    if (!vertices.Contains(tail))
 092                    {
 093                        jsonWriter.WriteVertexFeature(tail, routingNetwork);
 094                        vertices.Add(tail);
 095                    }
 96
 097                    var head = edgeEnumerator.Head;
 098                    if (!vertices.Contains(head))
 099                    {
 0100                        jsonWriter.WriteVertexFeature(head, routingNetwork);
 0101                        vertices.Add(head);
 0102                    }
 103
 0104                    var edge = edgeEnumerator.EdgeId;
 0105                    if (!edges.Contains(edge))
 0106                    {
 0107                        jsonWriter.WriteEdgeFeature(routingNetwork, edgeEnumerator);
 0108                        edges.Add(edge);
 0109                    }
 0110                }
 0111            }
 0112        }
 113        else
 0114        {
 0115            var edgeEnumerator = routingNetwork.SearchEdgesInBox(box.Value);
 0116            while (edgeEnumerator.MoveNext())
 0117            {
 0118                var tail = edgeEnumerator.Tail;
 0119                if (!vertices.Contains(tail))
 0120                {
 0121                    jsonWriter.WriteVertexFeature(tail, routingNetwork);
 0122                    vertices.Add(tail);
 0123                }
 124
 0125                var head = edgeEnumerator.Head;
 0126                if (!vertices.Contains(head))
 0127                {
 0128                    jsonWriter.WriteVertexFeature(head, routingNetwork);
 0129                    vertices.Add(head);
 0130                }
 131
 0132                var edge = edgeEnumerator.EdgeId;
 0133                if (!edges.Contains(edge))
 0134                {
 0135                    jsonWriter.WriteEdgeFeature(routingNetwork, edgeEnumerator);
 0136                    edges.Add(edge);
 0137                }
 0138            }
 0139        }
 0140    }
 141
 142    /// <summary>
 143    /// Writes a vertex as a feature.
 144    /// </summary>
 145    /// <param name="jsonWriter">The json writer.</param>
 146    /// <param name="routerDb">The router db.</param>
 147    /// <param name="vertexId">The vertex id.</param>
 148    public static void WriteVertexFeature(this Utf8JsonWriter jsonWriter, VertexId vertexId,
 149        RoutingNetwork routerDb)
 0150    {
 0151        jsonWriter.WriteVertexFeature(vertexId, routerDb.GetVertex(vertexId));
 0152    }
 153
 154    /// <summary>
 155    /// Writes a vertex as a feature.
 156    /// </summary>
 157    /// <param name="jsonWriter">The json writer.</param>
 158    /// <param name="vertexId">The vertex id.</param>
 159    /// <param name="location">The location.</param>
 160    public static void WriteVertexFeature(this Utf8JsonWriter jsonWriter, VertexId vertexId,
 161        (double longitude, double latitude, float? e) location)
 0162    {
 0163        jsonWriter.WriteFeatureStart();
 0164        jsonWriter.WriteProperties(new (string key, string value)[]
 0165        {
 0166            ("_tile_id", vertexId.TileId.ToString()), ("_local_id", vertexId.LocalId.ToString())
 0167        });
 0168        jsonWriter.WritePropertyName("geometry");
 0169        jsonWriter.WritePoint(location);
 0170        jsonWriter.WriteFeatureEnd();
 0171    }
 172
 173    /// <summary>
 174    /// Writes an edge as a feature.
 175    /// </summary>
 176    /// <param name="jsonWriter">The json writer.</param>
 177    /// <param name="routingNetwork">The routing network db.</param>
 178    /// <param name="enumerator">The enumerator.</param>
 179    public static void WriteEdgeFeature(this Utf8JsonWriter jsonWriter,
 180        RoutingNetwork routingNetwork, IEdgeEnumerator enumerator)
 0181    {
 0182        jsonWriter.WriteFeatureStart();
 0183        var attributes = enumerator.Attributes.ToList();
 0184        if (enumerator.Forward)
 0185        {
 0186            attributes.AddRange(new (string key, string value)[]
 0187            {
 0188                ("_tail_tile_id", enumerator.Tail.TileId.ToString()),
 0189                ("_tail_local_id", enumerator.Tail.LocalId.ToString()),
 0190                ("_head_tile_id", enumerator.Head.TileId.ToString()),
 0191                ("_head_local_id", enumerator.Head.LocalId.ToString()),
 0192                ("_edge_id", enumerator.EdgeId.ToString())
 0193            });
 0194        }
 195        else
 0196        {
 0197            attributes.AddRange(new (string key, string value)[]
 0198            {
 0199                ("_head_tile_id", enumerator.Tail.TileId.ToString()),
 0200                ("_head_local_id", enumerator.Tail.LocalId.ToString()),
 0201                ("_tail_tile_id", enumerator.Head.TileId.ToString()),
 0202                ("_tail_local_id", enumerator.Head.LocalId.ToString()),
 0203                ("_edge_id", enumerator.EdgeId.ToString())
 0204            });
 0205        }
 206
 0207        if (enumerator.TailOrder.HasValue) attributes.AddOrReplace("_tail_order", enumerator.TailOrder.Value.ToString())
 0208        if (enumerator.HeadOrder.HasValue) attributes.AddOrReplace("_head_order", enumerator.HeadOrder.Value.ToString())
 209
 0210        foreach (var profileName in routingNetwork.RouterDb.ProfileConfiguration.GetProfileNames())
 0211        {
 0212            if (!routingNetwork.RouterDb.ProfileConfiguration.TryGetProfileHandlerEdgeTypesCache(profileName, out var ed
 0213                out _)) continue;
 214
 0215            if (edgeFactorCache == null) continue;
 0216            if (!enumerator.EdgeTypeId.HasValue) continue;
 217
 0218            var factor = edgeFactorCache.Get(enumerator.EdgeTypeId.Value);
 0219            if (factor == null) continue;
 220
 0221            attributes.AddOrReplace($"_{profileName}_factor_forward",
 0222                factor.Value.ForwardFactor.ToString(System.Globalization.CultureInfo.InvariantCulture));
 0223            attributes.AddOrReplace($"_{profileName}_factor_backward",
 0224                factor.Value.ForwardFactor.ToString(System.Globalization.CultureInfo.InvariantCulture));
 0225            attributes.AddOrReplace($"_{profileName}_speed_forward",
 0226                factor.Value.ForwardSpeedMeterPerSecond.ToString(System.Globalization.CultureInfo.InvariantCulture));
 0227            attributes.AddOrReplace($"_{profileName}_speed_backward",
 0228                factor.Value.BackwardSpeedMeterPerSecond.ToString(System.Globalization.CultureInfo.InvariantCulture));
 229
 0230            if (!routingNetwork.IslandManager.TryGetIslandsFor(profileName, out var islands)) continue;
 0231            if (!islands.GetTileDone(enumerator.Tail.TileId)) continue;
 232
 0233            if (factor.Value.ForwardFactor > 0 || factor.Value.BackwardFactor > 0)
 0234            {
 0235                attributes.AddOrReplace($"_{profileName}_island",
 0236                    islands.IsEdgeOnIsland(enumerator.EdgeId).ToString().ToLowerInvariant());
 0237            }
 0238        }
 239
 0240        jsonWriter.WriteProperties(attributes);
 0241        jsonWriter.WritePropertyName("geometry");
 0242        jsonWriter.WriteLineString(enumerator.GetCompleteShape());
 0243        jsonWriter.WriteFeatureEnd();
 0244    }
 245
 246    /// <summary>
 247    /// Writes an edge as a feature.
 248    /// </summary>
 249    /// <param name="jsonWriter">The json writer.</param>
 250    /// <param name="enumerator">The enumerator.</param>
 251    public static void WriteEdgeFeature(this Utf8JsonWriter jsonWriter,
 252        IEdgeEnumerator enumerator)
 0253    {
 0254        jsonWriter.WriteFeatureStart();
 0255        var attributes = enumerator.Attributes.ToList();
 0256        attributes.AddRange(new (string key, string value)[]
 0257        {
 0258            ("tail_tile_id", enumerator.Tail.TileId.ToString()),
 0259            ("tail_local_id", enumerator.Tail.LocalId.ToString()),
 0260            ("head_tile_id", enumerator.Head.TileId.ToString()),
 0261            ("head_local_id", enumerator.Head.LocalId.ToString()), ("edge_id", enumerator.EdgeId.ToString())
 0262        });
 0263        if (enumerator.TailOrder.HasValue) attributes.AddOrReplace("tail_order", enumerator.TailOrder.Value.ToString());
 0264        if (enumerator.HeadOrder.HasValue) attributes.AddOrReplace("head_order", enumerator.HeadOrder.Value.ToString());
 0265        jsonWriter.WriteProperties(attributes);
 0266        jsonWriter.WritePropertyName("geometry");
 0267        jsonWriter.WriteLineString(enumerator.GetCompleteShape());
 0268        jsonWriter.WriteFeatureEnd();
 0269    }
 270}