002 Leaflet 第二个demo 地图上的矩形拉框选择

一、使用到的文件

leaflet-src.js

leaflet.css

label相关js, 可以从以下网址下载

https://github.com/Leaflet/Leaflet.label

需要leaflet的相关插件都可以从http://leafletjs.com/plugins.html  leafletjs.com的插件列表中下载

二、源码

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="label/libs/leaflet/leaflet.css" />
    <link rel="stylesheet" href="label/leaflet.label.css" />
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="label/libs/leaflet/leaflet-src.js"></script>
    <script src="label/src/Label.js"></script>
    <script src="label/src/BaseMarkerMethods.js"></script>
    <script src="label/src/CircleMarker.Label.js"></script>
    <script src="label/src/Map.Label.js"></script>
  </head>
  <body>
    <div id="map" style="height:500px;width:500px;"></div>
    <button id="rectangleSel" > 拉框选择 </button>
    <script>
        var map;
        $(function(){
            map = L.map(‘map‘, {
                center: [40, 100],
                zoom: 4
            });
            // 影像
            L.tileLayer("http://t{s}.tianditu.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles", {
                subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"]
            }).addTo(map);
            // 地名标注
            L.tileLayer("http://t{s}.tianditu.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles", {
                subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"]
            }).addTo(map);
            // 边界
            L.tileLayer("http://t{s}.tianditu.cn/ibo_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=ibo&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles", {
                subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"]
            }).addTo(map);
            $("#rectangleSel").unbind(‘click‘).bind(‘click‘,function(){
                map.on(‘mousedown‘, rectangleMeasure.mousedown).on(‘mouseup‘, rectangleMeasure.mouseup);
            });
            console.log(map);
        });
         var rectangleMeasure = {
            startPoint: null,
            endPoint: null,
            rectangle:null,
            tips:null,
            layer: L.layerGroup(),
            color: "#0D82D7",
            addRectangle:function(){
                rectangleMeasure.destory();
                var bounds = [];
                bounds.push(rectangleMeasure.startPoint);
                bounds.push(rectangleMeasure.endPoint);
                rectangleMeasure.rectangle = L.rectangle(bounds, {color: rectangleMeasure.color, weight: 1});
                rectangleMeasure.rectangle.addTo(rectangleMeasure.layer);        

                var northWestPoint = rectangleMeasure.rectangle.getBounds().getNorthWest(),
                    northEastPoint = rectangleMeasure.rectangle.getBounds().getNorthEast(),
                    southEastPoint = rectangleMeasure.rectangle.getBounds().getSouthEast();
                var width = northWestPoint.distanceTo(northEastPoint)/1000,
                    height = northEastPoint.distanceTo(southEastPoint)/1000;
                    console.log("宽", width);
                    console.log("高", height);
                var area = Number(width) * Number(height);
                rectangleMeasure.addTips(area.toFixed(3));
                rectangleMeasure.layer.addTo(map);
            },
            addTips:function(area){
                console.log(‘面积:‘+area);
                rectangleMeasure.tips = L.circleMarker(rectangleMeasure.endPoint, {color: rectangleMeasure.color});
                rectangleMeasure.tips.setRadius(1);
                rectangleMeasure.tips.bindLabel("面积:" + area + "(平方公里)", {noHide: true, direction: ‘right‘, clickable: true, className: "leaflet-label-tffq"});
                rectangleMeasure.tips.addTo(rectangleMeasure.layer);
            },
            close:function(){
                var lab = rectangleMeasure.tips.getLabel();
                var tt = document.createTextNode(rectangleMeasure.tips.getLabel()._content);
                lab._container.innerHTML = "";
                lab._container.appendChild(tt);
                var span = document.createElement("span");
                span.innerHTML = "【关闭】";
                span.style.color = "#00ff40";
                lab._container.appendChild(span);
                L.DomEvent.addListener(span,"click",function(){
                    rectangleMeasure.destory();
                });
            },
            mousedown: function(e){
                rectangleMeasure.rectangle = null;
                rectangleMeasure.tips = null;
                map.dragging.disable();
                rectangleMeasure.startPoint = e.latlng;
                map.on(‘mousemove‘,rectangleMeasure.mousemove)
            },
            mousemove:function(e){
                rectangleMeasure.endPoint = e.latlng;
                rectangleMeasure.addRectangle();
                map.off(‘mousedown ‘, rectangleMeasure.mousedown).on(‘mouseup‘, rectangleMeasure.mouseup);
            },
            mouseup: function(e){
                rectangleMeasure.close();
                map.dragging.enable();
                map.off(‘mousemove‘,rectangleMeasure.mousemove).off(‘mouseup‘, rectangleMeasure.mouseup).off(‘mousedown‘, rectangleMeasure.mousedown);
            },
            destory:function(){
                if(rectangleMeasure.rectangle)
                    rectangleMeasure.layer.removeLayer(rectangleMeasure.rectangle);
                if(rectangleMeasure.tips)
                    rectangleMeasure.layer.removeLayer(rectangleMeasure.tips);
            }
         }
    </script>
  </body>
</html>

三、流程讲解

1、rectangleSel事件-->监听click,mousemove, mouseup事件,设置地图拖动为false

2、click-->画一个点p1

3、mousemove-->依据当前的点p2 和 click时画的点p1,在地图上画矩形框

4、mouseup --> 添加面积信息label, 取消click,mousemove, mouseup的事件监听,恢复地图拖动为true

本次的学习就到这里啦,可以发散脑洞,想出更好的点子。以便更清晰的记忆一些事情。

突然想到了我很喜欢的一句话,最后分享一下吧。希望有人可以看到这里,绿色是什么的颜色。嫩绿色就像我的职场生涯才刚刚开始一样。

苟日新,日日新,又日新。

时间: 2024-12-21 01:01:07

002 Leaflet 第二个demo 地图上的矩形拉框选择的相关文章

003 Leaflet 第三个demo 地图上的面积测量

一.使用到的文件 leaflet-src.js Leaflet.Editable.js leaflet-measure-path.js leaflet.css leaflet-measure-path.css 面积测量区别于拉框测量面积而言,重点在于面积的计算上面,咨询了gis的小伙伴们,放才知道让用户随意框选形状,计算面积时个复杂的逻辑. 既然是复杂的逻辑,看来不适合自己造个轮子玩. 所以今天借助了一个插件leaflet-measure-path 插件的下载地址:https://github.

html5定位并在百度地图上显示

在开发移动端 web 或者webapp时,使用百度地图 API 的过程中,经常需要通过手机定位获取当前位置并在地图上居中显示出来,这就需要用到html5的地理定位功能. navigator.geolocation.getCurrentPosition(callback); 在获取坐标成功之后会执行回调函数 callback; callback 方法的参数就是获取到的坐标点:然后可以初始化地图,设置控件.中心点.缩放等级,然后给地图添加point的overlay: var map = new BM

通过百度地图API显示当前位置在地图上(图标显示)--第三方开源--百度地图(二)

1.下载百度地图的demo,下载地址:http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar 2.把demo里面的BaiduMapsApiDemo解压,把BaiduMapsApiDemo文件夹里面的libs里面的所有文件都复制到自己的项目的libs里面 3.配置Andro

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报 登录   注册 www.open-open.com/libOPEN经验 投稿 全部经验分类  Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类  >  开发语言与工具  >  移动开发  

通过地图上两个点的经纬度测算两点的距离

根据两点经纬度计算距离 这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的 假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作"赤道".在赤道的南北两边,画出许多和赤道平行的圆圈,就是"纬圈":构成这些圆圈的线段, 叫做纬线.我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬. 北极就是北纬90度,南极就是南纬90度.纬度的高低也标志着气候的冷

百度地图开发-将多个地点标记在地图上,点击节点弹出PopupWindow

最近在写一个安卓程序,用到了百度地图API的一些内容,就随便玩耍了一下. 这个DEMO是用来将多个地点标记在地图上,然后点击节点弹出PopupWindow 下面是一些截图: main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout

利用HTML5定位功能,实现在百度地图上定位

利用HTML5定位功能,实现在百度地图上定位 代码如下: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>HTML5定位</title>     <script type="text/javascript" src="http://lib.sinaapp

利用HTML5定位功能,实现在百度地图上定位(转)

原文:利用HTML5定位功能,实现在百度地图上定位 代码如下: 测试浏览器:ie11定位成功率100%,Safari定位成功率97%,(add by zhj :在手机上测试(用微信内置浏览器打开),无论使用WIFI还是移动4G联网, 定位精度都是蛮高的,误差在几十米内) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>

【百度地图API】建立全国银行位置查询系统(三)——如何在地图上添加银行标注

原文:[百度地图API]建立全国银行位置查询系统(三)--如何在地图上添加银行标注 <摘要>你将在第三章中学会以下知识: 如何在地图上添加带银行logo的标注?(你也可以换成商场logo,酒店logo等) 如何在标注上显示信息窗口,以及添加文字标签等其他覆盖物: 最后,介绍一个获取坐标的给力工具. ---------------------------------------------------------------------------------------------------