【问题标题】:Google maps Snap to road demo not working | Google Maps API error: MissingKeyMapError谷歌地图捕捉到道路演示不工作 |谷歌地图 API 错误:MissingKeyMapError
【发布时间】:2018-01-05 18:24:46
【问题描述】:

我正在尝试让here 提供的 Snap to Road 演示工作,但我不断收到错误消息:Google Maps API 错误:MissingKeyMapError。我已经四处搜索,这是谷歌给你的错误,要么不提供密钥,要么提供无效密钥,但即使我生成了一个全新的密钥,它也不起作用。它只是给了我一个空白屏幕。

为什么即使我提供了带有 API 密钥的代码,它还是会抛出这个错误?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>

<head>
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
  <meta charset="utf-8">
  <title>Roads API Demo</title>
  <style>
    html,
    body,
    #map {
      height: 100%;
      margin: 0px;
      padding: 0px
    }
    
    #panel {
      position: absolute;
      top: 5px;
      left: 50%;
      margin-left: -180px;
      z-index: 5;
      background-color: #fff;
      padding: 5px;
      border: 1px solid #999;
    }
    
    #bar {
      width: 240px;
      background-color: rgba(255, 255, 255, 0.75);
      margin: 8px;
      padding: 4px;
      border-radius: 4px;
    }
    
    #autoc {
      width: 100%;
      box-sizing: border-box;
    }
  </style>

  <script src="jquery-3.2.1.js"></script>
  <script src="https://maps.googleapis.com/maps/api/js?libraries=drawing,places"></script>
  <script>
    var apiKey = 'AIzaSyB3kpx3fgR9VT3WL2tp49QrbnyDdgygGeo';

    var map;
    var drawingManager;
    var placeIdArray = [];
    var polylines = [];
    var snappedCoordinates = [];

    function initialize() {
      var mapOptions = {
        zoom: 17,
        center: {
          lat: -33.8667,
          lng: 151.1955
        }
      };
      map = new google.maps.Map(document.getElementById('map'), mapOptions);

      // Adds a Places search box. Searching for a place will center the map on that
      // location.
      map.controls[google.maps.ControlPosition.RIGHT_TOP].push(
        document.getElementById('bar'));
      var autocomplete = new google.maps.places.Autocomplete(
        document.getElementById('autoc'));
      autocomplete.bindTo('bounds', map);
      autocomplete.addListener('place_changed', function() {
        var place = autocomplete.getPlace();
        if (place.geometry.viewport) {
          map.fitBounds(place.geometry.viewport);
        } else {
          map.setCenter(place.geometry.location);
          map.setZoom(17);
        }
      });

      // Enables the polyline drawing control. Click on the map to start drawing a
      // polyline. Each click will add a new vertice. Double-click to stop drawing.
      drawingManager = new google.maps.drawing.DrawingManager({
        drawingMode: google.maps.drawing.OverlayType.POLYLINE,
        drawingControl: true,
        drawingControlOptions: {
          position: google.maps.ControlPosition.TOP_CENTER,
          drawingModes: [
            google.maps.drawing.OverlayType.POLYLINE
          ]
        },
        polylineOptions: {
          strokeColor: '#696969',
          strokeWeight: 2
        }
      });
      drawingManager.setMap(map);

      // Snap-to-road when the polyline is completed.
      drawingManager.addListener('polylinecomplete', function(poly) {
        var path = poly.getPath();
        polylines.push(poly);
        placeIdArray = [];
        runSnapToRoad(path);
      });

      // Clear button. Click to remove all polylines.
      $('#clear').click(function(ev) {
        for (var i = 0; i < polylines.length; ++i) {
          polylines[i].setMap(null);
        }
        polylines = [];
        ev.preventDefault();
        return false;
      });
    }

    // Snap a user-created polyline to roads and draw the snapped path
    function runSnapToRoad(path) {
      var pathValues = [];
      for (var i = 0; i < path.getLength(); i++) {
        pathValues.push(path.getAt(i).toUrlValue());
      }

      $.get('https://roads.googleapis.com/v1/snapToRoads', {
        interpolate: true,
        key: apiKey,
        path: pathValues.join('|')
      }, function(data) {
        processSnapToRoadResponse(data);
        drawSnappedPolyline();
        getAndDrawSpeedLimits();
      });
    }

    // Store snapped polyline returned by the snap-to-road service.
    function processSnapToRoadResponse(data) {
      snappedCoordinates = [];
      placeIdArray = [];
      for (var i = 0; i < data.snappedPoints.length; i++) {
        var latlng = new google.maps.LatLng(
          data.snappedPoints[i].location.latitude,
          data.snappedPoints[i].location.longitude);
        snappedCoordinates.push(latlng);
        placeIdArray.push(data.snappedPoints[i].placeId);
      }
    }

    // Draws the snapped polyline (after processing snap-to-road response).
    function drawSnappedPolyline() {
      var snappedPolyline = new google.maps.Polyline({
        path: snappedCoordinates,
        strokeColor: 'black',
        strokeWeight: 3
      });

      snappedPolyline.setMap(map);
      polylines.push(snappedPolyline);
    }

    // Gets speed limits (for 100 segments at a time) and draws a polyline
    // color-coded by speed limit. Must be called after processing snap-to-road
    // response.
    function getAndDrawSpeedLimits() {
      for (var i = 0; i <= placeIdArray.length / 100; i++) {
        // Ensure that no query exceeds the max 100 placeID limit.
        var start = i * 100;
        var end = Math.min((i + 1) * 100 - 1, placeIdArray.length);

        drawSpeedLimits(start, end);
      }
    }

    // Gets speed limits for a 100-segment path and draws a polyline color-coded by
    // speed limit. Must be called after processing snap-to-road response.
    function drawSpeedLimits(start, end) {
      var placeIdQuery = '';
      for (var i = start; i < end; i++) {
        placeIdQuery += '&placeId=' + placeIdArray[i];
      }

      $.get('https://roads.googleapis.com/v1/speedLimits',
        'key=' + apiKey + placeIdQuery,
        function(speedData) {
          processSpeedLimitResponse(speedData, start);
        }
      );
    }

    // Draw a polyline segment (up to 100 road segments) color-coded by speed limit.
    function processSpeedLimitResponse(speedData, start) {
      var end = start + speedData.speedLimits.length;
      for (var i = 0; i < speedData.speedLimits.length - 1; i++) {
        var speedLimit = speedData.speedLimits[i].speedLimit;
        var color = getColorForSpeed(speedLimit);

        // Take two points for a single-segment polyline.
        var coords = snappedCoordinates.slice(start + i, start + i + 2);

        var snappedPolyline = new google.maps.Polyline({
          path: coords,
          strokeColor: color,
          strokeWeight: 6
        });
        snappedPolyline.setMap(map);
        polylines.push(snappedPolyline);
      }
    }

    function getColorForSpeed(speed_kph) {
      if (speed_kph <= 40) {
        return 'purple';
      }
      if (speed_kph <= 50) {
        return 'blue';
      }
      if (speed_kph <= 60) {
        return 'green';
      }
      if (speed_kph <= 80) {
        return 'yellow';
      }
      if (speed_kph <= 100) {
        return 'orange';
      }
      return 'red';
    }
    $(window).on('load', function() {
      initialize
    });
  </script>
</head>

<body>
  <div id="map"></div>
  <div id="bar">
    <p class="auto"><input type="text" id="autoc" /></p>
    <p><a id="clear" href="#">Click here</a> to clear map.</p>
  </div>
</body>

</html>

【问题讨论】:

    标签: google-maps


    【解决方案1】:

    如果您没有 API KEY: 加载 API 的脚本元素缺少必需的身份验证参数。如果您使用的是标准 Maps JavaScript API,则必须使用带有有效 API 密钥的密钥参数。

    第 1 步:从此 URL 获取密钥

    https://developers.google.com/maps/documentation/javascript/get-api-key

    第 2 步:将您的脚本包含在 API KEY 中

    <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
      type="text/javascript"></script>
    

    或者替换

     var apiKey = 'YOUR_API_KEY';
    

    如果您有 API KEY Google 地图 Snap to Road 演示

    完整代码

     html, body, #map {
            height: 100%;
            margin: 0px;
            padding: 0px
          }
    
          #panel {
            position: absolute;
            top: 5px;
            left: 50%;
            margin-left: -180px;
            z-index: 5;
            background-color: #fff;
            padding: 5px;
            border: 1px solid #999;
          }
    
          #bar {
            width: 240px;
            background-color: rgba(255, 255, 255, 0.75);
            margin: 8px;
            padding: 4px;
            border-radius: 4px;
          }
    
          #autoc {
            width: 100%;
            box-sizing: border-box;
          }
    <!DOCTYPE html>
    <html>
      <head>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
        <meta charset="utf-8">
        <title>Roads API Demo</title>
        <script       src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <script src="/_static/js/jquery-bundle.js"></script>
        <script
          src="https://maps.googleapis.com/maps/api/js?libraries=drawing,places"></script>
        <script>
    var apiKey = 'AIzaSyB3kpx3fgR9VT3WL2tp49QrbnyDdgygGeo';
    
    var map;
    var drawingManager;
    var placeIdArray = [];
    var polylines = [];
    var snappedCoordinates = [];
    
    function initialize() {
      var mapOptions = {
        zoom: 17,
        center: {lat: -33.8667, lng: 151.1955}
      };
      map = new google.maps.Map(document.getElementById('map'), mapOptions);
    
      // Adds a Places search box. Searching for a place will center the map on that
      // location.
      map.controls[google.maps.ControlPosition.RIGHT_TOP].push(
          document.getElementById('bar'));
      var autocomplete = new google.maps.places.Autocomplete(
          document.getElementById('autoc'));
      autocomplete.bindTo('bounds', map);
      autocomplete.addListener('place_changed', function() {
        var place = autocomplete.getPlace();
        if (place.geometry.viewport) {
          map.fitBounds(place.geometry.viewport);
        } else {
          map.setCenter(place.geometry.location);
          map.setZoom(17);
        }
      });
    
      // Enables the polyline drawing control. Click on the map to start drawing a
      // polyline. Each click will add a new vertice. Double-click to stop drawing.
      drawingManager = new google.maps.drawing.DrawingManager({
        drawingMode: google.maps.drawing.OverlayType.POLYLINE,
        drawingControl: true,
        drawingControlOptions: {
          position: google.maps.ControlPosition.TOP_CENTER,
          drawingModes: [
            google.maps.drawing.OverlayType.POLYLINE
          ]
        },
        polylineOptions: {
          strokeColor: '#696969',
          strokeWeight: 2
        }
      });
      drawingManager.setMap(map);
    
      // Snap-to-road when the polyline is completed.
      drawingManager.addListener('polylinecomplete', function(poly) {
        var path = poly.getPath();
        polylines.push(poly);
        placeIdArray = [];
        runSnapToRoad(path);
      });
    
      // Clear button. Click to remove all polylines.
      $('#clear').click(function(ev) {
        for (var i = 0; i < polylines.length; ++i) {
          polylines[i].setMap(null);
        }
        polylines = [];
        ev.preventDefault();
        return false;
      });
    }
    
    // Snap a user-created polyline to roads and draw the snapped path
    function runSnapToRoad(path) {
      var pathValues = [];
      for (var i = 0; i < path.getLength(); i++) {
        pathValues.push(path.getAt(i).toUrlValue());
      }
    
      $.get('https://roads.googleapis.com/v1/snapToRoads', {
        interpolate: true,
        key: apiKey,
        path: pathValues.join('|')
      }, function(data) {
        processSnapToRoadResponse(data);
        drawSnappedPolyline();
        getAndDrawSpeedLimits();
      });
    }
    
    // Store snapped polyline returned by the snap-to-road service.
    function processSnapToRoadResponse(data) {
      snappedCoordinates = [];
      placeIdArray = [];
      for (var i = 0; i < data.snappedPoints.length; i++) {
        var latlng = new google.maps.LatLng(
            data.snappedPoints[i].location.latitude,
            data.snappedPoints[i].location.longitude);
        snappedCoordinates.push(latlng);
        placeIdArray.push(data.snappedPoints[i].placeId);
      }
    }
    
    // Draws the snapped polyline (after processing snap-to-road response).
    function drawSnappedPolyline() {
      var snappedPolyline = new google.maps.Polyline({
        path: snappedCoordinates,
        strokeColor: 'black',
        strokeWeight: 3
      });
    
      snappedPolyline.setMap(map);
      polylines.push(snappedPolyline);
    }
    
    // Gets speed limits (for 100 segments at a time) and draws a polyline
    // color-coded by speed limit. Must be called after processing snap-to-road
    // response.
    function getAndDrawSpeedLimits() {
      for (var i = 0; i <= placeIdArray.length / 100; i++) {
        // Ensure that no query exceeds the max 100 placeID limit.
        var start = i * 100;
        var end = Math.min((i + 1) * 100 - 1, placeIdArray.length);
    
        drawSpeedLimits(start, end);
      }
    }
    
    // Gets speed limits for a 100-segment path and draws a polyline color-coded by
    // speed limit. Must be called after processing snap-to-road response.
    function drawSpeedLimits(start, end) {
        var placeIdQuery = '';
        for (var i = start; i < end; i++) {
          placeIdQuery += '&placeId=' + placeIdArray[i];
        }
    
        $.get('https://roads.googleapis.com/v1/speedLimits',
            'key=' + apiKey + placeIdQuery,
            function(speedData) {
              processSpeedLimitResponse(speedData, start);
            }
        );
    }
    
    // Draw a polyline segment (up to 100 road segments) color-coded by speed limit.
    function processSpeedLimitResponse(speedData, start) {
      var end = start + speedData.speedLimits.length;
      for (var i = 0; i < speedData.speedLimits.length - 1; i++) {
        var speedLimit = speedData.speedLimits[i].speedLimit;
        var color = getColorForSpeed(speedLimit);
    
        // Take two points for a single-segment polyline.
        var coords = snappedCoordinates.slice(start + i, start + i + 2);
    
        var snappedPolyline = new google.maps.Polyline({
          path: coords,
          strokeColor: color,
          strokeWeight: 6
        });
        snappedPolyline.setMap(map);
        polylines.push(snappedPolyline);
      }
    }
    
    function getColorForSpeed(speed_kph) {
      if (speed_kph <= 40) {
        return 'purple';
      }
      if (speed_kph <= 50) {
        return 'blue';
      }
      if (speed_kph <= 60) {
        return 'green';
      }
      if (speed_kph <= 80) {
        return 'yellow';
      }
      if (speed_kph <= 100) {
        return 'orange';
      }
      return 'red';
    }
    
    $(window).load(initialize);
    
        </script>
      </head>
    
      <body>
        <div id="map"></div>
        <div id="bar">
          <p class="auto"><input type="text" id="autoc"/></p>
          <p><a id="clear" href="#">Click here</a> to clear map.</p>
        </div>
      </body>
    </html>

    【讨论】:

    • 我按照 snap to road page 上的步骤进行操作。从您刚刚给我的确切链接中获得了密钥,但我仍然得到相同的结果。我到底错过了什么?
    • 检查我附加的sn-p。我引用了以下 URL developers.google.com/maps/documentation/roads/snap#demo
    • 如果我复制您的确切代码,它仍然无法正常工作。即使它适用于 sn-p
    • 在您的源代码中可能有其他东西阻止了它。可以是一些导入,其他脚本
    • 会不会是我在本地托管?
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2016-05-09
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多