如何基于地图范围将GeoJSON数据动态加载到OpenLayers 3.5.0地图层中?

如何基于地图范围将GeoJSON数据动态加载到OpenLayers 3.5.0地图层中?,geojson,openlayers-3,Geojson,Openlayers 3,我正在从OpenLayers 3.2.0迁移到3.5.0,无法将GeoJSON数据加载到向量层。我已经让它工作了,但我正在转换GeoJSON数据源中特征的几何图形,然后再将它们添加到向量源中 有没有办法让OpenLayers 3.5.0自动应用转换 来自GeoJSON数据源的数据使用了EPSG:4326,我认为我需要将几何图形重新投影到EPSG:3857,以便在地图上显示它们。GeoJSON数据源在其crs属性中有投影信息,我的矢量源也有投影集。尽管如此,特征几何体本身并没有进行变换 我需要通过

我正在从OpenLayers 3.2.0迁移到3.5.0,无法将GeoJSON数据加载到向量层。我已经让它工作了,但我正在转换GeoJSON数据源中特征的几何图形,然后再将它们添加到向量源中

有没有办法让OpenLayers 3.5.0自动应用转换

来自GeoJSON数据源的数据使用了
EPSG:4326
,我认为我需要将几何图形重新投影到
EPSG:3857
,以便在地图上显示它们。GeoJSON数据源在其
crs
属性中有投影信息,我的矢量源也有投影集。尽管如此,特征几何体本身并没有进行变换

我需要通过URL将可视地图区域的边界传递给我的GeoJSON数据源,我不想一次加载所有数据。我在向量源上有一个loader函数,它获取当前映射范围并为请求构建URL

来源是可用的,它通过一个过梁验证,我相信它是合理的

下面是我正在使用的当前代码

var vectorFormat = new ol.format.GeoJSON();
var featureStyle = new ol.style.Style({
    image: new ol.style.Circle({
      radius: 5,
    fill: new ol.style.Fill(
      {color: 'rgba(255, 69, 0, 0.75)'}),
    stroke: new ol.style.Stroke(
      {color: 'rgba(255, 0, 0, 0.95)', width: 1})
    })
 });

var vectorSource = new ol.source.Vector({
    projection: new ol.proj.Projection({'code':'EPSG:3857'}),
    strategy: ol.loadingstrategy.bbox,
    loader: function(extent, resolution, projection) {
      var coordinate1 = ol.proj.transform([extent[0], extent[1]],
        'ESPG:3857', 'EPSG:4326')
      var coordinate2 = ol.proj.transform([extent[2], extent[3]],
        'ESPG:3857', 'EPSG:4326')
      var url = 'api/sites/geo/bounds/4326/' + coordinate1[1] 
        + ',' + coordinate1[0] + '/' + coordinate2[1] + ',' 
        + coordinate2[0] + "/";
        $.ajax({
            url: url,
            dataType: 'json'
        }).then(function(response) {
            var features = vectorFormat.readFeatures(response);
            var transformFn = ol.proj.getTransform(
              response.crs.properties.name, projection);
            for(index in features) {
                var feature = features[index];
                feature.getGeometry().applyTransform(transformFn);
            }
            vectorSource.addFeatures(features);
        });
    }
});

this.state.map = new ol.Map({
    target: 'map',
    layers: [
      new ol.layer.Tile({
        source: new ol.source.OSM()
      }),
      new ol.layer.Vector({
        source: vectorSource,
          style: featureStyle
        })
     ],
     view: new ol.View({
        center: this.transformToOl(this.state.center),
        zoom: this.state.zoom
      })
});

如果您能提供任何正确方向的帮助或指点,我们将不胜感激<代码>:-D

是的,OpenLayers可以为您重新投影。您甚至不必在源上设置投影。几何图形将自动重新投影到视图投影

var vectorSource = new ol.source.Vector({
  url: 'file.json',
  format: new ol.format.GeoJSON()
});

更新

如果要使用自定义加载程序,可以在分析功能时指定目标投影(另请参见):


我相信我的问题在于我的矢量源的自定义数据加载器。提供GeoJSON数据的REST服务相当大,因此我正在传递返回URL的数据的边界。为了做到这一点,看起来我还必须处理数据的接收,因此我在加载程序上有
then
函数。可能是,如果我想像这样更改URL,那么我必须自己进行转换。@Miles我用一个自定义加载程序示例更新了我的答案。谢谢!我曾尝试在
readFeatures
函数中传递
projection
值,但没有传递
featureProjection
。这正是我需要让它工作的地方。@tsauerwein为我澄清了这个问题,这里的问题是我应该如何编写我的加载器函数,以便转换功能?在上面的示例中,我手动转换它们,这是唯一的方法吗?我需要我自己的加载器函数,这样我就可以修改URL以包含地图范围。我认为@tsauerwein意味着你不需要转换任何东西。只要阅读/包含geojson的特性就可以了。如果我可以为源代码提供一个不需要任何额外参数的URL,那么@tsauerwein是正确的:数据加载并自动转换。然而,所有在URL中有参数的OpenLayers示例都有一个“loader”函数,并且似乎没有转换坐标。例如,这个答案:
var vectorSource = new ol.source.Vector({
  strategy: ol.loadingstrategy.bbox,
  loader: function(extent, resolution, projection) {
    $.ajax(url).then(function(response) {
      var features = format.readFeatures(response,
        {featureProjection: 'EPSG:3857'});
      vectorSource.addFeatures(features);
    });
  }
});