Ограничение длины 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&......"
Спасибо, ребята!
Ответы
Ответ 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-ишных символов недопустимы. Является ли ваш запрос более длинным?
Также см. этот пост
Ответ 7
Вы также можете использовать кластер кластеров на статической карте:
http://www.appelsiini.net/projects/php_google_maps/cluster.html
http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps
Ответ 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)