我正在从服务器上读取一个带有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定义并进行转换 对于他飞行的观点,或者如何解决它?
答案 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}
所以来源很好。
问候