-1

上周我是 OL 的新手,所以如果我错过了一些明显的事情,我深表歉意。它主要由示例拼凑而成,但我很确定我理解此时发生的事情。你可以在这里看到我的代码:https ://fleur.github.io/dist/index.html ,或者更传统的,在这里:https ://github.com/fleur/olexample 。

如果我创建一个带有矢量图层的地图,其源是一个静态文件(通过“url”属性),那么这些特征就会按预期显示。如果我使用相同的代码创建地图,唯一的区别是源是进行 xhr 调用的加载器函数,则这些功能不会显示。

在这两种情况下,我都在源和层上放置了侦听器,并触发了这些事件:

静止的:

precompose
postcompose
addfeature
addfeature
addfeature
change
precompose
render
postcompose

动态的:

precompose
postcompose
addfeature
addfeature
addfeature
change
precompose
postcompose

请注意,动态事件序列中没有“渲染”事件。我什至做了一个同步 HTTP 调用。我完全不知所措。动态源加载器函数正在用闭包做一些棘手的事情,所以也许这与它有关?不过,代码取自 openlayers.org 上的示例,仅使用 console.log 和不同的 url 进行了修改。

所以,我的问题是:我怎样才能得到动态检索的特性,这些特性确实被添加到源中,以呈现?

4

1 回答 1

0

当使用具有 GeoJSON、GPX、KML 或 OSMXML 格式的 URL 使用数据时,OpenLayers 库会自动从 EPSG:4326 重新投影到 EPSG:3857,而当您执行手动 Ajax 调用时,您有责任进行此转换。渲染不会发生,因为您的特征超出了绘制它们的范围。

为了解决您的问题,之后,

const f = dynamic_source.getFormat().readFeatures(xhr.responseText);

添加

// Return at the moment geometry with longitude-latitude / WGS 84 / EPSG:4326
// like [-122.3563599, 37.5793804]
// Only here for learning purpose, you can remove it after understanding my point
console.log(f[0].getGeometry().getCoordinates());

// Reproject coordinates manually by mutating the current geometry in place
f.forEach(feature => feature.getGeometry().transform('EPSG:4326', 'EPSG:3857'));

PS:经过测试

于 2018-09-15T23:36:44.687 回答