hilo muy antiguo, pero tuve que improvisar algo para abordar este problema en un apuro. Compartir aquí en caso de que alguien más tenga el mismo problema.
Se toma una matriz 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
)
Max longitud url es de 2048 caracteres por lo que primero se reduce la exactitud de la lng lat a $ marker_accuracy (4) a continuación, inicia la eliminación de los marcadores desde la mitad . marcadores de sacarlo del medio podrían mejorarse mucho como lo hace se una 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));
}
y ¿qué ocurre si necesita generar una imagen con una gran cantidad de ubicaciones? (es decir, si quería generar un polígono que representara varios condados de EE. UU.) – PrivateJoker
Estoy tan cansado de las respuestas inútiles de la gente inteligente. ¿Por qué esta respuesta se subió? OBVIAMENTE hay mapas por ahí con más puntos de los que caben en una URL. Esta NO es una respuesta. – Hill
@Hill Answer y upvote pueden ser falsificados. Sabes que la mayoría de las cosas que puedes ver son falsas en lugar de reales: D – Kasnady