美文网首页
SuperMap如何实现测量距离

SuperMap如何实现测量距离

作者: 愤怒的阿昆达 | 来源:发表于2020-04-17 11:19 被阅读0次

超图中实现测距功能

效果如下:
image.png
实现代码:

1.构造map时,map.events.register("mousemove", undefined,mousePoint);注册监听鼠标mousemove,这里主要为解决测距时提示框遮挡鼠标点击事件用的。

//构造地图
function initWorldMap(){
    var mapControls = [
        new SuperMap.Control.ScaleLine({
            isImperialUnits:false
        }),
        new SuperMap.Control.Zoom(),
        new SuperMap.Control.Navigation({
            dragPanOptions: {
                enableKinetic: true
            }
        })
    ];

    if(location.hostname == "localhost") mapControls.push(new SuperMap.Control.LayerSwitcher());
    map = new SuperMap.Map(
        "map",{controls:mapControls},{theme: null}
    );
    map.allOverlays = true;
    map.minZoom = 1;
    map.maxZoom = 19;
    layerWorld= new SuperMap.Layer.CloudLayer();
    layerWorld.resolutions = null;
    layerWorld.displayInLayerSwitcher = false;
    map.addLayers([layerWorld,lineLayer, layerMineLevel,layerAreaLevel]);
    map.setCenter(new SuperMap.LonLat(11339634, 4588716), LEVEL_NONE);
    //在map中注册监听mousemove
    map.events.register("mousemove", undefined,mousePoint);
}

2.测距部分代码:

//测距功能-start
var measure = {},measurement = {},measurementClick = [];//测距doubleClick结果对象、测距move实时对象、测距click单击实时对象
var control;
var clickTimes=0;//测距click单击次数
var mouseMovePoint={};//记录当前鼠标移动到的位置

$scope.stopDistanceMeasure =  function() {
    if(control)control.deactivate();//注销控件
    destroyMeasurePopup();
    destroyMeasurementPopup();
    destroyMeasurementClickPopup();
}
function destroyMeasurePopup() {//销毁双击后的弹窗
    if(measure.popup)
        measure.popup.destroy();
    measure = {};
}
function destroyMeasurementPopup(){//销毁移动中的弹窗
    if(measurement.popup)
        measurement.popup.destroy();
    measurement = {};
}
function destroyMeasurementClickPopup(){//销毁单击后的弹窗
    if(measurementClick!=undefined && measurementClick!=null){
        for(var i=0;i<measurementClick.length;i++){
            if(measurementClick[i].popup)
                measurementClick[i].popup.destroy();
            //measurementClick[i] = {};
        }
        measurementClick = [];
        clickTimes=0;
    }
}

function mousePoint(e) {//需在map中注册监听mousemove
    mouseMovePoint = e.xy;
}

$scope.distanceMeasure = function() {
    $scope.stopDistanceMeasure();
    var measureControls = {//实例化 measureControls 控件,用于测量距离和面积
        line:new SuperMap.Control.Measure(//距离量算
            SuperMap.Handler.Path, {
                persist:true,//是否在量算结束后保留绘制的要素。当新的量算开始,控件取消激活获取取消量算时会清除绘制的要素。默认为:false,不保留
                immediate:true//当该属性为true时,量算过程中时时显示结果,同时会触发 “measurepartial” 事件。默认为false
            }
        )
    };
    //量算完成时触发 measure 事件,当点被添加到量算过程中时触发 measurepartial
    for(var key in measureControls){
        control = measureControls[key];
        control.events.on({
            "measure": handleMeasure,
            "measurepartial": handleMeasurements
        });
        //添加控件到 map 上
        map.addControl(control);
    }
    //激活控件
    control.activate();
}
//测量completed调用
function handleMeasure(event) {
    console.log('handleMeasure');
    destroyMeasurePopup();
    destroyMeasurementPopup();
    var points = event.geometry.components;
    measure.longitude = points[points.length-1].x;
    measure.longlat = points[points.length-1].y;
    var distance = event.measure;
    var unit = event.units;
    if(unit == 'km')distance = distance*1000;
    var css = "border: none;" +
        "padding: 3px;" +
        "padding-top: 3px;";
    var measureContent =
        "<div id='deleteMeasure' style='font-size: 12px;'>" +
            "<div style='font-size: 12px;float:left;'>" +
            "<span>总长:<span style='color:#ff4500'>" + Number(distance.toFixed(2)) +"</span>米 </span>" +
            "</div>" +
            "<div style='font-size: 12px;float:right;'>" +
            "<i class=\"fa fa-times\" style=\""+css+"\" aria-hidden=\"true\"></i>" +
            "</div>" +
        "</div>"
    var popup = new SuperMap.Popup.Anchored("measureDoubleClickWin",
        new SuperMap.LonLat(measure.longitude, measure.longlat),
        new SuperMap.Size(12,16),
        measureContent,
        null,
        false,
        null);
    popup.autoSize = true;
    measure.popup = popup;
    popup.setBorder("solid 1px red");
    map.addPopup(popup);
    $("#measureDoubleClickWin").css("height","");
    $("#measureDoubleClickWin_GroupDiv").css("height","");
    $("#measureDoubleClickWin_contentDiv\n").css("height","");
    $("#measureDoubleClickWin").css("margin-top","10px");
    $("#deleteMeasure").click($scope.stopDistanceMeasure);
}
//测量ing调用
function handleMeasurements(event) {
    var type = event.type;//获取传入参数 event 的 type 信息(click指示的是点击事件,move指示的是移动事件)
    if(type == 'move'){
        destroyMeasurePopup();
        destroyMeasurementPopup();
        var points = event.geometry.components;
        measurement.longitude = points[points.length-1].x;
        measurement.longlat = points[points.length-1].y;
        var distance = event.measure;
        var unit = event.units;
        if(unit == 'km')distance = distance*1000;
        var css = "border: none;" +
            "padding: 3px;" +
            "color:red;" +
            "padding-top: 3px;";
        var measureContent =
            "<div>" +
                "<div style='font-size: 12px'>" +
                    "<span>总长:<span style='color:#ff4500'>" + Number(distance.toFixed(2)) +"</span>米 </span>" +
                "</div>" +
                "<div>" +
                    "<span style='font-size: 12px;color:#9E9E9E;'>单机确定地点,双击结束</span>" +
                "</div>" +
            "</div>"
        var popup = new SuperMap.Popup.Anchored("measureMoveWin",
            new SuperMap.LonLat(measurement.longitude, measurement.longlat),
            new SuperMap.Size(12,16),
            measureContent,
            null,
            false,
            null);
        popup.autoSize = true;
        measurement.popup = popup;
        popup.setBorder("solid 1px red");
        map.addPopup(popup);
        $("#measureMoveWin").css("height","");
        $("#measureMoveWin_GroupDiv").css("height","");
        $("#measureMoveWin_contentDiv\n").css("height","");
        var size = map.getSize();
        if ( mouseMovePoint.x >size.w/2){
            $("#measureMoveWin").css("margin-right","10px");
        }
        if ( mouseMovePoint.y >size.h/2){
            $("#measureMoveWin").css("margin-bottom","10px");
        }
        if ( mouseMovePoint.x <= size.w/2){
            $("#measureMoveWin").css("margin-left","10px");
        }
        if ( mouseMovePoint.y <= size.h/2){
            $("#measureMoveWin").css("margin-top","10px");
        }
    }else if(type == 'click'){
        var points = event.geometry.components;
        var distance = event.measure;
        var unit = event.units;
        if(distance==0){
            destroyMeasurementClickPopup();
        }
        clickTimes+=1;
        measurementClick.push({});
        measurementClick[clickTimes-1].longitude = points[points.length-1].x;
        measurementClick[clickTimes-1].longlat = points[points.length-1].y;
        if(unit == 'km')distance = distance*1000;
        var measureContent =
            "<div>" +
                "<span style='font-size: 10px;color:#848282;'>"+Number(distance.toFixed(2))+"米</span>" +
            "</div>"
        if(distance==0) {
            measureContent =
                "<div>" +
                "<span style='font-size: 10px;color:#848282;'>起点</span>" +
                "</div>"
        }

        var popup = new SuperMap.Popup.Anchored("measureClickWin"+clickTimes,
            new SuperMap.LonLat(measurementClick[clickTimes-1].longitude, measurementClick[clickTimes-1].longlat),
            new SuperMap.Size(12,16),
            measureContent,
            null,
            false,
            null);
        popup.autoSize = true;
        measurementClick[clickTimes-1].popup = popup;
        popup.setBorder("solid 1px #848282");
        map.addPopup(popup);
        $("#measureClickWin"+clickTimes).css("height","");
        $("#measureClickWin"+clickTimes+"_GroupDiv").css("height","");
        $("#measureClickWin"+clickTimes+"_contentDiv\n").css("height","");
        $("#measureClickWin"+clickTimes+"_contentDiv\n").css("padding","0 8px");
        var size = map.getSize();
        if ( mouseMovePoint.x >size.w/2){
            $("#measureClickWin"+clickTimes).css("margin-right","10px");
        }
        if ( mouseMovePoint.y >size.h/2){
            $("#measureClickWin"+clickTimes).css("margin-bottom","10px");
        }
        if ( mouseMovePoint.x <= size.w/2){
            $("#measureClickWin"+clickTimes).css("margin-left","10px");
        }
        if ( mouseMovePoint.y <= size.h/2){
            $("#measureClickWin"+clickTimes).css("margin-top","10px");
        }
    }
}//测距功能-end
参考API:

https://iclient.supermap.io/libs/iclient8c/apidoc/files/SuperMap/Control/Measure-js.html

相关文章

  • SuperMap如何实现测量距离

    超图中实现测距功能 效果如下: 实现代码: 1.构造map时,map.events.register("mouse...

  • 距离:如何测量时间

    喝完酒局手机就没电了,因为离着自己住的地方比较近,便走着回去。直到自己走回家也不知道走了多长时间,只能通过距离进行...

  • 测量距离

    测量距离 文/黄影 我曾经用眼睛测量 我和太阳和月亮的距离 和一颗星星的距离 测量的结果简直是离...

  • 距离测量

    机器视觉原理与案例详解工控帮教研组编著电子工业出版社2020.7ISBN 978-7-121-39084-5 一、...

  • 角度测量与距离测量

    我是包青松,今天是我的890篇分享。 我现在结合线上植物医院,给大家每天分享一点与植物相关的知识。 地面上两直线之...

  • H5基于SuperMap组件地图

    前言:最近在做基于supermap的H5地图开发,先实现一个简单的例子 首先去supermap官网下载一个supe...

  • CAD看图软件如何测量距离?

    CAD看图软件如何测量距离?当我们想要快速打开一张图纸的时候,会使用到CAD看图软件,那么使用CAD看图软件看图的...

  • IBeacon 测量距离

    IBeacon 测量距离方法 IBeacon 可通过RSSI(信号强度)和设备在一米时的RSSI值粗略计算出距离....

  • 【17】如何拉近亲密关系

    一、如何测量亲密关系的程度?用空间距离。 亲密关系:0~15cm 个人距离:半米(朋友之间,伸手可及) 社交距离:...

  • Cesium空间测量之任意两点间距离、垂直距离测量

    1、提示框 2、 自由测量(任意两点间距离) 3、//垂直测量(任意两点间垂直距离) 4、测量效果

网友评论

      本文标题:SuperMap如何实现测量距离

      本文链接:https://www.haomeiwen.com/subject/dhrevhtx.html