【问题标题】:Export geoJSON data from Google Maps从 Google 地图导出 geoJSON 数据
【发布时间】:2014-08-01 02:39:29
【问题描述】:

是否有内置支持或任何库可以从google.maps.Data 层或google.maps.Data.Featuregoogle.maps.Data.Geometry 甚至使用MarkerPolylinePolygon 导出geoJSON 数据。我有代码像这样,例如:

 var point=new google.maps.Data.Point(m.getPosition());
 activeFeature.setGeometry(point);
 console.log(activeFeature.getGeometry());
 equiLayer.add(activeFeature);

我想将此数据作为geojson 导出到服务器。类似于leaflet 中的toGeoJson 方法?

【问题讨论】:

  • @aa333 我没有像视频中的开发者那样为我的数据提供 JS/JSON 源,数据是在地图上创建然后导出的。
  • 如果这是您的 Google Maps Javascript API v3 地图(我从您的问题中不清楚),没有原生支持将其导出为 GeoJSON,但编写代码应该不难这样做。

标签: javascript google-maps-api-3 export geojson


【解决方案1】:

一个示例函数:

google.maps.Map.prototype.getGeoJson=function(callback){
  var geo={"type": "FeatureCollection","features": []},
      fx=function(g,t){

        var that  =[],
            arr,
            f     = {
                      MultiLineString :'LineString',
                      LineString      :'Point',
                      MultiPolygon    :'Polygon',
                      Polygon         :'LinearRing',
                      LinearRing      :'Point',
                      MultiPoint      :'Point'
                    };

        switch(t){
          case 'Point':
            g=(g.get)?g.get():g;
            return([g.lng(),g.lat()]);
            break;
          default:
            arr= g.getArray();
            for(var i=0;i<arr.length;++i){
              that.push(fx(arr[i],f[t]));
            }
            if( t=='LinearRing' 
                  &&
                that[0]!==that[that.length-1]){
              that.push([that[0][0],that[0][1]]);
            }
            return that;
        }
      };

  this.data.forEach(function(feature){
   var _feature     = {type:'Feature',properties:{}}
       _id          = feature.getId(),
       _geometry    = feature.getGeometry(),
       _type        =_geometry.getType(),
       _coordinates = fx(_geometry,_type);

       _feature.geometry={type:_type,coordinates:_coordinates};
       if(typeof _id==='string'){
        _feature.id=_id;
       }

       geo.features.push(_feature);
       feature.forEachProperty(function(v,k){
          _feature.properties[k]=v;
       });
  }); 
  if(typeof callback==='function'){
    callback(geo);
  }     
  return geo;
}

该函数使用数据创建一个对象。您可以将回调作为参数传递,该回调将以对象作为参数执行。

示例调用:

//map is the google.maps.Map-instance
map.getGeoJson(function(o){console.log(o)});

演示:http://jsfiddle.net/doktormolle/5F88D/

注意: Demo 也存储了圆,但 GeoJSON 不支持圆。作为一种解决方法,它将圆存储为具有半径属性的 POINT。

当一个带有半径属性的 POINT 将被加载到数据层中时,演示会隐藏标记并根据几何和半径属性创建一个圆。


&lt;edit&gt;:现在有一个内置方法可用于 geoJSON 导出:google.maps.Data.toGeoJson()

请参阅 Save Map Instance outside of Google Maps 了解示例

【讨论】:

  • 嗨!我收到错误“google.maps.Data.toGeoJson 不是函数”.. 当我尝试 console.log 时。谢谢
  • 你必须调用实例的方法,例如当地图的变量名称为myMap 时,调用必须为myMap.data.toGeoJson(function(data){console.log(data);});
  • 啊哈完美!非常感谢!
  • 好样的!太糟糕了,不包含任何评论......然后将是一个示例,但现在只是一个共享代码......
  • 我们可以使用 toGeoJson() 方法获取地图上单个叠加层的 geoJSON 吗?即,在单击处理程序中,我想获取该特定形状的 geoJSON
【解决方案2】:

您好,我想分享一下我如何将 geojson 数据从谷歌地图导出到 html 文本区域。

这是我的 html 视图

     <article id="article3" style="">
        <div style="margin: 2px 0px 2px 0px;">
            <button onclick= "exportData()">Save</button>
        </div>
        <textarea id="geojson-input" placeholder="..." class="" style="height: 97%; width: 100%"></textarea>
    </article>

这是我的javascript

     map.data.toGeoJson(function (data) {
                document.querySelector('#geojson-input').innerHTML = JSON.stringify(data);
            });

map.data 类的函数togeojson 将从地图中获取所有数据并返回对象。要在我的 textarea 上显示该对象,我必须使用 JSON.stringify(data); 将该对象转换为字符串;

希望能有所帮助!

【讨论】:

    【解决方案3】:

    这些都不适合我。我想出了一种导出自定义多边形的方法,它也可能对其他形状有用。

    这里是密钥导出函数:

    function getPathArray(polygon) {
        return polygon.getPath().getArray().map(p => {
            return { lat: p.lat(), lng: p.lng() }
        })
    }
    

    这是一个完整的例子:

    function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 5,
            center: { lat: 25.774, lng: -70.190 }, // bermuda triangle
        });
    
        const bermudaTriangle = new google.maps.Polygon({
            paths: [
                { lat: 25.774, lng: -80.190 },
                { lat: 18.466, lng: -66.118 },
                { lat: 32.321, lng: -64.757 },
            ],
            strokeColor: '#FF0000',
            strokeOpacity: 0.8,
            strokeWeight: 2,
            fillColor: '#FF0000',
            fillOpacity: 0.35,
            editable: true,
            draggable: false
        });
        bermudaTriangle.setMap(map);
    
        bermudaTriangle.getPaths().forEach(function (path, index) {
            google.maps.event.addListener(path, 'insert_at', function () {
                var data = getPathArray(bermudaTriangle)
                console.log(JSON.stringify(data))
            })
    
            google.maps.event.addListener(path, 'remove_at', function () {
                var data = getPathArray(bermudaTriangle)
                console.log(JSON.stringify(data))
            })
    
            google.maps.event.addListener(path, 'set_at', function () {
                var data = getPathArray(bermudaTriangle)
                console.log(JSON.stringify(data))
            })
        })
    
        google.maps.event.addListener(bermudaTriangle, 'dragend', function () {
            console.log("dragged")
        })
    }
    
    function getPathArray(polygon) {
        return polygon.getPath().getArray().map(p => {
            return { lat: p.lat(), lng: p.lng() }
        })
    }
    

    然后使用打印到控制台的json并导入它

    bermudaTriangle.setPath(JSON.parse(myJson))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多