<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"
integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A=="
crossorigin="" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"
integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA=="
crossorigin=""></script>

<div id="map" style="width: 600px; height: 400px;"></div>
@*<input type="button" id="circle" value="绘制圆" onclick="drawCircle()" />
<input type="button" value="绘制多边形" onclick="drawPolygon()">
<input type="button" id="clear" value="清除圆形" onclick="removeCircle()" />
<input type="button" id="clear" value="清除多边形" onclick="removePolygon()" />
<input type="button" id="clearAll" value="全部清除" onclick="removeAll()" />*@
<input type="button" id="clear" value="加" onclick="add()" />
<input type="button" id="clearAll" value="减" onclick="reduce()" />

<script>
var map = L.map('map').setView([30.3367385888597, 120.135198302847], 13);
var wpUrl = 'http://rt0.map.gtimg.com/realtimerender?z={z}&x={x}&y={-y}&type=vector&style=0';

L.tileLayer(wpUrl, {
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

var LeafIcon = L.Icon.extend({
options: {
shadowUrl: '/Img/leaf-shadow.png',
iconSize: [38, 95],
shadowSize: [50, 64],
iconAnchor: [22, 94],
shadowAnchor: [4, 62],
popupAnchor: [-3, -76]
}
});

var greenIcon = new LeafIcon({ iconUrl: '/Img/leaf-green.png' }),
redIcon = new LeafIcon({ iconUrl: '/Img/leaf-red.png' });

L.marker([30.3367385888597, 120.135198302847], { icon: greenIcon }).bindPopup("I am a green leaf.").addTo(map);
L.marker([30.3381806108297, 120.140808207925], { icon: redIcon }).bindPopup("I am a red leaf.").addTo(map);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

//初始化数据
var defaultVal = 1;
var defaultSite = [30.3367385888597, 120.135198302847];

var point = []; //多边形集合
point.push([30.2993660256245, 120.154368710801]);
point.push([30.3500857043154, 120.157951567494]);
point.push([30.3126058061275, 120.12189508822]);
point.push([30.3028305920692, 120.12263712889]);
point.push([30.2993660256245, 120.154368710801]);

var tempCircle = new L.circle();
DrawCircle(defaultVal, defaultSite);

function add() {
defaultVal = defaultVal + 1;
DrawCircle(defaultVal, defaultSite);
}
function reduce() {
defaultVal = defaultVal - 1;
DrawCircle(defaultVal, defaultSite);
}

//圆形
function DrawCircle(r, globalSite) {
map.removeLayer(tempCircle);
tempCircle.setLatLng(globalSite)
tempCircle.setRadius(r * 1000)
tempCircle.setStyle({ color: '#ff0000', fillColor: '#28FF28', fillOpacity: 0.3 })
map.addLayer(tempCircle)
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

var lines = new L.polyline([]);
var geometry = [];
var node;
var tempLines = new L.polyline([], { dashArray: 5 });

DrawPolygon();
//多边形
function DrawPolygon() {
$.each(point, function (index, item) {
node = L.circle(item, { color: '#ff0000', fillColor: 'ff0000', fillOpacity: 1 })
lines.addLatLng(item);
map.addLayer(tempLines);
map.addLayer(lines);
map.addLayer(node);
geometry.push(node);
});

geometry.push(L.polygon(point).addTo(map));

}
</script>
<script>
////读取点击位置坐标并返回其经纬度
//// function onMapClick(e) { alert("You clicked the map at " + e.latlng); }
////r用来存储半径,i用来存储圆心经纬度
////tempCircle是用来存放圆的图层,pop用来返回圆半径的弹窗
//var r;
//var i;
//var tempCircle;
//var pop;
////移除圆图层
//function removeCircle() {
// map.removeLayer(tempCircle);
//}
////绘制圆
//function drawCircle() {
// //在绘制圆之前需要先判断是否已经绘制过了,如果有,则清空再绘制
// //如果需要绘制多个圆,则不必此句
// if (tempCircle) {
// removeAll();
// }
// r = 0;
// i = null;
// tempCircle = new L.circle();
// map.dragging.disable();//将mousemove事件移动地图禁用
// //监听鼠标落下事件
// map.on('mousedown', onmouseDown);

// function onmouseDown(e) {
// //确定圆心
// i = e.latlng
// pop = L.popup().setLatLng(e.latlng);
// map.addLayer(pop);
// //监听鼠标移动事件
// map.on('mousemove', onMove);
// //监听鼠标弹起事件
// map.on('mouseup', onmouseUp);
// }
// function onMove(e) {
// r = L.latLng(e.latlng).distanceTo(i);//计算半径
// if (r < 5000) {
// if (i) {
// //绘制圆心位置与半径
// tempCircle.setLatLng(i)
// tempCircle.setRadius(r)
// tempCircle.setStyle({ color: '#ff0000', fillOpacity: 0 })
// map.addLayer(tempCircle)
// }
// //toFixed()方法用来保留两位小数(四舍五入)
// pop.setContent("绘制圆半径为:" + r.toFixed(2) + "米");;
// } else {
// r = 5000;
// if (i) {
// tempCircle.setLatLng(i)
// tempCircle.setRadius(r)
// tempCircle.setStyle({ color: '#ff0000', fillOpacity: 0 })
// map.addLayer(tempCircle)
// }
// pop.setContent("绘制圆半径为:" + r + "米");;
// }
// }
// function onmouseUp(e) {
// /* r = L.latLng(e.latlng).distanceTo(i); */
// map.removeLayer(pop);
// L.circle(i, { radius: r, color: '#ff0000', fillOpacity: 0 });
// map.addLayer(tempCircle);
// map.dragging.enable();

// map.setView(i, 13);

// i = null;
// r = 0;
// //取消监听事件
// map.off('mousedown');
// map.off('mouseup');
// map.off('mousemove');

// }
//}
////移除所有图层(包括圆和多边形)
//function removeAll() {
// removePolygon()
// removeCircle()
//}
</script>
<script>
////动态绘制多边形
//var points, geometry, lines, tempLines, node;
//function drawPolygon() {
// if (tempLines) {
// removePolygon();
// }
// map.doubleClickZoom.disable();
// lines = new L.polyline([]);
// tempLines = new L.polyline([], { dashArray: 5 });
// points = [];
// geometry = [];
// map.on('click', onClick); //点击地图
// map.on('dblclick', onDoubleClick);
// map.on('mousemove', onMove)//双击地图

// function onClick(e) {
// points.push([e.latlng.lat, e.latlng.lng])
// lines.addLatLng(e.latlng)
// map.addLayer(tempLines)
// map.addLayer(lines)
// node = L.circle(e.latlng, { color: '#ff0000', fillColor: 'ff0000', fillOpacity: 1 })
// map.addLayer(node)
// geometry.push(node)
// }
// function onMove(e) {
// if (points.length > 0) {
// ls = [points[points.length - 1], [e.latlng.lat, e.latlng.lng], points[0]]
// tempLines.setLatLngs(ls)
// // map.addLayer(tempLines)
// }
// }
// function onDoubleClick(e) {
// geometry.push(L.polygon(points).addTo(map))
// points = [];
// node = null;
// map.off('click', onClick); //点击地图
// map.off('dblclick', onDoubleClick);
// map.off('mousemove', onMove)//双击地图
// map.doubleClickZoom.enable();
// //isInPolygon(marker);
// }
//}
//function removeCircle() {
// map.removeLayer(tempCircle);
//}
//function removePolygon() {
// for (let ooo of geometry) {
// ooo.remove();
// }
// map.removeLayer(lines);
// map.removeLayer(tempLines);
//}
</script>

leaflet动态加载/手动绘制(圆、多边形)demo的更多相关文章

  1. CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类

    以英雄联盟为例.界面上经常有Load....xxxx.dll.一般都是加载子系统.比如装备系统.英雄系统等.在实际开发中很多项目非常庞大.都会分割成独立子解决方案开发.后期就需要加载回来.一般都是利用 ...

  2. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  3. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  4. js的动态加载、缓存、更新以及复用(一)

    使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些 ...

  5. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  6. Java_动态加载

    Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作,起初也遇到了很多困难.网上关于这方便的东西很零散,为了便于日后回过头来再看,于是我将这几天的心得 ...

  7. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  8. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  9. 【转】Android类动态加载技术

    http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...

  10. Android 动态加载 (一) 态加载机制 案例一

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

随机推荐

  1. Zabbix技术分享——使用docker-compose快速部署zabbix监控系统

    前面文章有提到过使用docker来快速拉起一个zabbix监控系统(详见:如何使用docker快速部署一个zabbix监控系统),但是要一个个执行docker启动命令去将对应的容器启动.如果要配置参数 ...

  2. 防御式编程之断言assert的使用

    防御式编程的重点就是需要防御一些程序未曾预料的错误,这是一种提高软件质量的辅助性方法,断言assert就用于防御式编程,编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设.使用断言是 ...

  3. Kafka教程(一)基础入门:基本概念、安装部署、运维监控、命令行使用

    Kafka教程(一)基础入门   1.基本概念   背景   领英->Apache   分布式.消息发布订阅系统   角色   存储系统   消息系统   流处理平台-Kafka Streami ...

  4. 【Shell案例】【while循环、正则表达式、sed、awk、grep】5、打印空行的行号

    描述写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始 示例:假设 nowcoder.txt 内容如下:ab c d e f 你的脚本应当输出:35791 ...

  5. 【每日一题】【模拟】2021年11月11日--LRU 缓存机制

    运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 .实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 L ...

  6. tcp/udp 协议特性和三次握手

    一.TCP/UDP协议特性1)TCP特性:工作在传输层.建立连接.可靠的.错误检查 2)UDP特性:工作在传输层.不需要连接.不可靠的.有限的错误检查.传输性能高 2.控制位及确认号解释 控制位:由6 ...

  7. Selenium4+Python3系列(十二) - 测试框架的设计与开发

    前言 自己从未没想过能使用python来做自动化测试框架的设计.开发. 可能有人会好奇说,六哥,你怎么也用python写测试框架了? 领导说: python你也没有实际工作经验,可能就是自己自学的. ...

  8. 同步与异步 multiprocessing 进程对象多种方法

    目录 同步与异步 阻塞与非阻塞 综合使用 创建进程的多种方式 前言 windows系统创建进程的问题(重要) multiprocessing模块之Process 展现异步 创建进程的方式(一):使用P ...

  9. linux系统部署微服务项目

    **:如果使用阿里云linux服务器 1.设置容器镜像服务 在阿里云平台搜索 "容器镜像服务" 选择"CentOS" 安装/升级Docker客户端 配置镜像加速 ...

  10. <一>C++ STL

    STL (standard template libaray - 标准模板库):是 C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架. 通俗来说:STL就 ...