google 映射 API - "toGeoJson" returns 几何对象为空

google maps API - "toGeoJson" returns object with geometry null

我正在使用 google 地图绘图层(库)在我的地图上绘制形状。

绘制完所有形状后,我从 google 地图调用 "toGeoJson" 函数 api。

我收到的对象是这样的:

object received when calling "toGeoJSON"

我不知道我做错了什么。

我只是想根据地图上绘制的形状创建一个 GeoJson。

我没有粘贴任何代码,因为绘图部分全部由绘图库完成,"toGeoJson" 功能由 google 地图完成 API.

drawing manager, that only exists on the Data class

上没有 toGeoJSON 方法

使用绘图管理器在地图上绘制对象不会将它们添加到 DataLayer。

您可以将绘图管理器中的对象添加到数据层,然后对其调用 toGeoJson

为防止向地图添加重复对象,请使用单独的数据对象,而不是地图上的对象。

proof of concept fiddle

(相关问题的一些代码:Export geoJSON data from Google Maps

代码片段:

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: -34.397,
      lng: 150.644
    },
    zoom: 8
  });

  var drawingManager = new google.maps.drawing.DrawingManager({
    drawingMode: google.maps.drawing.OverlayType.MARKER,
    drawingControl: true,
    drawingControlOptions: {
      position: google.maps.ControlPosition.TOP_CENTER,
      drawingModes: [
        google.maps.drawing.OverlayType.MARKER,
        google.maps.drawing.OverlayType.CIRCLE,
        google.maps.drawing.OverlayType.POLYGON,
        google.maps.drawing.OverlayType.POLYLINE,
        google.maps.drawing.OverlayType.RECTANGLE
      ]
    },
    markerOptions: {
      icon: 'https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png'
    },
    circleOptions: {
      fillColor: '#ffff00',
      fillOpacity: 1,
      strokeWeight: 5,
      clickable: false,
      editable: true,
      zIndex: 1
    }
  });
  drawingManager.setMap(map);
  var dataLayer = new google.maps.Data();
  // from 
  // from http://jsfiddle.net/doktormolle/5F88D/
  google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
    switch (event.type) {
      case google.maps.drawing.OverlayType.MARKER:


        dataLayer.add(new google.maps.Data.Feature({
          geometry: new google.maps.Data.Point(event.overlay.getPosition())
        }));
        break;
      case google.maps.drawing.OverlayType.RECTANGLE:
        var b = event.overlay.getBounds(),
          p = [b.getSouthWest(), {
              lat: b.getSouthWest().lat(),
              lng: b.getNorthEast().lng()
            },
            b.getNorthEast(), {
              lng: b.getSouthWest().lng(),
              lat: b.getNorthEast().lat()
            }
          ]
        dataLayer.add(new google.maps.Data.Feature({
          geometry: new google.maps.Data.Polygon([p])
        }));
        break;
      case google.maps.drawing.OverlayType.POLYGON:
        dataLayer.add(new google.maps.Data.Feature({
          geometry: new google.maps.Data.Polygon([event.overlay.getPath().getArray()])
        }));
        break;
      case google.maps.drawing.OverlayType.POLYLINE:
        dataLayer.add(new google.maps.Data.Feature({
          geometry: new google.maps.Data.LineString(event.overlay.getPath().getArray())
        }));
        break;
      case google.maps.drawing.OverlayType.CIRCLE:
        dataLayer.add(new google.maps.Data.Feature({
          properties: {
            radius: event.overlay.getRadius()
          },
          geometry: new google.maps.Data.Point(event.overlay.getCenter())
        }));
        break;
    }
  });
  google.maps.event.addDomListener(document.getElementById('save'), 'click', function() {
    dataLayer.toGeoJson(function(obj) {
      document.getElementById('geojson').innerHTML = JSON.stringify(obj);
    });
  })
}
google.maps.event.addDomListener(window, 'load', initMap);
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

#map {
  height: 100%;
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=drawing&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
<input id="save" value="save" type="button" />
<div id="geojson"></div>
<div id="map"></div>