javascript - script - Límite de longitud de la URL de Google Static Maps
google maps script (8)
Esta respuesta vino del servidor (google). Por lo tanto, no está permitido solicitar URL tan largas.
Ver el google api doc para más información:
Las URL de los mapas estáticos están restringidas a 2048 caracteres de tamaño. En la práctica, es probable que no necesite las URL más largas, a menos que produzca mapas complicados con un gran número de marcadores y rutas.
Tengo 153 marcadores y necesito generar un mapa estático con ellos, pero cuando los coloco en la url obtengo un error como este:
414 Request-Uri Too Large
Mi url es algo como esto
"http://maps.google.com/maps/api/staticmap?center=13.00,-85.00&size=600x500&maptype=roadmap&markers=13.305,-86.18636&markers=13.72326,-86.13705&......"
¡Gracias amigos!
Hilo muy viejo, pero tuve que improvisar algo para abordar este mismo problema a toda prisa. Compartiendo aquí en caso de que alguien más tenga el mismo problema.
Toma una serie de marcadores en la forma:
$points =
[0] => Array
(
[lat] => 52.1916312
[lng] => -1.7083109
)
[1] => Array
(
[lat] => 50.2681918
[lng] => 2.5616710
)
...
...
...
[500] => Array
(
[lat] => 49.1821968
[lng] => 2.1671056
)
La longitud máxima de la url es de 2048 caracteres, por lo que primero reduce la precisión del tiempo de espera a $ marker_accuracy (4) y luego comienza a eliminar los marcadores del medio. La eliminación de marcadores del medio podría mejorarse mucho, ya que lo hace uno a la vez
$map_url = make_static_map($points);
function make_static_map($points,$reduce_len=false,$reduce_count=false){
$grp_points = array();
$grps = array();
$url = array();
$max_len = 0;
$width = 640; //max 640 :(
$height = 640; //max 640 :(
$marker_accuracy = 4; //Lat lng to 4 decimal places minimum, 3 would be less accurate
$url[] = ''http://maps.googleapis.com/maps/api/staticmap?'';
$url[] = ''&size=''.$width.''x''.$height.''&scale=2'';
$url[] = ''&markers='';
if($reduce_count){ //Last resort to shortening this
array_splice($points, ceil(count($points)/2), 1);
}
foreach($points as $i => $point){
if($reduce_len){
$point[''lat''] = number_format($point[''lat''], $reduce_len, ''.'', '''');
$points[$i][''lat''] = $point[''lat''];
$point[''lng''] = number_format($point[''lng''], $reduce_len, ''.'', '''');
$points[$i][''lng''] = $point[''lng''];
}else{
$t_len = max(strlen($point[''lat'']),strlen($point[''lng'']));
if($t_len>$max_len){
$max_len = $t_len;
}
}
$grps[] = array($point[''lat''],$point[''lng'']);
}
$grps = remove_duplicate_points($grps);
foreach($grps as $grp){
$grp_points[] = implode('','',$grp);
}
$url[] = implode(''|'',$grp_points);
$url[] = ''&sensor=false'';
$url = implode('''',$url);
if(strlen($url) > 2048){
// Bugger, too long for google
if($max_len>$marker_accuracy){
// Reduce the length of lat lng decimal places
return(make_static_map($points,$max_len-1,false));
}else{
// Reduce the number of lat lng markers (from center)
return(make_static_map($points,false,true));
}
}else{
return($url);
}
}
function remove_duplicate_points($points){
$points = array_map(''serialize'', $points);
$points = array_unique($points);
return(array_map(''unserialize'', $points));
}
La forma en que lo veo es que reduce la precisión de sus marcadores para ganar espacio en la URL. (es decir, marcadores = 13.72326, -86.13705 ----> marcadores = 13.73, -86.14) dando como resultado la colocación de los marcadores en una cuadrícula ...
O vas con una api no estática
Las URL de más de 2000 caracteres ish no son válidas. ¿Es tu cadena de consulta más larga que eso?
También vea este post
Puedes codificar tus polilíneas y hacerlas más cortas.
Este es el ejemplo que puede ayudarlo a reducir sus Polilíneas.
Estoy usando la biblioteca php para acortar la longitud aquí está el enlace de la biblioteca https://github.com/danmandle/encoded-polyline-stitcher
si usas esta biblioteca
(51.838245,-111.834991|51.833179,-111.83503|51.831007022306,-111.8232751234|51.838244686875,-111.82327418214) = (atk{HtwqiTt^FpLmhAgl@)
Aquí el punto importante es que si usa una URL corta, tiene que usar la palabra clave "enc:"
(fillcolor:0xAA000033|color:0xFFFFFF00|51.838245,-111.834991|51.833179,-111.83503|51.831007022306,-111.8232751234|51.838244686875,-111.82327418214) = (fillcolor:0xAA000033|color:0xFFFFFF00|enc:atk{HtwqiTt^FpLmhAgl@)
La biblioteca también está disponible para otros idiomas si no está utilizando php.
Espero que ayude a los demás.
Recientemente, Google extendió el límite de URL a 8192 , pero si necesita más que eso, todavía necesita simplificar su mapa o recurrir a otros tricks .
También puede utilizar la agrupación de marcadores en un mapa estático:
http://www.appelsiini.net/projects/php_google_maps/cluster.html
http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps