zoukankan      html  css  js  c++  java
  • leaflet 实现 测距、测面、清除测量的功能

    参考文档:https://my.oschina.net/u/4321106/blog/3528070/print

    1、先定义需要用到的全局变量

     var DRAWING = false; //是否正在绘制
     var DRAWLAYERS = [];
     var BarDRAWLAYERS = [];
     var ISMEASURE = false; //是否是量距
     var MEASURETOOLTIP; //量距提示
     var MEASUREAREATOOLTIP; //量面提示
     var MEASURERESULT = 0; //测量结果
    
     var DRAWPOLYLINE; //绘制的折线
     var DRAWMOVEPOLYLINE; //绘制过程中的折线
     var DRAWPOLYLINEPOINTS = []; //绘制的折线的节点集
    
     var DRAWPOLYGON; //绘制的面
     var DRAWMOVEPOLYGON; //绘制过程中的面
     var DRAWPOLYGONPOINTS = []; //绘制的面的节点集

    2、测距

    <button type="button" class="btn btn-sm btn-default" id="juliMeasure">测距</button>
    $('#juliMeasure').click(function() {
        ISMEASURE = true;
        init.startDrawLine();
     }),
    startDrawLine(func) {
             MEASURERESULT = 0; //测量结果
             map.getContainer().style.cursor = 'crosshair';
             var shapeOptions = {
                     color: '#F54124',
                     weight: 3,
                     opacity: 0.8,
                     fill: false,
                     clickable: true
                 },
                 DRAWPOLYLINE = new L.Polyline([], shapeOptions); //绘制的折线
             map.addLayer(DRAWPOLYLINE);
             if (ISMEASURE) { //是否是量距
                 MEASURETOOLTIP = new L.Tooltip(map); //量距提示
             }
             map.on('mousedown', onClick);
             map.on('dblclick', onDoubleClick);
    
             function onClick(e) {
                 DRAWING = true; //是否正在绘制
                 DRAWPOLYLINEPOINTS.push(e.latlng); //绘制的折线的节点集
                 if (DRAWPOLYLINEPOINTS.length > 1 && ISMEASURE) { //是否是量距
                     MEASURERESULT += e.latlng.distanceTo(DRAWPOLYLINEPOINTS[DRAWPOLYLINEPOINTS.length - 2]);
                 }
                 DRAWPOLYLINE.addLatLng(e.latlng); //绘制的折线
                 map.on('mousemove', onMove);
             }
    
             function onMove(e) {
                 if (DRAWING) { //是否正在绘制
                     if (DRAWMOVEPOLYLINE != undefined && DRAWMOVEPOLYLINE != null) { //绘制过程中的折线
                         map.removeLayer(DRAWMOVEPOLYLINE);
                     }
                     var prevPoint = DRAWPOLYLINEPOINTS[DRAWPOLYLINEPOINTS.length - 1];
                     DRAWMOVEPOLYLINE = new L.Polyline([prevPoint, e.latlng], shapeOptions);
                     map.addLayer(DRAWMOVEPOLYLINE);
                     if (ISMEASURE) {
                         var distance = MEASURERESULT + e.latlng.distanceTo(DRAWPOLYLINEPOINTS[DRAWPOLYLINEPOINTS.length - 1]);
                         /* MEASURETOOLTIP.updatePosition(e.latlng); //量距提示
                          MEASURETOOLTIP.updateContent({
                              text: '单击确定点,双击结束!',
                              subtext: "总长:" + (distance / 1000).toFixed(2) + "公里"
                          });*/
                     }
                 }
             }
    
             function onDoubleClick(e) {
                 map.getContainer().style.cursor = '';
                 /*显示两点距离*/
                 var distance = MEASURERESULT + e.latlng.distanceTo(DRAWPOLYLINEPOINTS[DRAWPOLYLINEPOINTS.length - 1]);
                 marker = new L.Marker(e.latlng, { draggable: false });
                 map.addLayer(marker);
                 marker.bindPopup((distance / 1000).toFixed(2) + "公里").openPopup();
                 if (DRAWING) {
                     if (DRAWMOVEPOLYLINE != undefined && DRAWMOVEPOLYLINE != null) {
                         map.removeLayer(DRAWMOVEPOLYLINE);
                         DRAWMOVEPOLYLINE = null;
                     }
                     BarDRAWLAYERS.push(DRAWPOLYLINE);
                     DRAWPOLYLINEPOINTS = [];
                     DRAWING = false;
                     ISMEASURE = false;
                     map.off('mousedown');
                     map.off('mousemove');
                     map.off('dblclick');
                 }
             }
         },

    3、测面

    <button type="button" class="btn btn-sm btn-default" id="mianjiMeasure">测面</button>
     /*面积量算*/
        $('#mianjiMeasure').click(function() {
                ISMEASURE = true;
                init.startDrawPolygon()
         })
      /*多边形*/
         startDrawPolygon(func) {
             MEASURERESULT = 0;
             map.getContainer().style.cursor = 'crosshair';
             map.on('mousedown', function(e) {
                 DRAWING = true;
                 DRAWPOLYGONPOINTS.push(e.latlng);
                 DRAWPOLYGON.addLatLng(e.latlng);
             });
             map.on('mousemove', function(e) {
                 if (DRAWING) {
                     if (DRAWMOVEPOLYGON != undefined && DRAWMOVEPOLYGON != null) {
                         map.removeLayer(DRAWMOVEPOLYGON);
                     }
                     var prevPoint = DRAWPOLYGONPOINTS[DRAWPOLYGONPOINTS.length - 1];
                     var firstPoint = DRAWPOLYGONPOINTS[0];
                     DRAWMOVEPOLYGON = new L.Polygon([firstPoint, prevPoint, e.latlng], shapeOptions);
                     map.addLayer(DRAWMOVEPOLYGON);
                 }
             });
             map.on('dblclick', function(e) {
                 map.getContainer().style.cursor = '';
                 var tempPoints = [];
                 for (var i = 0; i < DRAWPOLYGONPOINTS.length; i++) {
                     tempPoints.push(DRAWPOLYGONPOINTS[i]);
                 }
                 tempPoints.push(e.latlng);
                 var distance = CalArea(tempPoints);
                  marker = new L.Marker(e.latlng, { draggable: false });
                 map.addLayer(marker);
                 marker.bindPopup("总面积:" + (distance / 1000000).toFixed(3) + '平方公里').openPopup();
                 if (DRAWING) {
                     if (DRAWMOVEPOLYGON != undefined && DRAWMOVEPOLYGON != null) {
                         map.removeLayer(DRAWMOVEPOLYGON);
                         DRAWMOVEPOLYGON = null;
                     }
                     BarDRAWLAYERS.push(DRAWPOLYGON);
                     if (func) {
                         func(DRAWPOLYGONPOINTS);
                     }
                     DRAWPOLYGONPOINTS = [];
                     DRAWING = false;
                     ISMEASURE = false;
                     map.off('mousedown');
                     map.off('mousemove');
                     map.off('dblclick');
                 }
             });
             var shapeOptions = {
                     color: '#F54124',
                     weight: 3,
                     opacity: 0.8,
                     fill: true,
                     fillColor: null,
                     fillOpacity: 0.2,
                     clickable: true
                 },
    
                 DRAWPOLYGON = new L.Polygon([], shapeOptions);
             map.addLayer(DRAWPOLYGON);
             if (ISMEASURE) {
                 MEASUREAREATOOLTIP = new L.Tooltip(map);
             }
    
             function CalArea(latLngs) {
                 var pointsCount = latLngs.length,
                     area = 0.0,
                     d2r = Math.PI / 180,
                     p1, p2;
                 if (pointsCount > 2) {
                     for (var i = 0; i < pointsCount; i++) {
                         p1 = latLngs[i];
                         p2 = latLngs[(i + 1) % pointsCount];
                         area += ((p2.lng - p1.lng) * d2r) *
                             (2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
                     }
                     area = area * 6378137.0 * 6378137.0 / 2.0;
                 }
                 return Math.abs(area);
             }
         },

    4、清除测量

    <button type="button" class="btn btn-sm btn-default" id="clearMeasure">清除</button>
    /*清除量算*/
     $('#clearMeasure').click(function() {
           init.qingchu()
      })
    qingchu(func) {
             for (var i = 0; i < BarDRAWLAYERS.length; i++) {
                 map.removeLayer(BarDRAWLAYERS[i]);
             }
             BarDRAWLAYERS = [];
             if (marker) {
                 map.removeLayer(marker)
             }
         }
  • 相关阅读:
    基于JavaFXWJFXGameEngine游戏引擎介绍与进度
    进程线程与cpu绑定
    [Vim练级攻略] Vim基础操作
    hdu 2159 fate
    python的httplib注意事项
    SQL优化总结
    项目整体开发流程以及配置人员
    hdu 1010 解题报告 Tempter of the Bone
    在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
    int 和bigint差别有多大?
  • 原文地址:https://www.cnblogs.com/houBlogs/p/13503102.html
Copyright © 2011-2022 走看看