// Use Api.Instance.TransportApi.CreatePositioner for public construction
        internal TransportPositioner(
            TransportApiInternal transportApiInternal,
            int id,
            TransportPositionerOptions options)
        {
            if (transportApiInternal == null)
            {
                throw new ArgumentNullException("transportApiInternal");
            }

            if (id == InvalidId)
            {
                throw new ArgumentException("invalid id");
            }

            m_transportApiInternal = transportApiInternal;

            Id = id;
            InputLatitudeDegrees  = options.InputLatitudeDegrees;
            InputLongitudeDegrees = options.InputLongitudeDegrees;
            InputHeadingDegrees   = options.InputHeadingDegrees;
            MaxHeadingDeviationToMatchedPointDegrees = options.MaxHeadingDeviationToMatchedPointDegrees;
            MaxDistanceToMatchedPointMeters          = options.MaxDistanceToMatchedPointMeters;
            TransportNetworkType = options.TransportNetworkType;
            HasInputHeading      = options.HasHeading;
        }
        public IList <TransportDirectedEdgeId> GetDirectedEdgeIdsForNetwork(TransportNetworkType transportNetwork)
        {
            var interopIds      = FetchDirectedEdgeIdsForNetwork(transportNetwork);
            var directedEdgeIds = interopIds.Select(_x => _x.FromInterop()).ToList();

            return(directedEdgeIds);
        }
        public IList <TransportWayId> GetWayIdsForNetwork(TransportNetworkType transportNetwork)
        {
            var interopIds = FetchWayIdsForNetwork(transportNetwork);
            var wayIds     = interopIds.Select(_x => _x.FromInterop()).ToList();

            return(wayIds);
        }
    private void OnTransportNetworkCellRemoved(TransportNetworkType transportNetwork, TransportCellKey cellKey)
    {
        var objectKey = MakeObjectKey(transportNetwork, cellKey);

        RemoveAndDestroyWayMeshes(objectKey);
        RemoveAndDestroyLinkMeshes(objectKey);
    }
        public void NotifyTransportGraphChanged(
            TransportNetworkType transportNetworkType,
            TransportCellKey cellKey,
            TransportGraphChangeReason transportGraphChangeReason
            )
        {
            switch (transportGraphChangeReason)
            {
            case TransportGraphChangeReason.TransportGraphCellAdded:
                if (OnTransportNetworkCellAdded != null)
                {
                    OnTransportNetworkCellAdded(transportNetworkType, cellKey);
                }
                break;

            case TransportGraphChangeReason.TransportGraphCellRemoved:
                if (OnTransportNetworkCellRemoved != null)
                {
                    OnTransportNetworkCellRemoved(transportNetworkType, cellKey);
                }
                break;

            case TransportGraphChangeReason.TransportGraphCellUpdated:
                if (OnTransportNetworkCellUpdated != null)
                {
                    OnTransportNetworkCellUpdated(transportNetworkType, cellKey);
                }
                break;

            default:
                throw new System.ArgumentOutOfRangeException("transportGraphChangeReason");
            }
        }
 private static void RaiseEvent(TransportNetworkChangedHandler handler, TransportNetworkType networkType, TransportCellKey cellKey)
 {
     if (handler != null)
     {
         handler(networkType, cellKey);
     }
 }
        private IList <TransportWay> BuildWaysForCell(
            TransportNetworkType transportNetworkType,
            TransportCellKey cellKey
            )
        {
            var cellKeyInterop = cellKey.ToInterop();
            int wayCount       = NativeTransportApi_GetWayCountForNetworkInCell(NativePluginRunner.API, transportNetworkType, cellKeyInterop);

            if (wayCount <= 0)
            {
                return(new List <TransportWay>());
            }

            // alloc and pin buffers
            var wayIdInteropBuffer         = new TransportWayIdInterop[wayCount];
            var wayIdInteropBufferGCHandle = GCHandle.Alloc(wayIdInteropBuffer, GCHandleType.Pinned);
            var wayIdInteropBufferPtr      = wayIdInteropBufferGCHandle.AddrOfPinnedObject();

            // populate buffers from C++ api
            var waySuccess = NativeTransportApi_TryGetWayIdsForNetworkInCell(NativePluginRunner.API, transportNetworkType, cellKeyInterop, wayCount, wayIdInteropBufferPtr);

            if (!waySuccess)
            {
                throw new System.ArgumentOutOfRangeException("incorrect buffer size passed for way ids");
            }

            var ways = FetchWays(wayIdInteropBuffer);

            // free buffers
            wayIdInteropBufferGCHandle.Free();

            return(ways);
        }
        private IList <TransportDirectedEdge> BuildDirectedEdgesForCell(
            TransportNetworkType transportNetworkType,
            TransportCellKey cellKey
            )
        {
            var cellKeyInterop    = cellKey.ToInterop();
            int directedEdgeCount = NativeTransportApi_GetDirectedEdgeCountForNetworkInCell(NativePluginRunner.API, transportNetworkType, cellKeyInterop);

            if (directedEdgeCount <= 0)
            {
                return(new List <TransportDirectedEdge>());
            }

            // alloc and pin buffers
            var directedEdgeIdInteropBuffer         = new TransportDirectedEdgeIdInterop[directedEdgeCount];
            var directedEdgeIdInteropBufferGCHandle = GCHandle.Alloc(directedEdgeIdInteropBuffer, GCHandleType.Pinned);
            var directedEdgeIdInteropBufferPtr      = directedEdgeIdInteropBufferGCHandle.AddrOfPinnedObject();

            // populate buffers from C++ api
            var directedEdgeSuccess = NativeTransportApi_TryGetDirectedEdgeIdsForNetworkInCell(NativePluginRunner.API, transportNetworkType, cellKeyInterop, directedEdgeCount, directedEdgeIdInteropBufferPtr);

            if (!directedEdgeSuccess)
            {
                throw new System.ArgumentOutOfRangeException("incorrect buffer size passed for directed edge ids");
            }

            var directedEdges = FetchDirectedEdges(directedEdgeIdInteropBuffer);

            // free buffer
            directedEdgeIdInteropBufferGCHandle.Free();
            return(directedEdges);
        }
        public IList <TransportWayId> GetWayIdsForNetworkInCell(TransportNetworkType transportNetwork, TransportCellKey cellKey)
        {
            var cellKeyInterop = cellKey.ToInterop();
            var interopIds     = FetchWayIdsForNetworkInCell(transportNetwork, cellKeyInterop);
            var wayIds         = interopIds.Select(_x => _x.FromInterop()).ToList();

            return(wayIds);
        }
    private void OnTransportNetworkCellUpdated(TransportNetworkType transportNetwork, TransportCellKey cellKey)
    {
        var objectKey = MakeObjectKey(transportNetwork, cellKey);

        RemoveAndDestroyLinkMeshes(objectKey);
        var directedEdges = m_transportApi.GetDirectedEdgesForNetworkAndCell(transportNetwork, cellKey);

        CreateAndAddLinkMeshes(objectKey, directedEdges);
    }
        private void OnTransportNetworkCellRemoved(TransportNetworkType networkType, TransportCellKey cellKey)
        {
            if (networkType != NetworkType)
            {
                return;
            }

            RemoveForCell(cellKey);
        }
        public static void OnTransportGraphChanged(
            IntPtr transportApiHandle,
            TransportNetworkType transportNetworkType,
            MortonKeyInterop cellKeyInterop,
            TransportGraphChangeReason transportGraphChangeReason)
        {
            var transportApiInternal = transportApiHandle.NativeHandleToObject <TransportApiInternal>();
            var cellKey = cellKeyInterop.FromInterop();

            transportApiInternal.NotifyTransportGraphChanged(transportNetworkType, cellKey, transportGraphChangeReason);
        }
        private void OnTransportNetworkCellUpdated(TransportNetworkType networkType, TransportCellKey cellKey)
        {
            if (networkType != NetworkType)
            {
                return;
            }

            var directedEdgeIds = m_transportApi.GetDirectedEdgeIdsForNetworkInCell(networkType, cellKey);

            UpdateForCell(cellKey, directedEdgeIds);
        }
    private void OnTransportNetworkCellAdded(TransportNetworkType transportNetwork, TransportCellKey cellKey)
    {
        var objectKey = MakeObjectKey(transportNetwork, cellKey);

        var ways = m_transportApi.GetWaysForNetworkAndCell(transportNetwork, cellKey);

        CreateAndAddWayMeshes(objectKey, ways);

        var directedEdges = m_transportApi.GetDirectedEdgesForNetworkAndCell(transportNetwork, cellKey);

        CreateAndAddLinkMeshes(objectKey, directedEdges);
    }
        private void OnTransportNetworkCellAdded(TransportNetworkType networkType, TransportCellKey cellKey)
        {
            if (networkType != NetworkType)
            {
                return;
            }
            var nodeIds         = m_transportApi.GetNodeIdsForNetworkInCell(networkType, cellKey);
            var directedEdgeIds = m_transportApi.GetDirectedEdgeIdsForNetworkInCell(networkType, cellKey);
            var wayIds          = m_transportApi.GetWayIdsForNetworkInCell(networkType, cellKey);

            AddForCell(cellKey, nodeIds, directedEdgeIds, wayIds);
        }
        public TransportGraph(
            TransportNetworkType networkType,
            TransportApi transportApi
            )
        {
            this.NetworkType    = networkType;
            this.m_transportApi = transportApi;

            m_transportApi.OnTransportNetworkCellAdded   += OnTransportNetworkCellAdded;
            m_transportApi.OnTransportNetworkCellRemoved += OnTransportNetworkCellRemoved;
            m_transportApi.OnTransportNetworkCellUpdated += OnTransportNetworkCellUpdated;
        }
Esempio n. 17
0
 public TransportPositionerOptions(
     double inputLatitudeDegrees,
     double inputLongitudeDegrees,
     bool hasHeading,
     double inputHeadingDegrees,
     double maxDistanceToMatchedPointMeters,
     double maxHeadingDeviationToMatchedPointDegrees,
     TransportNetworkType transportNetworkType
     )
 {
     InputLatitudeDegrees                     = inputLatitudeDegrees;
     InputLongitudeDegrees                    = inputLongitudeDegrees;
     HasHeading                               = hasHeading;
     InputHeadingDegrees                      = inputHeadingDegrees;
     MaxDistanceToMatchedPointMeters          = maxDistanceToMatchedPointMeters;
     MaxHeadingDeviationToMatchedPointDegrees = maxHeadingDeviationToMatchedPointDegrees;
     TransportNetworkType                     = transportNetworkType;
 }
        private IList <TransportNodeIdInterop> FetchNodeIdsForNetworkInCell(TransportNetworkType transportNetwork, MortonKeyInterop cellKeyInterop)
        {
            int nodeCount = NativeTransportApi_GetNodeCountForNetworkInCell(NativePluginRunner.API, transportNetwork, cellKeyInterop);

            if (nodeCount <= 0)
            {
                return(new List <TransportNodeIdInterop>());
            }

            var nodeIdInteropBuffer         = new TransportNodeIdInterop[nodeCount];
            var nodeIdInteropBufferGCHandle = GCHandle.Alloc(nodeIdInteropBuffer, GCHandleType.Pinned);
            var nodeIdInteropBufferPtr      = nodeIdInteropBufferGCHandle.AddrOfPinnedObject();

            if (!NativeTransportApi_TryGetNodeIdsForNetworkInCell(NativePluginRunner.API, transportNetwork, cellKeyInterop, nodeCount, nodeIdInteropBufferPtr))
            {
                throw new System.ArgumentOutOfRangeException("incorrect buffer size passed for node ids");
            }

            nodeIdInteropBufferGCHandle.Free();

            return(nodeIdInteropBuffer);
        }
        private IList <TransportWayIdInterop> FetchWayIdsForNetwork(TransportNetworkType transportNetwork)
        {
            int wayCount = NativeTransportApi_GetWayCountForNetwork(NativePluginRunner.API, transportNetwork);

            if (wayCount <= 0)
            {
                return(new List <TransportWayIdInterop>());
            }

            var wayIdInteropBuffer         = new TransportWayIdInterop[wayCount];
            var wayIdInteropBufferGCHandle = GCHandle.Alloc(wayIdInteropBuffer, GCHandleType.Pinned);
            var wayIdInteropBufferPtr      = wayIdInteropBufferGCHandle.AddrOfPinnedObject();
            var waySuccess = NativeTransportApi_TryGetWayIdsForNetwork(NativePluginRunner.API, transportNetwork, wayCount, wayIdInteropBufferPtr);

            if (!waySuccess)
            {
                throw new System.ArgumentOutOfRangeException("incorrect buffer size passed for way ids");
            }

            wayIdInteropBufferGCHandle.Free();

            return(wayIdInteropBuffer);
        }
Esempio n. 20
0
 /// <summary>
 /// Get a collection of TransportWayId keys for all TransportWay objects currently streamed in for the given transport network.
 /// </summary>
 /// <param name="transportNetwork">The returned results are filtered to contain only ids for ways belonging to this transport network.</param>
 /// <returns>An unordered list of TransportNodeId objects.</returns>
 public IList <TransportWayId> GetWayIdsForNetwork(TransportNetworkType transportNetwork)
 {
     return(m_apiInternal.GetWayIdsForNetwork(transportNetwork));
 }
        /// <summary>
        /// Get all TransportWay objects currently streamed in for the given transport network and cell.
        /// </summary>
        /// <param name="transportApi">TransportApi instance.</param>
        /// <param name="transportNetwork">The returned results are filtered to contain only objects belonging to this transport network.</param>
        /// <param name="cellKey">The returned results are filtered to contain only objects belonging to this cell.</param>
        /// <returns>The list of TransportWay objects for the given network and cell.</returns>
        static public IList <TransportWay> GetWaysForNetworkAndCell(this TransportApi transportApi, TransportNetworkType transportNetwork, TransportCellKey cellKey)
        {
            var wayIds = transportApi.GetWayIdsForNetworkInCell(transportNetwork, cellKey);
            var ways   = new List <TransportWay>();

            foreach (var wayId in wayIds)
            {
                TransportWay way;
                if (!transportApi.TryGetWay(wayId, out way))
                {
                    throw new System.ArgumentOutOfRangeException("unable to fetch TransportWay");
                }
                ways.Add(way);
            }
            return(ways);
        }
        /// <summary>
        /// Get all TransportDirectedEdge objects currently streamed in for the given transport network and cell.
        /// </summary>
        /// <param name="transportApi">TransportApi instance.</param>
        /// <param name="transportNetwork">The returned results are filtered to contain only objects belonging to this transport network.</param>
        /// <param name="cellKey">The returned results are filtered to contain only objects belonging to this cell.</param>
        /// <returns>The list of TransportDirectedEdge objects for the given network and cell.</returns>
        static public IList <TransportDirectedEdge> GetDirectedEdgesForNetworkAndCell(this TransportApi transportApi, TransportNetworkType transportNetwork, TransportCellKey cellKey)
        {
            var directedEdgeIds = transportApi.GetDirectedEdgeIdsForNetworkInCell(transportNetwork, cellKey);
            var directedEdges   = new List <TransportDirectedEdge>();

            foreach (var directedEdgeId in directedEdgeIds)
            {
                TransportDirectedEdge directedEdge;
                if (!transportApi.TryGetDirectedEdge(directedEdgeId, out directedEdge))
                {
                    throw new System.ArgumentOutOfRangeException("unable to fetch TransportDirectedEdge");
                }
                directedEdges.Add(directedEdge);
            }
            return(directedEdges);
        }
        /// <summary>
        /// Get all TransportNode objects currently streamed in for the given transport network and cell.
        /// </summary>
        /// <param name="transportApi">TransportApi instance.</param>
        /// <param name="transportNetwork">The returned results are filtered to contain only objects belonging to this transport network.</param>
        /// <param name="cellKey">The returned results are filtered to contain only objects belonging to this cell.</param>
        /// <returns>The list of TransportNode objects for the given network and cell.</returns>
        static public IList <TransportNode> GetNodesForNetworkAndCell(this TransportApi transportApi, TransportNetworkType transportNetwork, TransportCellKey cellKey)
        {
            var nodeIds = transportApi.GetNodeIdsForNetworkInCell(transportNetwork, cellKey);
            var nodes   = new List <TransportNode>();

            foreach (var nodeId in nodeIds)
            {
                TransportNode node;
                if (!transportApi.TryGetNode(nodeId, out node))
                {
                    throw new System.ArgumentOutOfRangeException("unable to fetch TransportWay");
                }
                nodes.Add(node);
            }
            return(nodes);
        }
 /// <summary>
 /// TransportGraph factory method.
 /// </summary>
 /// <param name="transportApi">TransportApi instance.</param>
 /// <param name="transportNetwork">The transport network for which the TransportGraph will be created.</param>
 /// <returns>A TransportGraph instance.</returns>
 static public TransportGraph CreateTransportGraph(this TransportApi transportApi, TransportNetworkType transportNetwork)
 {
     return(new TransportGraph(transportNetwork, transportApi));
 }
Esempio n. 25
0
 /// <summary>
 /// Get a collection of TransportWayId keys for all TransportWay objects currently streamed in for the given transport network and cell.
 /// </summary>
 /// <param name="transportNetwork">The returned results are filtered to contain only ids for ways belonging to this transport network.</param>
 /// <param name="cellKey">The returned results are filtered to contain only ids for ways belonging to this cell.</param>
 /// <returns>An unordered list of the id of all TransportWay objects currently resident, filtered by transportNetwork and cellKey.</returns>
 public IList <TransportWayId> GetWayIdsForNetworkInCell(TransportNetworkType transportNetwork, TransportCellKey cellKey)
 {
     return(m_apiInternal.GetWayIdsForNetworkInCell(transportNetwork, cellKey));
 }
Esempio n. 26
0
 /// <summary>
 /// Get a collection of TransportDirectedEdgeId keys for all TransportDirectedEdge objects currently streamed in for the given transport network.
 /// </summary>
 /// <param name="transportNetwork">The returned results are filtered to contain only ids for directed edges belonging to this transport network.</param>
 /// <returns>An unordered list of TransportDirectedEdgeId objects.</returns>
 public IList <TransportDirectedEdgeId> GetDirectedEdgeIdsForNetwork(TransportNetworkType transportNetwork)
 {
     return(m_apiInternal.GetDirectedEdgeIdsForNetwork(transportNetwork));
 }
 private string MakeObjectKey(TransportNetworkType transportNetwork, TransportCellKey cellKey)
 {
     return(transportNetwork.ToString() + "_" + m_transportApi.TransportCellKeyToString(cellKey));
 }
 private static extern bool NativeTransportApi_TryGetDirectedEdgeIdsForNetwork(IntPtr ptr, TransportNetworkType networkType, int bufferElementCount, IntPtr directedEdgeIdInteropBuffer);
 private static extern bool NativeTransportApi_TryGetWayIdsForNetworkInCell(IntPtr ptr, TransportNetworkType networkType, MortonKeyInterop cellKeyInterop, int bufferElementCount, IntPtr wayIdInteropBuffer);
 /// <summary>
 /// Set the transport network on which to attempt to find a matching point.
 /// </summary>
 /// <param name="transportNetworkType">The transport network on which the resultant TransportPositioner will operate.</param>
 /// <returns>This object, with the transport network set.</returns>
 public TransportPositionerOptionsBuilder SetTransportNetworkType(TransportNetworkType transportNetworkType)
 {
     m_transportNetworkType = transportNetworkType;
     return(this);
 }