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>