从Google地图提取折线到GeoJSON

nib*_*org 0 javascript google-maps google-maps-api-3

我有一张Google地图。用户单击时,将放置一个“开始”标记。第二次单击将在第一次单击和第二次单击之间产生一条折线,并添加一个“结束”标记。第三次单击将另一个数据点添加到折线,并将“结束”标记移至最近的单击。没什么特别的:

map = new google.maps.Map(document.getElementById('map'), {
            center: {lat: -34.397, lng: 150.644},
            zoom: 13
});
map.addListener('click', insertDataPoint);

polyline = new google.maps.Polyline({
            strokeColor: '#000000',
            strokeOpacity: 0.7,
            strokeWeight: 3
}); 
polyline.setMap(map);

plots = [];

... // Bunch of other code that isn't important

function insertDataPoint(e) {   
    var path = polyline.getPath();
    path.push(e.latLng);

    // Logic to set up marker or circle 
    if (plots.length == 0) {
        // Case: first click
        startMarker.setPosition(e.latLng);
        startMarker.setMap(map);
        plots.push(startMarker);                        

    } else {
        if (plots.length != 1) {
            // Case: we have intermediate points between start and end
            var plot = plots.pop();

            var marker = new google.maps.Marker({
                position: plot.getPosition(),
                icon: {
                    path: google.maps.SymbolPath.CIRCLE,
                    fillColor: '#ffffff',
                    fillOpacity: 0.6,
                    strokeColor: '#ffffff',
                    strokeOpacity: 0.8,
                    strokeWeight: 2,
                    scale: 3
                }
            });
            marker.setMap(map);
            plots.push(marker);
        }
        // Case: add an end marker
        endMarker.setPosition(e.latLng);
        if (plots.length == 1) {
            endMarker.setMap(map);
        }
        plots.push(endMarker);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想以GeoJSON格式获取标绘点。我知道Google最近通过.toGeoJson()调用发布了数据层API,但是自然地,数据为空,因为它没有添加到数据层:

map.data.toGeoJson( function(data) {
    alert(JSON.stringify(data)); // {"type":"FeatureCollections", "features":[]}
Run Code Online (Sandbox Code Playgroud)

所以问题是如何将我的数据(标记和折线)添加到数据层,以便获得甜美的GeoJSON?

注意-我了解数据层具有允许用户在地图上绘制的功能,但我需要自己做。

geo*_*zip 5

这将创建代表折线的geoJSON并将其添加到数据层:

function exportGeoJson() {
    var geoJson = {
        "type": "FeatureCollection",
            "features": []
    };
    var polylineFeature = {
        "type": "Feature",
            "geometry": {
            "type": "LineString",
                "coordinates": []
        },
            "properties": {}
    };
    for (var i = 0; i < polyline.getPath().getLength(); i++) {
        var pt = polyline.getPath().getAt(i);
        polylineFeature.geometry.coordinates.push([
        pt.lng(), pt.lat()]);
    }
    geoJson.features.push(polylineFeature);
    document.getElementById('geojson').value = JSON.stringify(geoJson);
    polyline.setPath([]);
    map.data.addGeoJson(geoJson);
    // Set the stroke width, and fill color for each polygon
    map.data.setStyle({
        strokeColor: 'green',
        strokeWeight: 2
    });
    map.data.toGeoJson( function(data) {
      document.getElementById('exported').value=JSON.stringify(data)
    });

}
Run Code Online (Sandbox Code Playgroud)

概念证明

代码段:

function exportGeoJson() {
    var geoJson = {
        "type": "FeatureCollection",
            "features": []
    };
    var polylineFeature = {
        "type": "Feature",
            "geometry": {
            "type": "LineString",
                "coordinates": []
        },
            "properties": {}
    };
    for (var i = 0; i < polyline.getPath().getLength(); i++) {
        var pt = polyline.getPath().getAt(i);
        polylineFeature.geometry.coordinates.push([
        pt.lng(), pt.lat()]);
    }
    geoJson.features.push(polylineFeature);
    document.getElementById('geojson').value = JSON.stringify(geoJson);
    polyline.setPath([]);
    map.data.addGeoJson(geoJson);
    // Set the stroke width, and fill color for each polygon
    map.data.setStyle({
        strokeColor: 'green',
        strokeWeight: 2
    });
    map.data.toGeoJson( function(data) {
      document.getElementById('exported').value=JSON.stringify(data)
    });

}
Run Code Online (Sandbox Code Playgroud)
var polyline, map;

function initialize() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: -34.397,
      lng: 150.644
    },
    zoom: 13
  });
  map.addListener('click', insertDataPoint);

  polyline = new google.maps.Polyline({
    strokeColor: '#000000',
    strokeOpacity: 0.7,
    strokeWeight: 3
  });
  polyline.setMap(map);
}
google.maps.event.addDomListener(window, 'load', initialize);
plots = [];

// Bunch of other code that isn't important

function insertDataPoint(e) {
  var path = polyline.getPath();
  path.push(e.latLng);

  // Logic to set up marker or circle 
  if (plots.length == 0) {
    // Case: first click
    startMarker.setPosition(e.latLng);
    startMarker.setMap(map);
    plots.push(startMarker);

  } else {
    if (plots.length != 1) {
      // Case: we have intermediate points between start and end
      var plot = plots.pop();

      var marker = new google.maps.Marker({
        position: plot.getPosition(),
        icon: {
          path: google.maps.SymbolPath.CIRCLE,
          fillColor: '#ffffff',
          fillOpacity: 0.6,
          strokeColor: '#ffffff',
          strokeOpacity: 0.8,
          strokeWeight: 2,
          scale: 3
        }
      });
      marker.setMap(map);
      plots.push(marker);
    }
    // Case: add an end marker
    endMarker.setPosition(e.latLng);
    if (plots.length == 1) {
      endMarker.setMap(map);
    }
    plots.push(endMarker);
  }
}

function exportGeoJson() {
  var geoJson = {
    "type": "FeatureCollection",
    "features": []
  };
  var polylineFeature = {
    "type": "Feature",
    "geometry": {
      "type": "LineString",
      "coordinates": []
    },
    "properties": {}
  };
  for (var i = 0; i < polyline.getPath().getLength(); i++) {
    var pt = polyline.getPath().getAt(i);
    polylineFeature.geometry.coordinates.push([
      pt.lng(), pt.lat()
    ]);
  }
  geoJson.features.push(polylineFeature);
  document.getElementById('geojson').value = JSON.stringify(geoJson);
  polyline.setPath([]);
  map.data.addGeoJson(geoJson);
  // Set the stroke width, and fill color for each polygon
  map.data.setStyle({
    strokeColor: 'green',
    strokeWeight: 2
  });
  map.data.toGeoJson(function(data) {
    document.getElementById('exported').value = JSON.stringify(data)
  });

}
Run Code Online (Sandbox Code Playgroud)
html,
body,
#map {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
Run Code Online (Sandbox Code Playgroud)