17

我有153个标记和需要生成与他们的静态地图,但是当URL把他们我得到一个错误这样的:谷歌静态地图网址长度上限

414 Request-Uri Too Large 

我的网址是这样

"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&......" 

谢谢大家!

回答

15

此响应来自服务器(谷歌)。所以你不能请求这么长的网址。

中查看相关信息的谷歌API文档:

静态地图网址被限制在大小2048个字符。实际上,除非您生成具有大量标记和路径的复杂地图,否则您可能不需要比这更长的URL。

+1

以及如果您需要生成具有大量位置的图像,该怎么办? (即如果我想生成一个代表几个美国县的多边形) – PrivateJoker 2015-12-07 17:27:00

+4

我很厌倦人们的聪明屁股,毫无意义的答案。为什么这个答案得到upvoted?明显的是,地图上有更多的点,而不是可以放在URL中。这不是一个答案。 – Hill 2016-01-07 22:20:44

+0

@Hill答案和upvote可以伪造。你知道你能看到的大部分东西都是虚假的,而不是真正的东西:D – Kasnady 2017-07-11 00:31:15

2

超过2000字符的网址无效。你的查询字符串比那个更长吗?

也看到这个post

18

我看它是不是你减少要想在URL获得空间,将标记的精度方式。 (即标志= 13.72326,-86.13705 ---->标记= 13.73,-86.14),导致放置标记在网格...
或者你去一个非静态API

+0

这就是我最终做的 - 在PHP中使用精确到小数点后六位的凑整真的缩短了我的东西。 – 2014-09-01 17:56:17

5
4

可以编码您的折线,使他们更短。

这里是一个可以帮助你如何在很短的折线

我使用PHP库短长度 这里是图书馆https://github.com/danmandle/encoded-polyline-stitcher

的链接,如果你使用这个库的例子

(51.838245,-111.834991|51.833179,-111.83503|51.831007022306,-111.8232751234|51.838244686875,-111.82327418214) = (atk{HtwqiTt^[email protected]) 

这里很重要的一点是,如果你使用短网址,你必须使用“ENC:” keywor d

(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^[email protected]) 

该库可用于其他语言,如果你不使用PHP。

我希望它可以帮助别人

1

很老的线程,但我必须凑齐一些急于解决这个问题非常。如果有其他人遇到同样的问题,请在此分享。

它需要标记的阵列形式:

$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 
      ) 

最大URL长度为2048个字符,从而它首先降低了纬度经度的精度 $ marker_accuracy(4)然后开始从中间去除标记。因为它 它一次一个

$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)); 
} 
2

谷歌最近延长了URL限制8192 从中间删除标记可以提高了很多,但如果你需要更多的,您还是需要简化地图或其他tricks