OpenLayers动态加载GeoJSON图层不显示怎么办?
大家好,我在用OpenLayers做地图应用时遇到个怪问题。按照文档写了动态加载GeoJSON的代码,但图层就是不显示,控制台也没报错…
场景是这样的:我先用fetch获取本地GeoJSON文件,解析后添加到向量图层。代码是这样的:
const vectorSource = new ol.source.Vector();
const vectorLayer = new ol.layer.Vector({ source: vectorSource });
map.addLayer(vectorLayer);
fetch('data.geojson')
.then(response => response.json())
.then(data => {
const geojson = new ol.format.GeoJSON();
const features = geojson.readFeatures(data);
vectorSource.addFeatures(features);
});
尝试过用开发者工具看,发现features确实解析出来了,但地图上就是看不到图形。手动把GeoJSON内容写死在代码里就能显示,动态加载就失效。是不是需要重新渲染或者设置什么参数?
解决方法很简单,在读取features的时候指定数据的坐标系,并让其自动转换到视图的坐标系:
注意这里的
featureProjection是告诉OpenLayers:当前GeoJSON数据的坐标属于哪个投影,它会自动转成地图需要的投影。另外建议检查下地图的view设置,确认projection是不是3857,比如:
如果你手动写死GeoJSON能显示,那很可能是因为你测试时用了
ol.proj.fromLonLat转过坐标,而动态加载忘了这一步。总之关键就是一句话:动态加载的数据别忘了投影转换,不然数据在“另一个地球”上,地图当然看不到。
你应该在读取 features 的时候指定数据的投影。比如改成这样:
const features = geojson.readFeatures(data, { dataProjection: 'EPSG:4326' });
或者你的 GeoJSON 数据本身是 3857 的话,那就要反过来设置。总之,要让 OpenLayers 正确理解这些坐标的含义,它才能正确显示。
我也踩过这个坑,看着数据是正常,但地图上啥也没有,真让人抓狂。这种 bug 不报错反而更难搞。你可以再加个 zoom 适配,比如:
map.getView().fit(vectorSource.getExtent(), { duration: 500 });
这样能确保地图视图缩放到你的数据范围。试试看?