如何在OpenLayers 7的EPSG:4326投影下绘制包裹极点的可见范围圆
EPSG:4326投影下OpenLayers绘制包裹极点的可见范围圆缺失纬度带问题
我需要绘制地表给定经纬度点、特定高度下的可见立体角投影圆,在EPSG:4326投影下,这类圆实际是南北轴向双焦点椭圆(对应维基百科的Tissot指示线)。但当圆包裹南北极点时,生成的多边形会缺失从多边形最高纬度到90°N(北极)或最低纬度到90°S(南极)的纬度带。
错误实现与效果
使用OpenLayers的ol.geom.Polygon.circular(...)方法直接生成的结果存在缺失:
const vectorLayer4326 = new ol.layer.Vector({ source: new ol.source.Vector(), style: polygon_style, }); const radius = 7708025; let x, y; x = 0; for (y = 9; y <= 50; y += 10) { const circle4326 = ol.geom.Polygon.circular([x, y], radius, 128); vectorLayer4326.getSource().addFeature(new ol.Feature(circle4326)); }
该代码生成的多边形会缺失极点附近的纬度带,无法完整覆盖可见范围。
临时修复与预期效果
我通过自定义fix_OL_visi_circle_pole_vertices(Polygon)方法修正了几何:检测经度跳变时强制添加极点边角(北极对应[-180,90]、[180,90],南极对应[-180,-90]、[180,-90]),得到了正确的可见范围圆:
const vectorLayer4326 = new ol.layer.Vector({ source: new ol.source.Vector(), style: polygon_style, }); const radius = 7708025; let x, y; x = 0; for (y = 9; y <= 50; y += 10) { const circle4326 = fix_OL_visi_circle_pole_vertices(ol.geom.Polygon.circular([x, y], radius, 128)); vectorLayer4326.getSource().addFeature(new ol.Feature(circle4326)); }
但这个自定义方法不够简洁,希望找到更优的解决方案。
地图初始化代码
const map4326 = new ol.Map({ layers: [ tiles_layer, vectorLayer4326 ], target: 'map', view: new ol.View({ projection: 'EPSG:4326', center: [0, 0], zoom: 2, }), });
背景与需求
此前在Leaflet中遇到相同问题,切换至EPSG:3395投影解决了几何问题,但无法匹配正确纬度的瓦片。现在使用OpenLayers仍存在该问题,求助基于投影/转换的简洁解决方案,避免自定义顶点修复的繁琐。
内容的提问来源于stack exchange,提问作者Gosseyn
相关产品推荐
相关产品推荐

