You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript调用Google地图无法显示,含绘制保存线条功能的问题求助

问题排查与修复方案

以下是导致地图无法显示的核心问题:

  • 脚本加载顺序错误:谷歌地图JS SDK的引入位置放在了调用地图API的代码之后,执行地图相关逻辑时google全局对象尚未加载,直接触发引用错误。同时全局声明new google.maps.InfoWindow()的代码在谷歌SDK加载前就执行,也会直接报错。
  • 执行时机错误:initialize()函数在页面DOM未完成渲染时就直接调用,此时id为map_canvas的DOM节点还不存在,地图无法挂载到对应节点上。
  • HTML标签结构错误:代码缺少</head>闭合标签、<body>起始标签,标签不完整会导致浏览器渲染异常。
  • CSS选择器不匹配:样式表中写的是#map-canvas(中横线),但实际地图容器ID是map_canvas(下划线),样式无法生效。
修复后完整代码
<!DOCTYPE html>
<html>
<head>
    <title>Draw </title>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <style>
    html,
    body,
    #map_canvas {
      height: 90%;
      margin: 0px;
      padding: 0px
    }
    </style>
    <!-- 谷歌地图SDK提前引入,添加callback参数,加载完成后自动调用初始化函数 -->
    <script src="https://maps.googleapis.com/maps/api/js?key=替换为你自己的API密钥&libraries=drawing&callback=initialize" async defer></script>
<script type="text/javascript">
            var map; // Global declaration of the map
            var iw; // 仅声明,初始化放到谷歌SDK加载完成后执行
            var lat_longs = new Array();
            var markers = new Array();
            var drawingManager;
            function initialize() {
                // 初始化放到这里,保证google对象已经存在
                iw = new google.maps.InfoWindow();
                var myLatlng = new google.maps.LatLng(40.9403762, -74.1318096);
                var myOptions = {
                    zoom: 13,
                    center: myLatlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                }
                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
                drawingManager = new google.maps.drawing.DrawingManager({
                    drawingMode: google.maps.drawing.OverlayType.POLYGON,
                    drawingControl: true,
                    drawingControlOptions: {
                        position: google.maps.ControlPosition.TOP_CENTER,
                        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
                    },
                    polygonOptions: {
                        editable: true
                    }
                });
                drawingManager.setMap(map);
            
                google.maps.event.addListener(drawingManager, "overlaycomplete", function(event) {
                    var newShape = event.overlay;
                    newShape.type = event.type;
                });

                google.maps.event.addListener(drawingManager, "overlaycomplete", function(event){
                    overlayClickListener(event.overlay);
                    $('#vertices').val(event.overlay.getPath().getArray());
                });
        }
        function overlayClickListener(overlay) {
            google.maps.event.addListener(overlay, "mouseup", function(event){
                $('#vertices').val(overlay.getPath().getArray());
            });
        }

        $(function(){
            $('#save').click(function(){
                // 此处添加保存逻辑
            });
        });
</script>
</head>
<!-- 补全body标签 -->
<body>
<div id="map_canvas" style="width:500px; height:450px;"></div>
<form method="post" accept-charset="utf-8" id="map_form">
    <input type="text" name="vertices" value="" id="vertices"  />
    <input type="button" name="save" value="Save!" id="save"  />
</form>
</body>
</html>

使用时只需将代码中替换为你自己的API密钥的位置替换为你申请的谷歌地图API密钥即可正常运行。

内容的提问来源于stack exchange,提问作者Sam Summers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:36:03