19

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

ありがとう!

4

10 に答える 10

20

URLのスペースを確保するために、マーカーの精度を下げているようです。(つまり、markers=13.72326,-86.13705---->markers=13.73,-86.14) マーカーをグリッドに配置することになり
ます...または、非静的 API を使用します

于 2010-11-25T15:13:35.300 に答える
13

この応答はサーバー (google) からのものです。したがって、そのような長い URL を要求することはできません。

詳細については、Google API ドキュメントを参照してください。

静的マップ URL のサイズは 2048 文字に制限されています。実際には、多数のマーカーとパスを含む複雑なマップを作成しない限り、おそらくこれより長い URL は必要ありません。

于 2010-11-25T14:41:57.417 に答える
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^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 を使用していない場合、ライブラリは他の言語でも利用できます。

それが他の人に役立つことを願っています

于 2013-08-16T15:14:53.780 に答える
2

2000 文字を超える URL は無効です。あなたのクエリ文字列はそれよりも長いですか?

こちらの投稿もご覧ください

于 2010-11-25T14:42:09.980 に答える
1

静的マップでマーカー クラスタリングを使用することもできます。

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

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

于 2011-11-30T18:23:17.017 に答える
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) に下げてから、中間からマーカーを削除し始めます。途中からマーカーを削除すると、一度に1つずつ削除されるため、大幅に改善される可能性があります

$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));
}
于 2015-02-04T18:07:14.890 に答える