trazar studio simular rutas ruta route puntos programacion hacer google geocercas entre coordenadas con como google-maps google-maps-api-3 google-direction

google-maps - studio - trazar ruta entre dos puntos google maps javascript



Supere 23 puntos de ruta por lĂ­mite de solicitud en la API de Google Directions(Nivel de negocios/trabajo) (5)

Me gustaría utilizar la API de direcciones de google para desarrollar software de planificación de rutas para una empresa que maneja quitanieves en el invierno y paisajismo en el verano. Uno de los requisitos del cliente es que pueda calcular rutas con al menos 30 puntos de referencia (preferiblemente más). De acuerdo con la documentación (citada a continuación), incluso los clientes de Google Maps API for Work están limitados a solo 23 puntos de referencia por solicitud.

El uso de la API de Google Directions está sujeto a un límite de consulta de 2,500 solicitudes de direcciones por día. Las solicitudes de indicaciones individuales pueden contener hasta 8 puntos intermedios intermedios en la solicitud. Los clientes de Google Maps API for Work pueden consultar hasta 100.000 solicitudes de direcciones por día, con hasta 23 puntos de referencia permitidos en cada solicitud.

¿Alguien sabe de una solución alternativa, de cualquier manera, para evitar esto?

Además, ¿podría ser posible utilizar una solución alternativa para la API gratuita? Escuché que las cuentas principales son bastante caras.

¡¡Gracias!! Bagazo


Aquí hay un truco para usar más de 8 puntos de ruta. Por favor, verifique mi solución para eso.

Hoja de ruta de dibujo con más de 8 puntos de referencia usando la API de direcciones de Google


El siguiente código en C # calcula cuántas llamadas hará Google Directions API y cuántos waypoints en cada iteración. Puede modificar Modmin para cambiar los waypoints mínimos que desee en su última iteración.

Por ejemplo, si tiene totalWaypoints.Count = 97:

97 Mod 23 = 5, en este caso quiero un Modmin mayor que 5, por lo que volveré a calcular con waypoints inferioresByIteration;

97 Mod 22 = 9, (9> Modmin), OK;

iteraciones = ((97 - (97% 22)) / (22)) + 1 = 5;

En la última iteración waypointsByIteration será el residuo.

var iterations = 1;//Number of iterations var waypointsByIteration = 23;//Number of waypoints by iteration var modMin = 5;//Minimum of Waypoints in the last iteration var residue = 0;//Residue of the division (totalWaypoints % waypointsByIteration) if (totalWaypoints.Count <= waypointsByIteration) { waypointsByIteration = totalWaypoints.Count; } else { while (totalWaypoints.Count % waypointsByIteration < modMin) { waypointsByIteration--; } //Calculate number of waypoints by iteracoes iterations = ((totalWaypoints.Count - (totalWaypoints.Count % waypointsByIteration)) / (waypointsByIteration)) + 1; } residue = totalWaypoints % waypointsByIteration; for(i=0;i<iterations;i++) { //If it is the last index, the waypointsByIteration will be the residue if(i == iteration - 1) { waypointsByIteration = residue; } }


Hay una solución fácil alrededor de esta solución.

Mantenga los puntos de ruta en conjunto según el valor del umbral de distancia y siga agregándolos. Una vez que alcanza el límite de 8 valores en la matriz, asigne la 1ra posición (Origen) de la matriz de puntos de referencia a una nueva matriz de puntos de ruta ... Asigne el último punto de referencia al nuevo punto de ruta como el 2 ° elemento ... ahora reemplace el antiguo conjunto de waypoints con este nuevo y continuar.

Independientemente de lo que hagas, los waypoints nunca cruzarán más de 8 valores y mantendrán un registro de la ruta utilizada para trazar el mapa (a menos que el viaje sea demasiado largo)

var addWaypoint = function(point) { if($scope.waypoints.length > 8){ var temp = []; temp.push($scope.waypoints[0]); //Start Point temp.push($scope.waypoints[7]); //Last point temp.push(point); //New point $scope.waypoints = temp; //Replace the old object with this new one } else $scope.waypoints.push(point); }


Tiene razón, el precio principal es bastante caro desde $ 10,000, la última vez que hablé con un representante de Google en el teléfono.

Encontré una solución que puse en su lugar de una manera sin pasar por la limitación de 8 waypoints. Pude hacer que funcione.

Hice esto al recibir mis waypoints y dividirlos en diferentes rutas, pero uniéndolos como la misma ruta.

Por ejemplo, si hubiera 30 puntos de referencia necesarios, dibujaría 4 líneas, pero con el mismo color, etc. Por lo tanto, básicamente se cortan los puntos de ruta en diferentes rutas llamando al representador de direcciones cada vez como si fuera una ruta diferente. La clave está después de la primera ruta que la siguiente ruta tiene que comenzar con el último punto de referencia de la ruta anterior (esto asegura que las líneas de ruta estén conectadas entre sí)

Funciona, pero necesita escribir mucho más código de lo que haría si tuviera una cuenta premier, y en este caso está pidiendo instrucciones mucho más.

He buscado y pensado sobre otras formas de hacerlo sin tener una cuenta premier y he fallado.

Aunque, al hablar con google dijeron que tenían la intención de crear una estructura escalonada de pago para clientes con necesidades / necesidades diferentes. Por ejemplo, si un cliente solo necesita más waypts y no un montón más solicitudes de dirección.

Espero que esto ayude, ya que funcionó para mí en una aplicación de práctica.


function initMap() { var service = new google.maps.DirectionsService; var map = new google.maps.Map(document.getElementById(''map'')); // list of points var stations = [ {lat: 48.9812840, lng: 21.2171920, name: ''Station 1''}, {lat: 48.9832841, lng: 21.2176398, name: ''Station 2''}, {lat: 48.9856443, lng: 21.2209088, name: ''Station 3''}, {lat: 48.9861461, lng: 21.2261563, name: ''Station 4''}, {lat: 48.9874682, lng: 21.2294855, name: ''Station 5''}, {lat: 48.9909244, lng: 21.2295512, name: ''Station 6''}, {lat: 48.9928871, lng: 21.2292352, name: ''Station 7''}, {lat: 48.9921334, lng: 21.2246742, name: ''Station 8''}, {lat: 48.9943196, lng: 21.2234792, name: ''Station 9''}, {lat: 48.9966345, lng: 21.2221262, name: ''Station 10''}, {lat: 48.9981191, lng: 21.2271386, name: ''Station 11''}, {lat: 49.0009168, lng: 21.2359527, name: ''Station 12''}, {lat: 49.0017950, lng: 21.2392890, name: ''Station 13''}, {lat: 48.9991912, lng: 21.2398272, name: ''Station 14''}, {lat: 48.9959850, lng: 21.2418410, name: ''Station 15''}, {lat: 48.9931772, lng: 21.2453901, name: ''Station 16''}, {lat: 48.9963512, lng: 21.2525850, name: ''Station 17''}, {lat: 48.9985134, lng: 21.2508423, name: ''Station 18''}, {lat: 49.0085000, lng: 21.2508000, name: ''Station 19''}, {lat: 49.0093000, lng: 21.2528000, name: ''Station 20''}, {lat: 49.0103000, lng: 21.2560000, name: ''Station 21''}, {lat: 49.0112000, lng: 21.2590000, name: ''Station 22''}, {lat: 49.0124000, lng: 21.2620000, name: ''Station 23''}, {lat: 49.0135000, lng: 21.2650000, name: ''Station 24''}, {lat: 49.0149000, lng: 21.2680000, name: ''Station 25''}, {lat: 49.0171000, lng: 21.2710000, name: ''Station 26''}, {lat: 49.0198000, lng: 21.2740000, name: ''Station 27''}, {lat: 49.0305000, lng: 21.3000000, name: ''Station 28''}, ]; // Zoom and center map automatically by stations (each station will be in visible map area) var lngs = stations.map(function(station) { return station.lng; }); var lats = stations.map(function(station) { return station.lat; }); map.fitBounds({ west: Math.min.apply(null, lngs), east: Math.max.apply(null, lngs), north: Math.min.apply(null, lats), south: Math.max.apply(null, lats), }); // Show stations on the map as markers for (var i = 0; i < stations.length; i++) { if (!stations[i].name) continue; new google.maps.Marker({ position: stations[i], map: map, title: stations[i].name }); } // Divide route to several parts because max stations limit is 25 (23 waypoints + 1 origin + 1 destination) for (var i = 0, parts = [], max = 8 - 1; i < stations.length; i = i + max) parts.push(stations.slice(i, i + max + 1)); // Callback function to process service results var service_callback = function(response, status) { if (status != ''OK'') { console.log(''Directions request failed due to '' + status); return; } var renderer = new google.maps.DirectionsRenderer; renderer.setMap(map); renderer.setOptions({ suppressMarkers: true, preserveViewport: true }); renderer.setDirections(response); }; // Send requests to service to get route (for stations count <= 25 only one request will be sent) for (var i = 0; i < parts.length; i++) { // Waypoints does not include first station (origin) and last station (destination) var waypoints = []; for (var j = 1; j < parts[i].length - 1; j++) waypoints.push({location: parts[i][j], stopover: false}); // Service options var service_options = { origin: parts[i][0], destination: parts[i][parts[i].length - 1], waypoints: waypoints, travelMode: ''WALKING'' }; // Send request service.route(service_options, service_callback); } }

html, body { height: 100%; margin: 0; padding: 0; } #map { height: 100%; width: 100%; height: 100%; }

<div id="map"></div> <!-- without API KEY set variable "max" to 8 --> <script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap"></script> <!-- with API KEY set variable "max" to 25 --> <!-- <script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap&key=YOUR_API_KEY"></script>-->

Con el siguiente código, puede usar tantos waypoints como necesite y nunca obtendrá el error MAX_WAYPOINTS_EXCEEDED . No olvides reemplazar "YOUR_API_KEY" en tu API KEY o eliminar & key = YOUR_API_KEY de la API de Google API y establecer la variable "max" en 8 (max = 25 cuando uses API KEY, max = 8 cuando no uses API KEY).

<style> html, body { height: 100%; margin: 0; padding: 0; } #map { height: 100%; width: 100%; height: 100%; } </style> <div id="map"></div> <script> function initMap() { var service = new google.maps.DirectionsService; var map = new google.maps.Map(document.getElementById(''map'')); // list of points var stations = [ {lat: 48.9812840, lng: 21.2171920, name: ''Station 1''}, {lat: 48.9832841, lng: 21.2176398, name: ''Station 2''}, {lat: 48.9856443, lng: 21.2209088, name: ''Station 3''}, {lat: 48.9861461, lng: 21.2261563, name: ''Station 4''}, {lat: 48.9874682, lng: 21.2294855, name: ''Station 5''}, {lat: 48.9909244, lng: 21.2295512, name: ''Station 6''}, {lat: 48.9928871, lng: 21.2292352, name: ''Station 7''}, {lat: 48.9921334, lng: 21.2246742, name: ''Station 8''}, {lat: 48.9943196, lng: 21.2234792, name: ''Station 9''}, {lat: 48.9966345, lng: 21.2221262, name: ''Station 10''}, {lat: 48.9981191, lng: 21.2271386, name: ''Station 11''}, {lat: 49.0009168, lng: 21.2359527, name: ''Station 12''}, {lat: 49.0017950, lng: 21.2392890, name: ''Station 13''}, {lat: 48.9991912, lng: 21.2398272, name: ''Station 14''}, {lat: 48.9959850, lng: 21.2418410, name: ''Station 15''}, {lat: 48.9931772, lng: 21.2453901, name: ''Station 16''}, {lat: 48.9963512, lng: 21.2525850, name: ''Station 17''}, {lat: 48.9985134, lng: 21.2508423, name: ''Station 18''}, {lat: 49.0085000, lng: 21.2508000, name: ''Station 19''}, {lat: 49.0093000, lng: 21.2528000, name: ''Station 20''}, {lat: 49.0103000, lng: 21.2560000, name: ''Station 21''}, {lat: 49.0112000, lng: 21.2590000, name: ''Station 22''}, {lat: 49.0124000, lng: 21.2620000, name: ''Station 23''}, {lat: 49.0135000, lng: 21.2650000, name: ''Station 24''}, {lat: 49.0149000, lng: 21.2680000, name: ''Station 25''}, {lat: 49.0171000, lng: 21.2710000, name: ''Station 26''}, {lat: 49.0198000, lng: 21.2740000, name: ''Station 27''}, {lat: 49.0305000, lng: 21.3000000, name: ''Station 28''}, // ... as many other stations as you need ]; // Zoom and center map automatically by stations (each station will be in visible map area) var lngs = stations.map(function(station) { return station.lng; }); var lats = stations.map(function(station) { return station.lat; }); map.fitBounds({ west: Math.min.apply(null, lngs), east: Math.max.apply(null, lngs), north: Math.min.apply(null, lats), south: Math.max.apply(null, lats), }); // Show stations on the map as markers for (var i = 0; i < stations.length; i++) { new google.maps.Marker({ position: stations[i], map: map, title: stations[i].name }); } // Divide route to several parts because max stations limit is 25 (23 waypoints + 1 origin + 1 destination) for (var i = 0, parts = [], max = 25 - 1; i < stations.length; i = i + max) parts.push(stations.slice(i, i + max + 1)); // Service callback to process service results var service_callback = function(response, status) { if (status != ''OK'') { console.log(''Directions request failed due to '' + status); return; } var renderer = new google.maps.DirectionsRenderer; renderer.setMap(map); renderer.setOptions({ suppressMarkers: true, preserveViewport: true }); renderer.setDirections(response); }; // Send requests to service to get route (for stations count <= 25 only one request will be sent) for (var i = 0; i < parts.length; i++) { // Waypoints does not include first station (origin) and last station (destination) var waypoints = []; for (var j = 1; j < parts[i].length - 1; j++) waypoints.push({location: parts[i][j], stopover: false}); // Service options var service_options = { origin: parts[i][0], destination: parts[i][parts[i].length - 1], waypoints: waypoints, travelMode: ''WALKING'' }; // Send request service.route(service_options, service_callback); } } </script> <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>