


Comment créer une application d'optimisation d'itinéraire à arrêts multiples avec l'API TomTom Maps
Cet article vous guidera dans la création d'une application de demande de trajet à l'aide de l'API TomTom Maps. Cette application permettra aux utilisateurs de saisir plusieurs lieux de prise en charge et de dépose, de calculer l'itinéraire optimal et de l'afficher sur une carte. Nous couvrirons tout, depuis l’obtention de la clé API jusqu’au rendu de l’itinéraire optimisé sur une carte.
Étape 1 : configuration de l'API TomTom
Avant de plonger dans le code, vous devrez vous inscrire sur le portail des développeurs TomTom et obtenir une clé API. Cette clé vous permettra d'accéder aux services TomTom tels que le routage, le géocodage et les cartes.
Étape 2 : Implémentation de la fonctionnalité de demande de trajet
Le cœur de l'application consiste à collecter des adresses, à les convertir en coordonnées et à calculer l'itinéraire optimal. Voici comment procéder :
def ride_request(request): if request.method == 'POST': form = RideForm(request.POST) if form.is_valid(): ride = form.save(commit=False) # Get coordinates for the pickup and drop locations pickup_coords = get_coordinates(ride.pickup_address) pickup_coords_1 = get_coordinates(ride.pickup_address_1) pickup_coords_2 = get_coordinates(ride.pickup_address_2) drop_coords = get_coordinates(ride.drop_address) # Ensure all coordinates are available if all([pickup_coords, pickup_coords_1, pickup_coords_2, drop_coords]): # Set the coordinates ride.pickup_latitude, ride.pickup_longitude = pickup_coords ride.pickup_latitude_1, ride.pickup_longitude_1 = pickup_coords_1 ride.pickup_latitude_2, ride.pickup_longitude_2 = pickup_coords_2 ride.drop_latitude, ride.drop_longitude = drop_coords # Save the ride and redirect to the success page try: ride.save() return redirect('success_page', pickup_lon=ride.pickup_longitude, pickup_lat=ride.pickup_latitude, pickup_lon_1=ride.pickup_longitude_1, pickup_lat_1=ride.pickup_latitude_1, pickup_lon_2=ride.pickup_longitude_2, pickup_lat_2=ride.pickup_lat_2, drop_lon=ride.drop_longitude, drop_lat=ride.drop_latitude) except IntegrityError as e: messages.error(request, f'IntegrityError: {str(e)}') else: messages.error(request, 'Error getting coordinates. Please try again.') else: form = RideForm() return render(request, 'maps/ride_request.html', {'form': form})
Dans cet extrait, l'application accepte les entrées de l'utilisateur pour plusieurs adresses, convertit ces adresses en coordonnées à l'aide de la fonction get_coordonnées et enregistre les données pour une utilisation ultérieure.
def get_coordinates(address): """ Get coordinates (latitude, longitude) for a given address using TomTom Geocoding API. """ api_key = 'YOUR_TOMTOM_API_KEY' base_url = 'https://api.tomtom.com/search/2/geocode/{address}.json' # Prepare the URL with the address and API key url = base_url.format(address=address) params = {'key': api_key} # Make the request to TomTom Geocoding API response = requests.get(url, params=params) data = response.json() # Check if the request was successful if response.status_code == 200 and data.get('results'): # Extract coordinates from the response result = data['results'][0] if 'position' in result: coordinates = result['position'] return coordinates.get('lat'), coordinates.get('lon') else: print( f"Error getting coordinates for {address}: 'position' key not found in the response.") return None else: # Handle errors or return a default value print( f"Error getting coordinates for {address}: {data.get('message')}") return None
Étape 3 : Calcul de l'itinéraire optimisé
Une fois que vous avez les coordonnées, l’étape suivante consiste à calculer l’itinéraire optimisé. L'API Waypoint Optimization de TomTom aide à déterminer le chemin le plus efficace entre plusieurs points.
def get_optimized_route(*pickup_coords, drop_coords): api_key = 'YOUR_TOMTOM_API_KEY' # Prepare the payload for the API payload = { 'waypoints': [{'point': {'latitude': lat, 'longitude': lon}} for lon, lat in pickup_coords], 'options': {'travelMode': 'car'}, } # Add the drop location to the waypoints payload['waypoints'].append({'point': {'latitude': drop_coords[1], 'longitude': drop_coords[0]}}) # API request response = requests.post(f'https://api.tomtom.com/routing/waypointoptimization/1', params={'key': api_key}, json=payload) if response.status_code == 200: data = response.json() if 'optimizedOrder' in data: # Extract the optimized route return [get_route_geometry(pickup_coords[i], pickup_coords[j]) for i, j in zip(data['optimizedOrder'], data['optimizedOrder'][1:])] return None
Cette fonction envoie une requête à l'API TomTom, reçoit l'ordre optimisé des waypoints, puis calcule la géométrie de l'itinéraire.
Étape 4 : Rendu de la carte et de l'itinéraire
Enfin, après avoir obtenu les données d'itinéraire optimisées, il est temps d'afficher la carte sur votre success_page.html.
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Ride Request - Success</title> <link rel="stylesheet" href="{% static 'maps/css/styles.css' %}"> <!-- Include TomTom Map SDK --> <link rel="stylesheet" type="text/css" href="https://api.tomtom.com/maps-sdk-for-web/cdn/6.x/6.25.0/maps/maps.css" /> <script type="text/javascript" src="https://api.tomtom.com/maps-sdk-for-web/cdn/6.x/6.25.0/maps/maps-web.min.js"></script> </head> <body> <div class="container"> <div class="map-container" id="dynamic-map"></div> </div> <!-- Map Initialization Script --> <script type="text/javascript"> var map; var pickup_lon = {{ pickup_lon }}; var pickup_lat = {{ pickup_lat }}; var pickup_lon_1 = {{ pickup_lon_1 }}; var pickup_lat_1 = {{ pickup_lat_1 }}; var pickup_lon_2 = {{ pickup_lon_2 }}; var pickup_lat_2 = {{ pickup_lat_2 }}; var drop_lon = {{ drop_lon }}; var drop_lat = {{ drop_lat }}; var routeGeometry = {{ route_data.route_geometry| safe }}; var geomatryCoordinates = routeGeometry.geometry.coordinates; const API_KEY = 'YOUR_TOMTOM_API_KEY'; function initMap() { //let center = [(pickup_lat + drop_lat) / 2, (pickup_lon + drop_lon) / 2]; let center = [pickup_lon, pickup_lat]; console.log('center:', center) map = tt.map({ key: API_KEY, container: 'dynamic-map', //stylesVisibility: { // trafficIncidents: true //}, center: center, bearing: 0, maxZoom: 21, minZoom: 1, pitch: 60, zoom: 12, //style: `https://api.tomtom.com/style/1/style/*?map=2/basic_street-satellite&poi=2/poi_dynamic-satellite&key=${API_KEY}` }); map.addControl(new tt.FullscreenControl()); map.addControl(new tt.NavigationControl()); map.on('load', () => { console.log('Map loaded successfully!'); // Add markers for all pickup locations and drop location var pickupMarker = new tt.Marker({ color: 'green' }).setLngLat([pickup_lon, pickup_lat]).addTo(map); var pickupMarker1 = new tt.Marker({ color: 'blue' }).setLngLat([pickup_lon_1, pickup_lat_1]).addTo(map); var pickupMarker2 = new tt.Marker({ color: 'orange' }).setLngLat([pickup_lon_2, pickup_lat_2]).addTo(map); var dropMarker = new tt.Marker({ color: 'red' }).setLngLat([drop_lon, drop_lat]).addTo(map); try { // Iterate through each set of coordinates and add route layer geomatryCoordinates.forEach((coordinates, index) => { var routeGeometry = { type: 'Feature', geometry: { type: 'LineString', coordinates: coordinates, }, }; // Check if the routeGeometry is a valid GeoJSON object if (isValidGeoJSON(routeGeometry)) { map.addLayer({ 'id': `route-${index}`, 'type': 'line', 'source': { 'type': 'geojson', 'data': routeGeometry, }, 'layout': { 'line-join': 'round', 'line-cap': 'round', }, 'paint': { 'line-color': '#3887be', 'line-width': 8, 'line-opacity': 0.8, }, }); console.log(`Route layer ${index} added successfully!`); } else { console.error(`Invalid GeoJSON format for route ${index}. Creating a simple LineString.`); // Attempt to create a LineString GeoJSON var simpleRouteGeometry = { type: 'Feature', geometry: { type: 'LineString', coordinates: coordinates, }, }; map.addLayer({ 'id': `route-${index}`, 'type': 'line', 'source': { 'type': 'geojson', 'data': simpleRouteGeometry, }, 'layout': { 'line-join': 'round', 'line-cap': 'round', }, 'paint': { 'line-color': '#3887be', 'line-width': 8, 'line-opacity': 0.8, }, }); console.log(`Route layer ${index} added successfully with new GeoJSON.`); } }); } catch (error) { console.error('Error handling GeoJSON:', error); } function isValidGeoJSON(data) { return typeof data === 'object' && data !== null && data.type === 'Feature'; } initMap(); // Call the initMap function </script> </body> </html>
Ce code HTML initialise la carte TomTom, place des balises sur les points de prise en charge et de dépose, et trace l'itinéraire entre eux.
Résultat : formulaire de demande de trajet et carte de réussite
Remarque : le code fourni ci-dessus est un exemple simplifié pour démontrer les fonctionnalités de base de demande de course et de calcul d'itinéraires à l'aide de l'API de TomTom. La mise en œuvre réelle peut différer et inclure des fonctionnalités supplémentaires ou des variantes basées sur des exigences spécifiques. Pour des informations plus détaillées et une utilisation avancée, veuillez vous référer à la documentation officielle du développeur TomTom.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Python est plus facile à apprendre et à utiliser, tandis que C est plus puissant mais complexe. 1. La syntaxe Python est concise et adaptée aux débutants. Le typage dynamique et la gestion automatique de la mémoire le rendent facile à utiliser, mais peuvent entraîner des erreurs d'exécution. 2.C fournit des fonctionnalités de contrôle de bas niveau et avancées, adaptées aux applications haute performance, mais a un seuil d'apprentissage élevé et nécessite une gestion manuelle de la mémoire et de la sécurité.

Est-ce suffisant pour apprendre Python pendant deux heures par jour? Cela dépend de vos objectifs et de vos méthodes d'apprentissage. 1) Élaborer un plan d'apprentissage clair, 2) Sélectionnez les ressources et méthodes d'apprentissage appropriées, 3) la pratique et l'examen et la consolidation de la pratique pratique et de l'examen et de la consolidation, et vous pouvez progressivement maîtriser les connaissances de base et les fonctions avancées de Python au cours de cette période.

Python est meilleur que C dans l'efficacité du développement, mais C est plus élevé dans les performances d'exécution. 1. La syntaxe concise de Python et les bibliothèques riches améliorent l'efficacité du développement. Les caractéristiques de type compilation et le contrôle du matériel de CC améliorent les performances d'exécution. Lorsque vous faites un choix, vous devez peser la vitesse de développement et l'efficacité de l'exécution en fonction des besoins du projet.

Python et C ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1) Python convient au développement rapide et au traitement des données en raison de sa syntaxe concise et de son typage dynamique. 2) C convient à des performances élevées et à une programmation système en raison de son typage statique et de sa gestion de la mémoire manuelle.

PythonlistSaReparmentofthestandardLibrary, tandis que les coloccules de colocède, tandis que les colocculations pour la base de la Parlementaire, des coloments de forage polyvalent, tandis que la fonctionnalité de la fonctionnalité nettement adressée.

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

Les applications de Python en informatique scientifique comprennent l'analyse des données, l'apprentissage automatique, la simulation numérique et la visualisation. 1.Numpy fournit des tableaux multidimensionnels et des fonctions mathématiques efficaces. 2. Scipy étend la fonctionnalité Numpy et fournit des outils d'optimisation et d'algèbre linéaire. 3. Pandas est utilisé pour le traitement et l'analyse des données. 4.Matplotlib est utilisé pour générer divers graphiques et résultats visuels.

Les applications clés de Python dans le développement Web incluent l'utilisation des cadres Django et Flask, le développement de l'API, l'analyse et la visualisation des données, l'apprentissage automatique et l'IA et l'optimisation des performances. 1. Framework Django et Flask: Django convient au développement rapide d'applications complexes, et Flask convient aux projets petits ou hautement personnalisés. 2. Développement de l'API: Utilisez Flask ou DjangorestFramework pour construire RestulAPI. 3. Analyse et visualisation des données: utilisez Python pour traiter les données et les afficher via l'interface Web. 4. Apprentissage automatique et AI: Python est utilisé pour créer des applications Web intelligentes. 5. Optimisation des performances: optimisée par la programmation, la mise en cache et le code asynchrones
