首页 > 其他分享 >openlayers解决坐标经过本初子午线后横跨整个地图的异常问题

openlayers解决坐标经过本初子午线后横跨整个地图的异常问题

时间:2024-06-11 20:34:54浏览次数:12  
标签:acc lonDifference const coord return 本初子午线 180 openlayers 横跨

在使用 OpenLayers 处理坐标系统和地图投影时,确保地图上的线条平滑过渡过本初子午线是一个常见的问题。本博客提供了一个针对 EPSG:3857 和 EPSG:4326 投影的坐标调整方法,以避免线条异常横跨整个地图的情况。

针对3857投影

当使用 EPSG:3857 投影时,坐标系统使用的是米为单位,而绘图时涉及的经度可能跨越180度。以下的 adjustCoordinates 函数通过检测并调整跨越本初子午线的坐标来处理这个问题:

function adjustCoordinates(coords) {
  return coords.reduce((acc, coord, index, array) => {
    if (index === 0) {
      acc.push(coord);
      return acc;
    }
    const previous = acc[acc.length - 1];
    let [prevX, prevY] = previous;
    let [x, y] = coord;

    // 将米转换回经度
    const prevLon = prevX / 20037508.34 * 180;
    const lon = x / 20037508.34 * 180;

    // 检查是否跨越180度经线
    const lonDifference = lon - prevLon;
    if (Math.abs(lonDifference) > 180) {
      // 如果跨越,找到合适的方向进行调整
      const adjustment = Math.sign(lonDifference) * 360;
      x -= adjustment / 180 * 20037508.34;
    }
    acc.push([x, y]);
    return acc;
  }, []);
}

 

针对4326投影

对于使用地理坐标系的 EPSG:4326 投影,处理方式类似,但是坐标直接是经纬度值:

function adjustCoordinates(coords) {
  return coords.reduce((acc, coord, index, array) => {
    if (index === 0) {
      acc.push(coord);
      return acc;
    }
    const previous = acc[acc.length - 1];
    let [prevLon, prevLat] = previous;
    let [lon, lat] = coord;

    // 检查是否跨越本初子午线
    const lonDifference = lon - prevLon;
    if (lonDifference > 180 || lonDifference < -180) {
      // 调整经度
      lon -= Math.sign(lonDifference) * 360;
    }
    acc.push([lon, lat]);
    return acc;
  }, []);
}

 

实现在界面上:

使用 OpenLayers 创建和显示路线的代码示例如下:

      var coordinates = row.track.map(coord => olProj.fromLonLat(coord, 'EPSG:3857'));
      coordinates = adjustCoordinates(coordinates);
      const routeFeature = new Feature({
        geometry: new LineString(coordinates),
        row
      });
      routeFeature.setStyle(selectedRouteStyle);
      const routeLayer = new VectorLayer({
        name: "routeLayer",
        source: new VectorSource({
          features: [routeFeature]
        })
      });
      this.openMap.addLayer(routeLayer);

这些代码块提供了在处理全球范围内坐标时如何优雅地管理横跨本初子午线的情况,确保地图的视觉连贯性。

标签:acc,lonDifference,const,coord,return,本初子午线,180,openlayers,横跨
From: https://www.cnblogs.com/youmuchen/p/18242662

相关文章

  • 【定时任务知多少, 横跨10余项目,6种实践方式】
    工作多年,随着项目的不断研发落地,大大小小做了有10+个项目,其中不少涉及到定时任务。今天来盘一下,这些项目中,定时任务的实现方式。通过项目的需求场景,可以看出定时任务需要有什么样的功能。需求1调度需求任务,增,删,查。时效,实时发送/定时发送。2执行需求分布式,多机......
  • 265:vue+openlayers 一次性清除所有控件(亲测好用)
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为GIS领域高级前端工程师;CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第265个示例文章目录一、示......
  • 三十二、openlayers官网示例解析Draw lines rendered with WebGL——使用WebGL动态修
     官网demo地址:DrawlinesrenderedwithWebGL这个示例展示了如何用webgl渲染矢量图形并动态修改点、线属性。首先先把基本的地图加载上去initMap(){this.map=newMap({layers:[newTileLayer({source:newXYZ({......
  • Vue+OpenLayers7入门到实战:OpenLayers实现在地图上拖拽编辑修改绘制图形
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上拖拽编辑修改绘制图形。在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地......
  • OpenLayers9.1.0版本正式发布,OpenLayers9.1.0值得升级吗?9.1.0版相比9.0.0版本又更新了
    Vue+OpenLayers中文教程推荐,不同于OpenLayers官方文档使用html+js原生原生教程,博主专栏包含大量vue整合案例和实际开发案例,非常适合地图开发小白快速入门。OpenLayers6教程vue整合OpenLayers6入门教程:《Vue+OpenLayers6入门教程》vue整合OpenLayers6实战中文教程,包含大量O......
  • openlayers 各版本特性
    从20年接手的项目,由于项目需要,当时只能内网开发,客户对地图有很多定制化功能,又要求免费,对比了几家地图引擎,最终还是选择了使用openlayers;具体的各引擎的区别这里就不赘述。期间陆陆续续经历几个项目,最初的ol5现已更新到ol9,趁着有空对各版本的特性做一下整理说明,方便后续项目......
  • OpenLayers6实战,OpenLayers实现绘制扇形,OpenLayers绘制特殊殊图形四分之一圆
    专栏目录:OpenLayers实战进阶专栏目录前言本章讲解使用OpenLayers实现绘制扇形,绘制特殊殊图形扇形(也即:四分之一圆)的功能。本章代码是在绘制圆形的基础上扩展修改而成:圆形绘制可以参考:《OpenLayers6入门,OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多......
  • Vue+OpenLayers7入门到实战:OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上进行绘制图形的功能,上一章中《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要......
  • openlayers 入门教程(三):view 篇
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......
  • Vue+OpenLayers7入门到实战:OpenLayers7创建自定义鹰眼控件,自定义鹰眼控件样式,调整鹰眼
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上创建自定义鹰眼控件,自定义鹰眼控件样式,调整鹰眼控件位置、大小、文字和按钮等样式。二、依赖和使用"ol":"7.5.2"使用npm安装依赖[email protected]使用Y......