google maps API - "toGeoJson"返回几何为null的对象

Boa*_*ari 0 javascript google-maps geojson google-maps-api-3 google-maps-drawing

我正在使用谷歌地图绘图图层(库)在我的地图上绘制形状.

完成绘制所有形状后,我将从谷歌地图api中调用"toGeoJson"功能.

我收到的对象看起来像这样:

调用"toGeoJSON"时收到的对象

我无法弄清楚我做错了什么.

我只是想从地图上绘制的形状中创建一个GeoJson.

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

geo*_*zip 8

绘图管理器toGeoJSON上没有方法,只存在于Data类中

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

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

要防止将重复对象添加到地图,请使用单独的Data对象,而不是地图上的对象.

概念证明小提琴

(相关问题中的一些代码:从Google地图导出geoJSON数据)

代码段:

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 https://stackoverflow.com/questions/25072069/export-geojson-data-from-google-maps
  // 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);
Run Code Online (Sandbox Code Playgroud)
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

#map {
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)