当前位置: 代码网 > it编程>前端脚本>Vue.js > vue集成openlayers问题

vue集成openlayers问题

2024年05月18日 Vue.js 我要评论
vue集成openlayers下载依赖cnpm i -s ol创建地图文件 <div class="map"></div>按需引入相应的api,具体查看官方文档<scri

vue集成openlayers

下载依赖

cnpm i -s ol

创建地图文件

 <div class="map"></div>

按需引入相应的api,具体查看官方文档

<script>
import map from "ol/map";
import view from "ol/view";
// 添加图层
import tilelayer from "ol/layer/tile";
import xyz from "ol/source/xyz";
import tilewms from "ol/source/tilewms.js";
// 格式化地理坐标
import { fromlonlat } from "ol/proj.js";
export default {
  data() {
    return {
      map: null,
      //后台服务器地址
      urlroot: "http://193.112.110.27:8080/geoserver/gee/wms?",
    };
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      //  经纬度转化
      var center = fromlonlat([101.34272, 23.6042484]);
      //  自定义图层
      this.layers = [
        new tilelayer({
          source: new tilewms({
            url: this.urlroot, //图层地址
            params: { layers: "fangchenggang:other_sea" }, //图层名称
            servertype: "geoserver", //后台服务器
            zindex: 2 //图层层级
          })
        }),
        new tilelayer({
          source: new tilewms({
            url: this.urlroot,
            params: { layers: "fangchenggang:realm" },
            servertype: "geoserver"
          }),
          zindex: 3
        }),
        new tilelayer({
          source: new tilewms({
            url: this.urlroot,
            params: { layers: "fangchenggang:stockpile" },
            servertype: "geoserver"
          }),
          zindex: 3
        }),
        new tilelayer({
          source: new tilewms({
            url: this.urlroot,
            params: { layers: "fangchenggang:road" },
            servertype: "geoserver"
          }),
          zindex: 3
        }),
        new tilelayer({
          source: new tilewms({
            url: this.urlroot,
            params: { layers: "fangchenggang:railway" },
            servertype: "geoserver"
            //crossorigin: 'anonymous'
          }),
          zindex: 3
        }),
        new tilelayer({
          source: new tilewms({
            url: this.urlroot,
            params: { layers: "cesium:storage_yard" },
            servertype: "geoserver"
          }),
          zindex: 3
        })
      ];
      //  加载地图
      this.map = new map({
        target: "map", //地图容器
        layers: [        
        //加载天地图天地图
        new tilelayer({
          source: new xyz({
            url: "https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png"
          }),
          zindex: 1
        })],
        view: new view({
          projection: "epsg:3857",
          //初始化地图中心
          center: center,
          zoom: 2,
          // 镜头
          maxzoom: 18,
          minzoom: 13
        }),
        logo: false
      });
      //添加图层
      this.map.addlayer(layers);
    }
  }
};
</script>

其他api

从地图中删除给定的叠加层。

this.map.removelayer(layer);

设置图层显示或隐藏

this.layers.road.setopacity(0)

vue openlayers绘制数据时鼠标位置偏移问题

问题:将地图集成到现有的vue项目中,使用测量/绘制工具,鼠标位置和绘制的实际位置发生偏移。

如图,

正常应该是鼠标位置和实际绘制位置在同一点,图:

分析:我能想到可能造成这个问题的原因有:

  • 显示器缩放比例不是100%;
  • 地图dom被拉伸;
  • 组件冲突导致。

解决方案

我的系统是项目本身对body设置了缩放,因此在浏览器大小和预置大小不一致时会对body整体进行缩放,从而导致map元素被缩放。

body此时的样式:

至此,问题找到,取消这个缩放即可得到正确的鼠标定位。

反思一下,地图出现这个问题是因为地图数据的展示是凭借canvas实现的,地理数据和展示效果之间的交互是依靠的像素坐标和经纬度坐标之间的转换,而地图元素的缩放破坏了这个转换关系,所以造成了鼠标位置和实际绘制位置的偏移。        

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com