Vue + Openlayers 使用 Overlay 添加 Popup 弹窗

这篇博客记录了使用Vue.js和OpenLayers库创建地图弹窗功能的过程。作者通过创建元素、引入依赖、添加事件及设置样式,展示了如何在地图上显示包含地名和面积信息的弹窗,并提供了项目的运行效果截图。文章还附带了Vue+OpenLayers DOM的下载链接。

最近使用 Vue 和 Openlayers 写了一个简单的小 dom ,用到了 Overlay 的弹窗功能,记录一下!

实验数据:test.xls

项目运行效果

创建元素:

  <div ref="popCon" id="popup" v-show="isShow"><!-- 弹出信息框 -->
    <span class="iconfont icon-guanbi" @click="closePop"></span>
    <ul id="info">
      <h4>基本信息</h4>
      <p>-------------------------------</p>
      <p>名称:{
  
  {name}}</p>
      <p>面积:{
  
  {output}}</p>
    </ul>
  </div>

引入依赖:

import 'ol/css';
import{ Overlay } from 'ol'

添加事件:

    getArea(){
  
Vue 项目中结合 OpenLayers 调用高德地图的地理编码 API 实现地理数据解析,需要完成以下几个步骤: ### ### 初始化 Vue 项目并集成 OpenLayers 首先,确保你的 Vue 项目已经创建,并安装 `ol`(OpenLayers)库: ```bash npm install ol ``` 然后,在 Vue 组件中初始化地图,加载高德地图作为底图图层: ```javascript import { Map, View } from &#39;ol&#39;; import TileLayer from &#39;ol/layer/Tile&#39;; import { get as getProjection } from &#39;ol/proj&#39;; import { bbox as bboxStrategy } from &#39;ol/loadingstrategy&#39;; import { OSM, XYZ } from &#39;ol/source&#39;; export default { name: &#39;MapComponent&#39;, mounted() { const amapLayer = new XYZ({ url: &#39;https://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}&#39;, subdomains: [&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;], }); const map = new Map({ target: &#39;map&#39;, layers: [ new TileLayer({ source: amapLayer, }), ], view: new View({ center: [120, 30], zoom: 4, projection: getProjection(&#39;EPSG:4326&#39;), }), }); }, }; ``` ### ### 配置高德地理编码 API 高德地图的地理编码 API 提供了将地址转换为地理坐标(正向编码)以及将坐标转换为地址(逆向编码)的功能。要使用这些功能,需要在 Vue 项目中通过 HTTP 请求调用高德 API。 #### 地理编码(正向编码) 使用 `axios` 或 `fetch` 请求高德地理编码 API: ```javascript import axios from &#39;axios&#39;; async function geocodeAddress(address) { const key = &#39;YOUR_AMAP_API_KEY&#39;; const url = `https://restapi.amap.com/v5/geocode/geo?address=${encodeURIComponent( address )}&key=${key}`; try { const response = await axios.get(url); const data = response.data; if (data.status === &#39;1&#39; && data.count > 0) { const location = data.geocodes[0].location.split(&#39;,&#39;); return { lon: parseFloat(location[0]), lat: parseFloat(location[1]) }; } } catch (error) { console.error(&#39;Geocoding error:&#39;, error); } } ``` #### 逆地理编码 逆地理编码用于将地理坐标转换为地址信息: ```javascript async function reverseGeocode(lat, lon) { const key = &#39;YOUR_AMAP_API_KEY&#39;; const url = `https://restapi.amap.com/v5/geocode/regeo?location=${lon},${lat}&key=${key}`; try { const response = await axios.get(url); const data = response.data; if (data.status === &#39;1&#39;) { return data.regeocode.formatted_address; } } catch (error) { console.error(&#39;Reverse geocoding error:&#39;, error); } } ``` ### ### 在 OpenLayers 地图上展示地理编码结果 当获取到地理坐标后,可以使用 OpenLayers 将结果展示在地图上: ```javascript import { fromLonLat } from &#39;ol/proj&#39;; import Feature from &#39;ol/Feature&#39;; import Point from &#39;ol/geom/Point&#39;; import { Style, Icon } from &#39;ol/style&#39;; function displayMarker(map, lon, lat, address) { const coordinate = fromLonLat([lon, lat]); const feature = new Feature(new Point(coordinate)); const iconStyle = new Style({ image: new Icon({ anchor: [0.5, 1], src: &#39;https://openlayers.org/en/latest/examples/data/icon.png&#39;, }), }); feature.setStyle(iconStyle); map.getSource().addFeature(feature); // 出信息 const popup = document.createElement(&#39;div&#39;); popup.className = &#39;popup&#39;; popup.innerHTML = address; const overlay = new Overlay({ element: popup, positioning: &#39;bottom-center&#39;, stopEvent: false, }); map.addOverlay(overlay); overlay.setPosition(coordinate); } ``` ### ### 注意事项 - 高德地图 API 在中国境内使用效果较好,但在欧美等国家可能不支持或返回信息不准确[^1]。 - 调用高德 API 需要申请 Key,个人账户每天最多可调用 3000 次[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值