地图:leaflet基本使用
leaflet:一个开源并且对移动端友好的交互式地图 JavaScript 库
中文文档:https://leafletjs.cn/reference.html
官网(英文):https://iclient.supermap.io/examples/leaflet/examples.html#iServer
该项目基于vue3+ts搭建
项目地址 gitee:https://gitee.com/philippines-kisses-snow/leaflet-map
地图组成与名词解释
建议在学习之前先了解一些相关名词,以便理解:
高德官网的名词解释:https://lbs.amap.com/api/javascript-api/guide/abc/components
效果:

下载库:
npm i leaflet
引入css:
// main.ts
import "leaflet/dist/leaflet.css"
在组件中使用leaflet:
- 引入:
import L from 'leaflet'
若引入时leaflet没有类型文件报错,需在.d.ts文件中加入:
// shims-vue.d.ts
declare module 'leaflet';
- 添加HTML地图节点,节点需要有宽高
<div id="map"></div>
- 初始化:
import { onMounted } from 'vue';
/*
* layer: 地图切片地址,用于显示地图,该切片地址为高德地图使用的地址
* 具体出处在高德官网并未找到,从相关博客推测可能是某个大佬抓包或其他方式获取到的
* 相关博客:https://blog.csdn.net/fredricen/article/details/77189453
*/
const layer = L.tileLayer('http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}')
let map: any = {}
onMounted(() => {
// 'map'为HTML节点id
map = L.map('map', {
center: [30.745922638363268, 104.00415658374735],//中心坐标
zoom: 10,//缩放级别
zoomControl: true, //缩放组件
attributionControl: false, //去掉右下角logol
layers: [layer],//图层
})
})
效果:

- 将地图点位到指定点,并放大16倍(可显示街道)
map.setView([30.745922638363268, 104.00415658374735], 16)
效果:

5. 添加标记
(1)直接添加,官网当中是直接建立一个标记,并添加到地图(不推荐,不好管理)
L.marker([50.5, 30.5]).addTo(map);
(2)添加一个要素组,将标记添加到要素组里面管理(推荐)
// 添加标记组
let featureGroup: any = {}
featureGroup = L.featureGroup().addTo(map)
// 设置标记点:[纬度, 经度]
const marker = L.marker([30.745922638363268, 104.00415658374735])
featureGroup.addLayer(marker)
若标记后报错:

在引入时还需要独引入图片并更改默认Icon:
import L from 'leaflet'
// 图片
import _ICON from 'leaflet/dist/images/marker-icon.png';
import _ICONSHADOW from 'leaflet/dist/images/marker-shadow.png';
/*
* 测试过几组数据,当使用自定义icon时,若不配置iconSize、iconAnchor,图标会在放大地图时位置发送偏移
* iconAnchor:图标 "tip" 的坐标(相对于其左上角),该值大致为:[iconSize宽的一半,iconSize高]
* iconAnchor需要在配置iconSize之后才会生效
* popupAnchor:标记的弹出框的位置(使用默认弹出框时需要
* popupAnchor若不配置,则默认为经纬度位置,会遮盖标记图标,-50表示将弹出框相对于经纬度位置向上移动50px
*/
let _L_DEFAULT_ICON = L.icon({
iconUrl: _ICON,
shadowUrl: _ICONSHADOW,
iconSize: [25, 41],
iconAnchor: [12, 40],
popupAnchor: [0, -50]
});
L.Marker.prototype.options.icon = _L_DEFAULT_ICON
(3)给标记添加事件与弹出框-bindPopup(只支持简单添加)
// 给标记添加事件
marker.on('click', () => { })
// 给标记添加弹出框
marker.bindPopup('弹出内容').openPopup();
(4)给标记添加事件与弹出框-popup(高级用法)
marker.on('click', () => {
// 可在点击标记后发起请求,请求成功后弹出框显示请求内容
// 创建弹出框:弹出框默认从经纬度位置弹出,会遮盖图标,可使用offset设置偏移量:[x轴偏移量, y轴偏移量]
L.popup({ offset: [0, -50] })
.setLatLng(marker.getLatLng()) //设置弹出框弹出位置
.setContent('请求内容')
.openOn(map);
})
- 清除标记
if(featureGroup) featureGroup.clearLayers();
- 添加连线
// 再添加一个要素组,要素组可存在多个
let lineFeatureGroup: any = {}
lineFeatureGroup = L.featureGroup().addTo(map)
const locations = [
[30.745922638363268, 104.00415658374735],
[30.725309888823382, 104.03297424316408]
]
var polyline = L.polyline(locations, {color: 'red'}).addTo(map);
lineFeatureGroup.addLayer(polyline)
- 清除连线
if(lineFeatureGroup) lineFeatureGroup.clearLayers();
完整demo代码(代码已上传gitee)
<template>
<div class="hello">
<div id="map"></div>
<div class="controls">
<div class="fc">
地图点击:
<input type="radio" name="mapclick" :value="1" v-model="mapClick">开
<input class="ml15" type="radio" name="mapclick" :value="0" v-model="mapClick">关
</div>
</div>
</div>
</template>
<script setup lang="ts">
import L from 'leaflet'
import { onMounted, ref } from 'vue';
import _ICON from 'leaflet/dist/images/marker-icon.png';
import _ICONSHADOW from 'leaflet/dist/images/marker-shadow.png';
/*
* 测试过几组数据,当使用自定义icon时,若不配置iconSize、iconAnchor,图标会在放大地图时位置发送偏移
* iconAnchor:图标 "tip" 的坐标(相对于其左上角),该值大致为:[iconSize宽的一半,iconSize高]
* iconAnchor需要在配置iconSize之后才会生效
* popupAnchor:标记的弹出框的位置(使用默认弹出框时需要
* popupAnchor若不配置,则默认为经纬度位置,会遮盖标记图标,-50表示将弹出框相对于经纬度位置向上移动50px
*/
let _L_DEFAULT_ICON = L.icon({
iconUrl: _ICON,
shadowUrl: _ICONSHADOW,
iconSize: [25, 41],
iconAnchor: [12, 40],
popupAnchor: [0, -50]
});
L.Marker.prototype.options.icon = _L_DEFAULT_ICON
const locations = [[30.745922638363268, 104.00415658374735], [30.725309888823382, 104.03297424316408]]
const layer = L.tileLayer('http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}')
const mapClick = ref(1)
let map: any = {}
let featureGroup: any = {}
let lineFeatureGroup: any = {}
onMounted(() => {
// 初始化地图
map = L.map('map', {
center: [30.745922638363268, 104.00415658374735],//中心坐标
zoom: 10,//缩放级别
zoomControl: true, //缩放组件
attributionControl: false, //去掉右下角logol
layers: [layer],//图层
})
// 将视图点位到指定点,并放大16倍
map.setView([30.745922638363268, 104.00415658374735], 16)
// 地图点击
map.on('click', (e: any) => {
if(mapClick.value) {
const latlng = e.latlng
locations.push([latlng.lat, latlng.lng])
// 清除要素
if(featureGroup) featureGroup.clearLayers();
locations.forEach(item => {
point(item)
})
}
})
// 添加地图要素组
featureGroup = L.featureGroup().addTo(map)
lineFeatureGroup = L.featureGroup().addTo(map)
// 设置初始打点
locations.forEach(item => {
point(item)
})
setPolyLine()
})
const point = (arr: number[]) => {
// 设置点标记:[纬度, 经度]
const marker = L.marker(arr)
// 给标记添加事件
marker.on('click', () => {
// 创建弹出框:弹出框默认从经纬度位置弹出,会遮盖图标,可使用offset设置偏移量:[x轴偏移量, y轴偏移量]
L.popup({ offset: [0, -50] })
.setLatLng(marker.getLatLng())
.setContent(arr[0] + ': ' + arr[1])
.openOn(map);
})
// 将标记添加到要素组
featureGroup.addLayer(marker)
}
const setPolyLine = () => {
var polyline = L.polyline([locations[0], locations[1]], {color: 'red'}).addTo(map);
lineFeatureGroup.addLayer(polyline)
}
</script>
<style scoped>
.hello, #map {
height: 100%;
width: 100%;
}
.hello {
position: relative;
}
.controls {
position: absolute;
right: 0;
top: 0;
padding: 15px;
z-index: 1000;
font-size: 14px;
background-color: #fff;
}
.fc {
display: flex;
align-items: center;
}
.ml15 {
margin-left: 15px;
}
.mr15 {
margin-right: 15px;
}
</style>
地图:leaflet基本使用的更多相关文章
- R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)
好久没有学习R的新包了,甚是想念啊! 昨天.今天看到两个极好.不得不学的packages+早上被AWS的服务器整得郁闷ing-于是就来点颜色看看~ 本篇受Lchiffon老师的github启发,对两个 ...
- JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)
JavaScript资源大全中文版(Awesome最新版) 目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框 ...
- JavaScript资源大全
目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框架 模板引擎 数据可视化 编辑器 UI 输入 日历 选择 文件上 ...
- Awesome Javascript(中文翻译版)
[导读]:GitHub 上有一个 Awesome – XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架 ...
- javascript功能插件大集合,写前端的亲们记得收藏
伯乐在线已在 GitHub 上发起「JavaScript 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-javascript-cn ...
- echarts3结合openlayers2实现Map类型图表
网上查阅了部分资料,有些是用echarts2实现的,因echarts2无法满足项目中其他部分的要求,故只能采用echarts3(2017/9/18,echarts3官网突然把基于geo的demo下架了 ...
- JavaScript 资源大全中文版
我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加 ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...
- awesome-javascript
一系列令人敬畏的浏览器端JavaScript库,资源和闪亮的东西. 令人敬畏的JavaScript 包管理员 装载机 捆扎机 测试框架 QA工具 MVC框架和库 基于节点的CMS框架 模板引擎 文章/ ...
- javascript功能插件大集合 前端常用插件 js常用插件
转载来源:https://github.com/jobbole/aw... 包管理器管理着 javascript 库,并提供读取和打包它们的工具.•npm – npm 是 javascript 的包管 ...
随机推荐
- 2020年第11届蓝桥杯C/C++B组 第二轮省赛
# JJU-干干 试题A :门牌制作[问题描述]小蓝要为一条街的住户制作门牌号.这条街一共有 2020 位住户,门牌号从 1 到 2020 编号.小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符 ...
- 将npm安装镜像切换到淘宝
cnpm(推荐) 安装 pm install cnpm -g --registry=https://registry.npm.taobao.org 使用 cnpm install [xxxxxxx] ...
- Vant+小程序+购物车实例
图片实例,看是否是您所需要的喔.... 扫码小程序可看实例操作,有啥问题也可扫码加群,很希望可以帮助到你喔! HTML部分: <view class="cart&q ...
- == 和 equal 的区别
== 比较的是两个对象的索引是否相同: equal 比较的是两个对象内容是否相同: int a = 1;long b = 1L;a==b? 答案是 对:因为a和b指向的索引地址相同. 再例如 Stri ...
- 决策树(DecisionTree)(附源码)
决策树(DecisionTree) 决策树所属类别:监督学习,分类 优点:直观易懂,算法简单 缺点:容易过拟合,对连续型数据不太容易实现 实现方案:ID3,CART,C4.5 详细的资料见连接:别 ...
- white-space: pre-line;的坑
html模版解析换行 这是字符串 跟标签设置white-space: pre-line: pre兼容ie8,pre-line不兼容ie 6-7 这行文字开头是没有空格的但是还是有很大的空格,代码方法截 ...
- 华为云服务器搭建FTP后,内网访问无法连接。
总结:1.内网访问公网需要用被动模式 2.云服务器需要放开除20.21以外的部分端口,指定范围 3.PASV IP配置为云服务器的弹性公网IP 4.局域网使用主动模式连接FTP,客户端需要关闭防火墙, ...
- Leecode 206.反转链表(Java)
想法: 1.设链表长度为n,如5,头节点head,则最后一个元素位置为head-1. 错误,发现行不通,此为链表非数组,存储位置不连续 2.设两个指针p,q,让p,q指向head,再 ...
- SQL 2019 卸载方法
一.关闭服务 1. win+r services.msc 打开服务,关闭与SQL有关的服务内容. 二.卸载应用 1.win+r control 打开控制面板---卸载程序---卸 ...
- pycharm conmunity 2022.1没有mange repositories,只能使用命令方式修改镜像源(长期可信)
https://blog.csdn.net/qq_43625764/article/details/124656990