Intégration avec la Carte de Données Tele Atlas® Tele Atlas ® SP est intégrée avec des données cartographiques Tele Atlas ®. SP fournit le support pour la base de données MultiNet ® carte, sur laquelle vous pouvez trouver plus d'informations en ligne à l'adresse: http://www.teleatlas.com/OurProducts/MapData/index.htm. Les identifiants des transports que Tele Atlas ® utilise pour identifier les segments de la route (telles que définies et maintenues au niveau national) sont codées directement dans les cartes Tele Atlas ®. Dans les sections suivantes de ce livre blanc nous allons explorer la façon d'utiliser SP avec cartes Tele Atlas ® au niveau des applications. Liaison au Réseau Dynamique Coûte le Calcul Basé à l'heure de Jour Même si les calculs normaux pour le routage et l'ETA sont basées sur des données de coût de liaison de réseau statiques (par exemple, Classification routière fonctionnelle, limites de vitesse affichées), en utilisant les données SP on introduit un paramètre dynamique: l'heure de la journée. Tout en augmentant considérablement la précision de ces calculs, il introduit aussi une complexité supplémentaire dans la mesure où un paramètre en constante évolution doit être prise en compte. Le principe de base qui est en cause est l'extraction de la vitesse moyenne prévue pour un élément de transport basée sur le temps de la journée où l'élément de transport est à parcourir.Par exemple, considérant qu'une vitesse de calcul statique de l'MultiNet ® NW couche Shapefile pourrait être fait en interrogeant simplement le champ KPH comme suit: //La valeur de vitesse calculée est stockée directement dans la couche NW speed = transportationElement.getField(“KPH”); Récupération de la vitesse calculée à 10h00 le lundi matin à partir de données SP impliquerait quelque chose comme le pseudo-code suivant: //Récupérer l'ID de l'élément de transport networkId = transportationElement.getField(“ID”); // Récupérer l'enregistrement correspondant de la couche HSNP hsnpRecord = hsnpLayer.getRecord(networkId); // Récupérer l'ID du profil pour utilisés pour lundi // Pour cet élément de transport profileId = hsnpRecord.getField(“PROFILE_2”); // Récupérer la vitesse du flux libre pour cet élément de transport freeflowSpeed = hsnpRecord.getField(“SPFREEFLOW”); // La fente de temps pour 10h00 du matin est de 120 (10 heures // multiplié par 12 à 5 plages horaires minute par heure) timeslotId = 10 * 12; //Récupérer l'enregistrement SPR à partir du profil correspondant // à l'intervalle du temps de 10:00 le matin SPrRecord = SPrLayer.getRecord(profileId, timeslotId); // La valeur REL_SPEED dans le tableau SPR est le pourcentage // de la vitesse FreeFlow pour l'élément de transport speed = SPrRecord.getField(“REL_SP”) * freeflowSpeed; // La valeur REL_SPEED dans le tableau SPR est le pourcentage // de la vitesse FreeFlow pour l'élément de transport > speed = SPrRecord.getField(“REL_SP”) * freeflowSpeed; Intégration de données SP dans toute partie d'une application qui utilise le calcul des coûts lien réseau (routage, l'ETA calcul, la visualisation dynamique des données SP) consiste à utiliser un algorithme semblable à celui montré ci-dessus pour calculer la vitesse moyenne le long d'un élément de réseau à tout moment de jour. S'il vous plaît garder à l'esprit que certains des détails les plus fines ont été laissés de côté au-dessus de la pseudo-code, comme le fait que les données de profil complet n'est pas toujours disponible pour tous les éléments de la route, auquel cas le donné la vitesse moyenne de jour de semaine ou week-end est appliquée. Exemple: Calcul de l'ETA en Java Calcul de l'ETA et de routage sont deux des utilisations les plus logique pour les données SP; ces deux calculs sont en grande partie basée sur le coût (temps) liées à voyager sur un élément de réseau unique. L'exemple ci-dessous passe en revue les bases de calcul de l'ETA pour une liste des éléments de transport liés à Java. Cet exemple utilise un peu d'interface de base pour représenter les éléments du produit SP et le produit MultiNet ®: · DataStore, qui donne accès à une seule couche de données SP (ie, HSNP, SPR) · Record, qui représente un record unique pour un DataStore · TransportationElement, ce qui représente un record de la couche MultiNet ® Shapefile NW /** A data store that provides access to Shapefile SP layers */ public interface DataStore { /** Return the record that corresponds to supplied id field(s) */ Record getRecord(int... idFields); } /** Represents a single record retrieved from a DataStore */ public interface Record { /** Get the string representation of a field */ String getStringField(String fieldName); /** Get the Integer representation of a field */ Integer getIntegerField(String fieldName); /** Get the Double representation of a field */ Double getDoubleField(String fieldName); } /** * Represents a single transportation element that can calculate its * travel time at a given speed */ public interface TransportationElement { /** Get the id for this transportation element */ int getId(); /** * Get the travel time in seconds for this transportation element * at a given speed */ int getTravelTime(double kilometersPerHour); } Le pseudo-code ci-dessous calcule l'ETA pour une liste ordonnée d'objets TransportationElement, étant donné un temps de démarrage. Un point important à noter ici est que la vitesse relative (REL_SP) valeur qui est récupérée pour chaque élément de route est basée sur le temps de la journée où l'élément Voyage le long de la route est commencé, et non pas à l'heure de début pour le voyage ensemble. Des complications peuvent survenir lorsque le temps Voyage d'un élément de transport traverse la frontière d'un intervalle de temps. Encore une fois, il est également important de garder à l'esprit qu'il ya une hypothèse formulée dans le code suivant que chaque élément de transport a permis de relier les données de profil, ce n'est pas le cas dans la réalité. Dans certains cas, seul le débit moyen des jours de la semaine (SPWEEKDAY) et la vitesse moyenne du week-end (SPWEEKEND) sera disponible pour les éléments de transport particulier. Un autre point qui n'est pas pris en compte dans cet exemple est la direction du Voyage le long des éléments de transport: on suppose qu'il ya seulement un enregistrement par élément de transport dans la couche PCNE (et donc pas de direction des données spécifiques). /** * Calculates the Estimated Time of Arrival for an ordered list of * Transportation Elements based on Historical Speed Profile data */ public class EtaCalculator { private static final int TIME_SLOT_MINUTES = 5; private DataStore hsnpDataStore; private DataStore SPrDataStore; public EtaCalculator(DataStore hsnpDataStore, DataStore SPrDataStore) { this.hsnpDataStore = hsnpDataStore; this.SPrDataStore = SPrDataStore; } /** * Calculate the ETA for travel over an ordered * list of Transportation Elements * @param transportationElement The list of * transportation elements to be traversed * @param startTime The time when travel will start * @return The estimated time of arrival */ public Calendar calculateEta( List transportationElements, Calendar startTime) { Calendar eta = (Calendar) startTime.clone(); for (TransportationElement transportationElement : transportationElements) { // Fetch the HSNP record for the current // transportation element Record hsnpRecord = hsnpDataStore.getRecord( transportationElement.getId()); int freeflowSpeed = hsnpRecord.getIntegerField("SPFREEFLOW"); // Calculate the appropriate TIME_SLOT value // based on time of day int hours = eta.get(Calendar.HOUR_OF_DAY); int minutes = eta.get(Calendar.MINUTE); White Paper. Speed Profiles int timeSlotId = ((hours * 60) + minutes) / TIME_SLOT_MINUTES; // Retrieve the related profile record int profileId = hsnpRecord.getIntegerField("PROFILE_" + eta.get(Calendar.DAY_OF_WEEK)); Record profileRecord = SPrDataStore.getRecord(profileId, timeSlotId); // Calculate the travel time and add it to the ETA double freeflowPercentage = profileRecord.getDoubleField("REL_SP"); double travelSpeed = freeflowPercentage * freeflowSpeed; int travelSeconds = transportationElement .getTravelTime(travelSpeed); eta.add(Calendar.SECOND, travelSeconds); } return eta; } } S'il vous plaît noter que l'ETA de la liste des TransportationElements dépend du temps. Si l'heure de départ du calcul de l'ETA est modifié, l'ETA se changera aussi. La même chose s'applique à tous les points intermédiaires le long de la liste. Si l'heure d'arrivée effective sur un élément intermédiaire n'est pas le même que le temps prévu pour être mis sur cet élément intermédiaire, l'ETA pour la partie restante de la liste de mai ont changé. Dans ce cas, un nouveau calcul de l'ETA pour la partie restante de la liste est nécessaire. Exemple: Dijkstra en pseudo-code Cet exemple montre comment une recherche Dijkstra peut être adapté pour utiliser les données de SP pendant la fouille. Le pseudo-code est en substance la même que la pseudo-Dijkstra code qui peut être trouvé sur Wikipedia [27s_algorithm% http://en.wikipedia.org/wiki/Dijkstra].Les modifications apportées à cet exemple par rapport au code de Wikipedia est qu'il est une recherche Dijkstra entre la source et la cible et que le critère itinéraire a été changé d'une recherche pure à une distance basés sur le temps de recherche. 1 function Dijkstra(Graph, source, target): 2 for each vertex v in Graph: // Initializations 3 cost[v] := infinity // Unknown cost function from source to v 4 previous[v] := undefined // Previous node in optimal path from source 5 eta[v] := undefined // Departure time on node v 6 cost[source] := 0 // Cost from source to source 7 eta[source] := current time // Departure time at source 8 Q := the set of all nodes in Graph // All nodes of the graph 9 while Q is not empty: // The main loop 10 u := node in Q with smallest cost[] 11 remove u from Q 12 if u == target return found // stop the search when target is found 13 for each neighbor v of u: // where v is still in Q. 14 alt := cost[u] + cost_between(u, v, eta[v]) 15 if alt < cost[v] // Relax (u,v) 16 cost[v] := alt 17 previous[v] := u 18 eta[v] := eta[u] + traveltime_between(u, v, eta[v]) 19 return not found Les adaptations indispensables à la Dijkstra standard sont sur 5 lignes, 7, 14 et 18. S'il vous plaît noter que l'heure de départ pour chaque nœud est nécessaire lors de la recherche pour le calcul des coûts. L'ETA "" les valeurs pour les nœuds sont initialisés à la ligne 5. L'heure de départ pour la source est situé sur la ligne 7. Lors de la fouille l'heure de départ est utilisé pour calculer le coût de Voyage pour voyager entre u et v (ligne 14), et de nouveau dans le calcul du temps d'arrivée sur le nouveau nœud V (ligne 18). La scission entre «coût» et «eta» pour chaque nœud a été fait à dessein pour montrer qu'il est possible d'avoir une différence entre le «coût» de calcul et de l'ETA "" calcul. Le traveltime_between "" fonction est égale à la fonction "getTravelTime» de l'exemple de calcul de l'ETA. Pour un temps de planification, de la cost_between "" fonction va également utiliser la fonction "getTravelTime» dans le cadre du calcul du coût. Dans l'exemple Dijkstra, le temps de traverser un carrefour (coût tour) en est exclu. En principe, cette jonction temps de traversée sera également influencé par l'écoulement du trafic, mais ces données ne fait pas partie des données de SP pour le moment, mais mai être dans les versions futures. S'il vous plaît noter que la recherche Dijkstra est réalisée comme une recherche tournée vers la direction (en commençant par le départ et aller à la destination). Cela est nécessaire parce que l'heure exacte du départ de chaque noeud est nécessaire lors de la recherche afin d'utiliser les données SP. |