zoukankan      html  css  js  c++  java
  • 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;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

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

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

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

  • 相关阅读:
    Node Js
    动态遍历接收的参数
    负载均衡和springcloud.Ribbon
    Spring Cloud
    springboot整合hibernate
    python模块知识总结
    什么是netty--通俗易懂
    IDEA 的操作与使用
    spring 整合guava
    log4j向指定文件输出日志
  • 原文地址:https://www.cnblogs.com/zsslll/p/6644979.html
Copyright © 2011-2022 走看看