Openlayer 4可以使用GeoJson的crs来实时重新喷射

时间:2017-05-20 03:37:31

标签: openlayers geojson

我正在从服务器上读取一个带有crs定义的GeoJson文件:

{"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32720" }     },                                                                               
"features": [ many features,.....

然后将其加载到地图上,但它出现在另一个大陆,靠近格林威治子午线。

我阅读了文档,并且在许多地方都有一个featureProjection选项,  但我不知道是为了源还是为目标。

我试试:

var vectorLayerUTMPoints = new ol.layer.Vector({
    source: new ol.source.Vector({            
        url: '/static/points.geojson',            
        format: new ol.format.GeoJSON({featureProjection: 'EPSG:32720'}) //
    })
   });

此外:

var vectorLayerUTMPoints = new ol.layer.Vector({
source: new ol.source.Vector({            
    url: '/static/points.geojson',            
    projection: 'EPSG:32720',
    format: new ol.format.GeoJSON()
})   });

地图加载OSM图层以供参考并且正常工作:

     var map = new ol.Map({
    layers: [
      new ol.layer.Tile({source: new ol.source.OSM()}),
      vectorLayerUTMPoints
    ],
    target: 'map',
    controls: ol.control.defaults({
      attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
        collapsible: false
      })
    }),
    view: new ol.View({
      projection: 'EPSG:3857',
      center: [0, 0],
      zoom: 2
    })
  }); 

问题是,OpenLayer 4可以从geojson文件中读取crs定义并进行转换 对于他飞行的观点,或者如何解决它?

2 个答案:

答案 0 :(得分:1)

这里有两个问题:首先,默认情况下,您尝试使用的投影不包含在OpenLayers中:您必须使用Proj4导入它。我从this example获取代码来演示。

首先在EPSG.io中包含proj4脚本和投影定义:

<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.4.3/proj4.js"></script>
<script src="https://epsg.io/32720.js"></script>

您现在可以创建一个包含投影参考的对象:

var myProj = ol.proj.get('EPSG:32720');

您的第二个问题是您错误地使用了featureProjection。您需要在图层的format对象中设置两个属性:dataProjection是数据源的投影,featureProjection是您希望将要素转换为的内容。在这种情况下,您希望将它们转换为适合您的地图投影,即EPSG:3857。

所以你的代码变成了:

var myProj = ol.proj.get('EPSG:32720');
var vectorLayerUTMPoints = new ol.layer.Vector({
source: new ol.source.Vector({            
    url: '/static/points.geojson',            
    format: new ol.format.GeoJSON({dataProjection: myProj, featureProjection: 'EPSG:3857'}) 
    })
});

答案 1 :(得分:0)

感谢您的回复,我之前无法回答,因为 我卡住了,你的解决方案非常明确,但无法开展工作。 功能显示在错误的位置。

有任何方法可以知道proj4是否正确加载,它没有isValid()方法 或类似的东西。

我创建了一个plunker文件:clik to see here

我也尝试了你的消化:

   proj4.defs("EPSG:32720","+proj=utm +zone=20 +south +datum=WGS84 +units=m +no_defs");

 var sourceProj = ol.proj.get('EPSG:32720');
 var targetProj = ol.proj.get('EPSG:3857');   
 var UTMFormat = new ol.format.GeoJSON({dataProjection: sourceProj, featureProjection: targetProj'});

 var vectorLayerUTMPoints = new ol.layer.Vector({
        source: new ol.source.Vector({            
            url: '/static/centroids32720.geojson',            
            format: UTMFormat
        }),
    style: styleFunction    
   });

另外:

     proj4.defs("EPSG:32720","+proj=utm +zone=20 +south +datum=WGS84 +units=m +no_defs");  
 var UTMFormat = new ol.format.GeoJSON({dataProjection: 'EPSG:32720', featureProjection: 'EPSG:3857'});
 var vectorLayerUTMPoints = new ol.layer.Vector({
        source: new ol.source.Vector({            
            url: '/static/centroids32720.geojson',            
            format: UTMFormat
        }),
    style: styleFunction    
   }); 

我在法国看到了这些观点,但没有重新投射。

根据api doc:

defaultDataProjection和featureProjection是ol.ProjectionLike 它可以是三件事之一: ol.ProjectionLike {ol.proj.Projection} {string} {undefined}

所以来源很好。

问候