打印和许多谷歌地图(api)

时间:2015-05-26 08:44:11

标签: javascript php jquery google-maps google-maps-api-3

我想我在这里已经过了头,但我已经接近完成所以我希望你能帮我一臂之力。

我制作了一个Web应用程序来处理活动邀请。它管理邀请并将人们聚集在一起,并安排所有需要通过事件说明发送给每个参与者的信件。

在最好的情况下,我希望这封信还包含一个谷歌地图,该地图会将参与者指向事件的正确地址(地址不固定,但会根据参与者和时间而变化)。

我使用可打印的网页创建字母,生成大约180页。 谷歌地图正在运行,但是大约15-20页后方向停止,只显示瑞典的图片。

以下示例代码已简化,但会产生同样的问题。任何提示我可以做什么来让所有180张地图正确绘制? 如果加载整个页面需要1分钟,对我来说无关紧要。

(我正在做小提琴的错误,所以它不会在下面迭代,但你明白了)

$(document).ready(function() {

  $maps = $('.googleMap');
  $maps.each(function(index, Element) {

    $infotext = $(Element).children('.infotext');
    var directionsDisplay;
    var directionsService = new google.maps.DirectionsService();
    var map;

    directionsDisplay = new google.maps.DirectionsRenderer();

    var begin = new google.maps.LatLng(60.216667, 16.333333);
    var mapOptions = {
      zoom: 6,
      center: begin 
    }

    map = new google.maps.Map(Element, mapOptions);
    directionsDisplay.setMap(map);

    var start = $infotext.children('.address_start').text() + ', ' + $infotext.children('.city_start').text() + ', ' + $infotext.children('.zip_start').text() + ', ' + $infotext.children('.country_start').text();
    var end = $infotext.children('.address_end').text() + ', ' + $infotext.children('.city_end').text() + ', ' + $infotext.children('.zip_end').text() + ', ' + $infotext.children('.country_end').text();

    var request = {
      origin: start,
      destination: end,
      optimizeWaypoints: false,
      travelMode: google.maps.TravelMode.BICYCLING
    };

    directionsService.route(request, function(response, status) {
      if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(response);
        var route = response.routes[0];
      }
    });
  });
});
body {
  font-family: "Open Sans", sans-serif;
  font-size: 13px;
  line-height: 1.62em;
}
.page {
  width: 210mm;
  min-height: 297mm;
  padding: 20mm;
  margin: 10mm auto;
  border: 1px #D3D3D3 solid;
  border-radius: 5px;
  background: white;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
.pageHeader {
  margin-bottom: 150px;
}
.pageMark {
  float: right;
  font-size: 0.8em;
}
@page {
  size: A4;
  margin: 0;
}
@media print {
  html,
  body {
    width: 210mm;
    height: 297mm;
  }
  .page {
    margin: 0;
    border: initial;
    border-radius: initial;
    width: initial;
    min-height: initial;
    box-shadow: initial;
    background: initial;
    page-break-after: always;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="http://maps.googleapis.com/maps/api/js"></script>

<body>
  <?php for($i=0;$i<20;$i++){ ?>
  <div class="page">
    <div style="width:100%;height:500px;" class="googleMap">
      <div class="infotext">
        <div class="city_start">Stockholm</div>
        <div class="country_start">Sverige</div>
        <div class="city_end">Göteborg</div>
        <div class="country_end">Sverige</div>
      </div>
    </div>
  </div>
  <br>
  <?php } ?>
</body>

1 个答案:

答案 0 :(得分:0)

当您在短时间内查询服务器次数太多时,Google不喜欢它。它们的速率限制为每秒不超过10个请求。 Check out their usage limits

使用您的代码,您几乎在同一时间尝试获取每张地图的路线。

试试这个有效的JsFiddle(至少对我而言)

我会每隔1到5秒将查询限制为1。在我的例子中,我在请求之间等待2秒。

这是您更新的代码:

$(document).ready(function() {

    // Set the time to wait between requests
    var increment = 2000;

    // Added this line to keep track of the timeout
    var timeout = 0;

    $maps = $('.googleMap');
    $maps.each(function (index, Element) {

        // Add more timeout
        timeout += increment;

        // Set a timeout before we initialize each map
        setTimeout(function () {

            $infotext = $(Element).children('.infotext');
            var directionsDisplay;
            var directionsService = new google.maps.DirectionsService();
            var map;

            directionsDisplay = new google.maps.DirectionsRenderer();

            var begin = new google.maps.LatLng(60.216667, 16.333333);
            var mapOptions = {
                zoom: 6,
                center: begin
            }

            map = new google.maps.Map(Element, mapOptions);
            directionsDisplay.setMap(map);

            var start = $infotext.children('.address_start').text() + ', ' + $infotext.children('.city_start').text() + ', ' + $infotext.children('.zip_start').text() + ', ' + $infotext.children('.country_start').text();
            var end = $infotext.children('.address_end').text() + ', ' + $infotext.children('.city_end').text() + ', ' + $infotext.children('.zip_end').text() + ', ' + $infotext.children('.country_end').text();

            var request = {
                origin: start,
                destination: end,
                optimizeWaypoints: false,
                travelMode: google.maps.TravelMode.BICYCLING
            };

            directionsService.route(request, function (response, status) {
                if (status == google.maps.DirectionsStatus.OK) {
                    directionsDisplay.setDirections(response);
                    var route = response.routes[0];
                }
            });
        }, timeout);
    });

});