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