当前位置:   article > 正文

【Vue3】openlayers加载瓦片地图并手动标记坐标点

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录

一、创建Vue3项目

二、openlayers加载瓦片地图(引js文件版)

2.1 将以下的文件复制到public下

2.2 index.html引入ol脚本

2.3 删除项目自带的HelloWorld.vue,创建Map.vue

2.4 编码Map.vue

2.5 修改App.vue

2.6 启动项目测试

三、openlayers加载瓦片地图(npm安装依赖版)

3.1 安装openlayers依赖

3.2 编写Map.vue代码

3.3 启动项目测试即可


一、创建Vue3项目

注:不用创建项目的可以直接跳过这块。

我们这里用vue/cli创建,我用的node版本是18.12.1。

创建前可以先配置下镜像源:npm config set registry https://registry.npmmirror.com

按下面的步骤创建即可:

  1. ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
  2. vue --version
  3. ## 安装或者升级你的@vue/cli
  4. npm install -g @vue/cli
  5. ## 执行创建命令
  6. vue create vue_test
  7. ## 随后选择3.x
  8. ## Choose a version of Vue.js that you want to start the project with (Use arrow keys)
  9. ## > 3.x
  10. ## 2.x
  11. ## 启动
  12. cd vue_test
  13. npm run serve

二、openlayers加载瓦片地图(引js文件版)

2.1 将以下的文件复制到public下

2.2 index.html引入ol脚本

2.3 删除项目自带的HelloWorld.vue,创建Map.vue

2.4 编码Map.vue

  1. <template>
  2. <div class="map" id="map" ref="mapContainer"></div>
  3. </template>
  4. <script>
  5. import { onMounted, ref } from 'vue';
  6. export default {
  7. name: 'MapComponent',
  8. setup() {
  9. const mapContainer = ref(null);
  10. onMounted(() => {
  11. var BaseMapLayer = function(options) {
  12. var layer = new ol.layer.Tile({
  13. source: new ol.source.XYZ({
  14. url: options.url,
  15. tilePixelRatio: 1,
  16. minZoom:2,
  17. maxZoom:17
  18. })
  19. });
  20. return layer;
  21. };
  22. var view = new ol.View({
  23. // 这两个参数是你地图地点的中心点经纬度坐标
  24. center: ol.proj.fromLonLat([120, 17]),
  25. zoom: 13,
  26. minZoom: 13,
  27. maxZoom: 17
  28. });
  29. var sateliteopt = {
  30. url: '/tiles/{z}/{x}/{y}.png'
  31. };
  32. var sate = new ol.layer.Group({
  33. layers: [
  34. new BaseMapLayer(sateliteopt)
  35. ]
  36. });
  37. // 添加标注层
  38. var markerLayer = new ol.layer.Vector({
  39. source: new ol.source.Vector(),
  40. style: new ol.style.Style({
  41. image: new ol.style.Icon({
  42. anchor: [0.5, 46],
  43. anchorXUnits: 'fraction',
  44. anchorYUnits: 'pixels',
  45. src: '/marker.png' // 标注图标的路径
  46. })
  47. })
  48. });
  49. // 创建标注
  50. var marker = new ol.Overlay({
  51. element: document.getElementById('marker'),
  52. positioning: 'center-center',
  53. stopEvent: false,
  54. offset: [0, -23]
  55. });
  56. var map = new ol.Map({
  57. view: view,
  58. layers: [
  59. sate,
  60. markerLayer // 添加标注层到地图
  61. ],
  62. overlays: [marker], // 添加标注到地图
  63. target: 'map'
  64. });
  65. // 监听点击事件
  66. map.on('click', function(event) {
  67. // 将点击的经纬度转换为地图的像素坐标
  68. var feature = new ol.Feature({
  69. geometry: new ol.geom.Point(event.coordinate)
  70. });
  71. // 将标注添加到标注层
  72. markerLayer.getSource().addFeature(feature);
  73. // 将标注移动到点击的位置
  74. marker.setPosition(event.coordinate);
  75. });
  76. });
  77. return {
  78. mapContainer
  79. };
  80. }
  81. };
  82. </script>
  83. <style>
  84. .map {
  85. height: 100%;
  86. width: 100%;
  87. }
  88. </style>

2.5 修改App.vue

  1. <template>
  2. <MapComponent/>
  3. </template>
  4. <script>
  5. import MapComponent from './components/Map.vue'
  6. export default {
  7. name: 'App',
  8. components: {
  9. MapComponent
  10. }
  11. }
  12. </script>
  13. <style>
  14. </style>

2.6 启动项目测试

三、openlayers加载瓦片地图(npm安装依赖版)

一般来说,引js文件这种方式不太实用,既然都用了vue3了就老老实实按规则走吧...

3.1 安装openlayers依赖

先把package.json里加上"ol": "^7.5.2",然后安装ol:

npm install ol

注意:这里不知道为什么node18.12.0安装不上ol,我就先用nvm切换到17.1.0版本安装的ol,安装完再切回18.12.0版本。

3.2 编写Map.vue代码

  1. <template>
  2. <div class="map" id="map" ref="mapContainer"></div>
  3. </template>
  4. <script>
  5. import "ol/ol.css";
  6. import { onMounted, ref } from 'vue';
  7. import { Icon, Style }from "ol/style";
  8. import Map from "ol/Map";
  9. import Overlay from "ol/Overlay";
  10. import View from "ol/View";
  11. import Point from "ol/geom/Point.js";
  12. import Feature from "ol/Feature.js";
  13. import TileLayer from "ol/layer/Tile";
  14. import XYZ from "ol/source/XYZ";
  15. import VectorLayer from "ol/layer/Vector";
  16. import {fromLonLat } from "ol/proj";
  17. import Group from "ol/layer/Group";
  18. import VectorSource from "ol/source/Vector";
  19. export default {
  20. name: 'MapComponent',
  21. setup() {
  22. const mapContainer = ref(null);
  23. onMounted(() => {
  24. var BaseMapLayer = function(options) {
  25. var layer = new TileLayer({
  26. source: new XYZ({
  27. url: options.url,
  28. tilePixelRatio: 1,
  29. minZoom:2,
  30. maxZoom:17
  31. })
  32. });
  33. return layer;
  34. };
  35. var view = new View({
  36. center: fromLonLat([200, 18.1]),
  37. zoom: 13,
  38. minZoom: 13,
  39. maxZoom: 17
  40. });
  41. var sateliteopt = {
  42. url: 'tiles/{z}/{x}/{y}.png'
  43. };
  44. var sate = new Group({
  45. layers: [
  46. new BaseMapLayer(sateliteopt)
  47. ]
  48. });
  49. // 添加标注层
  50. var markerLayer = new VectorLayer({
  51. source: new VectorSource(),
  52. style: new Style({
  53. image: new Icon({
  54. anchor: [0.5, 46],
  55. anchorXUnits: 'fraction',
  56. anchorYUnits: 'pixels',
  57. src: 'marker.png' // 标注图标的路径
  58. })
  59. })
  60. });
  61. // 创建标注
  62. var marker = new Overlay({
  63. element: document.getElementById('marker'),
  64. positioning: 'center-center',
  65. stopEvent: false,
  66. offset: [0, -23]
  67. });
  68. var map = new Map({
  69. view: view,
  70. layers: [
  71. sate,
  72. markerLayer // 添加标注层到地图
  73. ],
  74. overlays: [marker], // 添加标注到地图
  75. target: 'map'
  76. });
  77. // 监听点击事件
  78. map.on('click', function(event) {
  79. // 将点击的经纬度转换为地图的像素坐标
  80. var feature = new Feature({
  81. geometry: new Point(event.coordinate)
  82. });
  83. // 将标注添加到标注层
  84. markerLayer.getSource().addFeature(feature);
  85. // 将标注移动到点击的位置
  86. marker.setPosition(event.coordinate);
  87. });
  88. });
  89. return {
  90. mapContainer
  91. };
  92. }
  93. };
  94. </script>
  95. <style>
  96. .map {
  97. height: 800px;
  98. width: 2000px;
  99. }
  100. </style>

3.3 启动项目测试即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/507514
推荐阅读
相关标签
  

闽ICP备14008679号