Ограничение длины URL Статических карт Google - PullRequest
17 голосов
/ 25 ноября 2010

У меня есть 153 маркера, и мне нужно создать статическую карту с ними, но когда я помещаю их в URL, я получаю сообщение об ошибке, подобное этому:

414 Request-Uri Too Large

Мой URL-адрес выглядит примерно так

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

Спасибо, ребята!

Ответы [ 8 ]

19 голосов
/ 25 ноября 2010

На мой взгляд, вы либо уменьшаете точность ваших маркеров, чтобы получить место в URL. (т.е. маркеры = 13,72326, -86,13155 ----> маркеры = 13,73, -86,14), что приводит к размещению маркеров в сетке ...
Или вы идете с нестатическим API

16 голосов
/ 25 ноября 2010

Этот ответ пришел с Сервера (google). Поэтому вы не можете запрашивать такие длинные URL-адреса.

См. Google Api Doc для получения дополнительной информации:

Статические URL-адреса карты ограничены размером 2048 символов. На практике вам, вероятно, не понадобятся URL-адреса длиннее этого, если только вы не создадите сложные карты с большим количеством маркеров и путей.

4 голосов
/ 16 августа 2013

Вы можете закодировать ваши полилинии и сделать их короче.

Вот пример, который может помочь вам как сократить ваши полилинии

Я использую библиотеку 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^FpLmhAgl@)

Здесь важно отметить, что если вы используете короткий URL, вы должны использовать "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@)

Библиотека доступна и для других языков, если вы не используете php.

Я надеюсь, что это помогает другим

3 голосов
/ 09 сентября 2016

Google недавно расширил предел URL до 8192 , но если вам нужно больше, вам все равно нужно упростить карту или прибегнуть к другим трюкам .

2 голосов
/ 25 ноября 2010

URL-адреса длиной более 2000 символов недействительны. Ваша строка запроса длиннее?

Также смотрите это сообщение

1 голос
/ 04 февраля 2015

Очень старая тема, но мне нужно было что-то собрать, чтобы быстро решить эту проблему.Поделиться здесь на случай, если кто-то еще имел такую ​​же проблему.

Он принимает массив маркеров в виде:

$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 символов, поэтому сначала он снижает точность значения lat lng до $ 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));
}
1 голос
/ 30 ноября 2011

Вы также можете использовать кластеризацию маркеров на статической карте:

http://www.appelsiini.net/projects/php_google_maps/cluster.html

http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps

...