从用户创建的 OpenLayer 3 地图中保存图层

Saving layer from OpenLayer 3 Map created by user

我正在尝试正确保存用户创建的 OpenLayer 3 Map 层,以便使用 geoJSON 将其显示在另一张地图上,但我遇到了麻烦。

客户端端,我将动态层保存在这个函数中:

function addInteractions() {                
    draw = new ol.interaction.Draw({
      source: source,
      type: typeSelect.value
    });
    draw.on("drawend", function(e) {
      var f = e.feature;
      features.push(f);
      geoJson = format.writeFeatures(features);
      console.log(geoJson);
      document.getElementById('js-textarea').value = geoJson;
    });
    map.addInteraction(draw);
    snap = new ol.interaction.Snap({source: source});
    map.addInteraction(snap);
}

然后 geoJSON 对象被保存到 .json 文件中,但是当我尝试显示它时,它没有出现在地图上。

这里是他我的显示函数:

var geoDataUrl = '/data/' + '{{percorso._id}}' + '.json';
var vectorLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
      url: geoDataUrl,
      format: new ol.format.GeoJSON()
    }),
    style: new ol.style.Style({
      fill: new ol.style.Fill({
        color: 'rgba(255, 255, 255, 0.2)'
      }),
      stroke: new ol.style.Stroke({
        color: '#ffcc33',
        width: 2
      }),
      image: new ol.style.Circle({
        radius: 7,
        fill: new ol.style.Fill({
          color: '#ffcc33'
        })
      })
    })
  });       
  var raster = new ol.layer.Tile({
    source: new ol.source.OSM()
  });
  var map = new ol.Map({
    layers: [raster, vectorLayer],
    target: 'map',
    view: new ol.View({
      center: {{#if percorso.mapCenter}}[{{percorso.mapCenter}}] {{else}} ol.proj.transform([9.688053, 45.362760], 'EPSG:4326', 'EPSG:3857'){{/if}},
      zoom: {{#if percorso.zoomLevel}}{{percorso.zoomLevel}} {{else}} 13{{/if}}
    })
  });

我还测试了其他层的显示功能(例如 OpenLayer 示例网站上的 provided one),它工作正常

服务器 端,我使用此函数保存 geoJSON 对象,其中 oggetto_mappa 是动态 geoJSON 对象:

var jsonMappa = JSON.stringify(eval("(" + oggetto_mappa + ")"));
require("fs").writeFile("./public/data/" + id_perc + ".json", jsonMappa, 'utf8', function(f_err) {
     if(f_err)
       console.log(f_err);
});

作为参考,这是我的函数保存到 .json 文件中的内容:

{
"type":"FeatureCollection",
"features":[
    {
        "type":"Feature",
        "id" : "aa",
        "geometry":
        {
            "type":"LineString",
            "coordinates":[
                [1073328.751180445,5680150.227413875],
                [1077857.6451063417,5682481.556776573],
                [1070385.9255914658,5679156.546046168],
                [1076825.7452244917,5680226.66444216],
                [1073328.751180445,5680169.336670946]
            ]
        },
        "properties":null
    },
    {
        "type":"Feature",
        "id" : "ab",
        "geometry":
        {
            "type":"LineString",
            "coordinates":[
                [1073328.751180445,5680169.336670946],
                [1071628.0273010998,5677130.96479661]
            ]
        },
        "properties":null}
    ]
}

要让事情正常进行,请替换

geoJson = format.writeFeatures(features)

geoJson = format.writeFeatures(features, {featureProjection: 'EPSG:3857'})

你可能想知道为什么?

当您在 OpenLayers 中绘制时,您正在绘制地图的投影(默认为 EPSG:3857),而当您使用 GeoJSON 时,预期的投影为 EPSG:4326.

请参阅 ol.format.GeoJSON writeFeatures 中的 the API documentation 以更好地理解

一些附加信息:

  • 当您从绘图中使用 GeoJSON 时,因为坐标不是十进制度数 (EPSG:4326),而是米 (EPSG:3857)
  • 坐标的数量级不同(EPSG:3857 数百万,EPSG:4326 不到数百)不考虑 positive/negative 坐标