Подтвердить что ты не робот

Ограничение длины URL-адреса Google Static Maps

У меня есть 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&......"

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

4b9b3361

Ответ 1

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

Подробнее см. google api doc:

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

Ответ 2

Как я вижу это, вы либо уменьшаете точность своих маркеров, чтобы получить место в URL-адресе.   (т.е. маркеры = 13,72326, -86,13705 ---- > markers = 13,73, -86,14), что приводит к размещению маркеров в сетке...
Или вы идете с нестационарным api

Ответ 3

У меня была такая же проблема,

Я использовал ссылку, как это, и уменьшенная точность позиционирования:

http://maps.googleapis.com/maps/api/staticmap?center=61.52401,105.318756&zoom=2&size=710x400&markers=|59,30|48,44|55,37|55,37|55,37|56,44|56,60|55,49|47,39|57,39|55,37|55,82|47,39|55,37|53,50|51,36|55,37|54,73|45,38|48,44|50,43|46,44|51,42|56,53|59,32|59,30|60,30|59,30|59,28|59,32|59,29|58,31|68,33|56,92|59,38|57,56|55,37|55,36|55,38|55,37|55,38|56,38|55,38|51,46|55,38|45,41|53,49|55,61|50,36|50,36|55,48|55,48|55,49|56,50|56,47|53,91|47,39|57,61|44,37|56,86|55,43|44,41|43,13|43,13|42,13|42,13|57,61|64,40|46,48|55,45|52,47|56,43|54,19|53,83|48,40|54,54|53,58|54,83|59,56|52,85|48,13|55,55|50,12|51,40|56,43|49,40|59,33|37,34|58,33|53,34|54,42|56,30|58,54|54,33|56,60|58,60|57,46|43,44|56,40|49,36|49,32|47,42|59,39|56,35|51,39|55,38|57,45|55,42|56,43|56,43|57,13|56,43|56,44|55,42|55,44|55,42|55,43|54,43|54,44|54,43|56,44|55,45|55,43|57,45|56,43|55,44|57,46|56,45|57,53|60,28&sensor=false

Ответ 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])

Здесь важный момент: если вы используете короткий 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^[email protected])

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

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

Ответ 5

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

Ответ 6

URL-адреса более 2000-ишных символов недопустимы. Является ли ваш запрос более длинным?

Также см. этот пост

Ответ 8

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

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

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

Ответ 9

Официально вы можете использовать 8192 символа

Это зависит от браузера и сервера, но, как правило, 8192 символа должны быть в порядке.

сервераСтатический сервер Карт Google https://maps.googleapis.com/maps/api/staticmap на 30 июля 2019 года.

Документы Google Static Maps утверждают, что:

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

Но на практике я получаю ошибки (413 Слишком большая полезная нагрузка) после отметки 15k ~ символов (30 июля 2019 г.):

╔═════════╦═════════════════╦══════════════════╗
║ Browser ║ Browser Version ║ Valid URL Length ║
╠═════════╬═════════════════╬══════════════════╣
║ Chrome  ║ 75              ║            15489 ║
║ Firefox ║ 68              ║            15761 ║
║ Safari  ║ 12.1            ║            15690 ║
╚═════════╩═════════════════╩══════════════════╝

Это основано на данных, полученных с помощью fetch() в консоли браузера. Я бы предположил, что сервер Google Static Maps принимает запросы (весь запрос, а не просто путь) размером не более 16 КБ.

Решения

Снизить точность

Политика нашей компании заключается в том, что данные координат ниже 6 десятичных знаков (111,32 мм) бесполезны (учитывая, что наша доля на рынке использует телефоны и коммерческие устройства GPS).

const decimalPlaces = 6 // decimal places count
const decimalPowered = 10 ** decimalPlaces // 1_000_000
const trim = number => Math.round(number * decimalPowered) / decimalPowered // function that trims number
const coordinates = [
  [51.838245, -111.834991],
  [51.8331, -111.835],
  [51.831007022306, -111.8232751234],
  [51.838244686875, -111.82327418214]
]
const trimmedCoordinates = coordinates.map(coordinate => coordinate.map(trim))
console.log(trimmedCoordinates)