zoukankan      html  css  js  c++  java
  • OpenLayers动态测量距离和面积,并可自定义测量的线样式

    全局操作变量

    /**
     *  @description 标注弹出框
     */
    HtmlPopup = null;
    /**
     *  @description 临时图层类数据源
     */
    VectorSource = null;
    /**
     *  @description 绘图工具
     */
    Draw = null;
    
        let measureTooltipElement;
        let measureTooltip=HtmlPopup;
        let drawingFeature = null;

    动态测量距离

     //动态测量距离
        this.dynamicLengthMeasure = function (_map,_measureLengthStyle,_measureTooltipStyle,_measureEndCallback) {
            measureTooltipElement = document.createElement("div");
            //暂停绘制
            if (Draw != null) {
                _map.removeInteraction(Draw);
                Draw = null;
            }
            if(_measureLengthStyle){
                Draw = new ol.interaction.Draw({
                    //绘制层数据源
                    source: VectorSource,
                    /** @type {ol.geom.GeometryType}几何图形类型 */
                    type: 'LineString',
                    //几何信息变更时调用函数
                    //geometryFunction: geometryFunction,
                    freehand: false,
                    style:_measureLengthStyle
                });
            }else{
                Draw = new ol.interaction.Draw({
                    //绘制层数据源
                    source: VectorSource,
                    /** @type {ol.geom.GeometryType}几何图形类型 */
                    type: 'LineString',
                    //几何信息变更时调用函数
                    //geometryFunction: geometryFunction,
                    freehand: false,
                });
            }
    
            _map.addInteraction(Draw);
            Draw.on('drawstart', function (e) {
                if(_measureLengthStyle){
                    e.feature.setStyle(_measureLengthStyle);
                }
                measureTooltip = createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
                drawingFeature = e.feature;
                let tooltipCoord = e.coordinate;
                drawingFeature.getGeometry().on('change',function (evt) {
                    let geom = evt.target;
                    let output = geom.getLength();
                    if (output > 100) {
                        output = (Math.round(output / 1000 * 100) / 100) + ' km';
                    } else {
                        output = (Math.round(output * 100) / 100) + ' m';
                    }
                    tooltipCoord = geom.getLastCoordinate();
                    measureTooltipElement.innerHTML = output;
                    measureTooltip.setPosition(tooltipCoord);
                });
            });
            Draw.on('drawend', function (e) {
                _map.removeInteraction(Draw);
                Draw = null;
                if(_measureLengthStyle){
                    e.feature.setStyle(_measureLengthStyle);
                }
                measureTooltip = createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
                drawingFeature = e.feature;
                let output = e.feature.getGeometry().getLength();
                if (output > 100) {
                    output = (Math.round(output / 1000 * 100) / 100) + ' km';
                } else {
                    output = (Math.round(output * 100) / 100) + ' m';
                }
                let tooltipCoord = e.feature.getGeometry().getLastCoordinate();
                measureTooltipElement.innerHTML = output;
                measureTooltip.setPosition(tooltipCoord);
    
                if(_measureEndCallback){
                    let measureEndCallbackkObj = {};
                    measureEndCallbackkObj.feature=e.feature;
                    measureEndCallbackkObj.length = output;
                    _measureEndCallback(measureEndCallbackkObj);
                }
            });
            function createMeasureTooltip(measureTooltip,_param,_map) {
                if(_param==null||_param==undefined){
                    _param={};
                }
                measureTooltipElement.className = _param.className||'ol-overlay-container ol-selectable';
                measureTooltipElement.id='measureLength_DIV';
                measureTooltip = new ol.Overlay({
                    element: measureTooltipElement,
                    id:'measureLength_DIV',
                    offset: _param.offset||[0, -15],
                    positioning: _param.positioning||'bottom-center'   //显示的位置
                });
                _map.addOverlay(measureTooltip);
                return measureTooltip;
            }
        };

    动态测量面积

    //动态测量面积
        this.dynamicAreaMeasure = function (_map,_measureAreaStyle,_measureTooltipStyle,_measureEndCallback) {
            // if (measureTooltipElement) {
            //     measureTooltipElement.parentNode.removeChild(measureTooltipElement)
            // }
            measureTooltipElement = document.createElement("div");
            //暂停绘制
            if (Draw != null) {
                _map.removeInteraction(Draw);
                Draw = null;
            }
            if(_measureAreaStyle){
                Draw = new ol.interaction.Draw({
                    //绘制层数据源
                    source: VectorSource,
                    /** @type {ol.geom.GeometryType}几何图形类型 */
                    type: 'Polygon',
                    //几何信息变更时调用函数
                    //geometryFunction: geometryFunction,
                    freehand: false,
                    style:_measureAreaStyle
                });
            }else{
                Draw = new ol.interaction.Draw({
                    //绘制层数据源
                    source: VectorSource,
                    /** @type {ol.geom.GeometryType}几何图形类型 */
                    type: 'Polygon',
                    //几何信息变更时调用函数
                    //geometryFunction: geometryFunction,
                    freehand: false,
                });
            }
    
            _map.addInteraction(Draw);
            Draw.on('drawstart', function (e) {
                if(_measureAreaStyle){
                    e.feature.setStyle(_measureAreaStyle);
                }
    
                measureTooltip = createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
    
                drawingFeature = e.feature;
                let tooltipCoord = e.coordinate;
                drawingFeature.getGeometry().on('change',function (evt) {
                    let geom = evt.target;
                    let output = geom.getArea();
                    if (output > 10000) {
                        output = (Math.round(output / 1000000 * 100) / 100) + ' km<sup>2</sup>'
                    } else {
                        output = (Math.round(output * 100) / 100) + ' m<sup>2</sup>'
                    }
                    tooltipCoord = geom.getLastCoordinate();
                    measureTooltipElement.innerHTML = output;
                    measureTooltip.setPosition(tooltipCoord);
                });
            });
            Draw.on('drawend', function (e) {
                _map.removeInteraction(Draw);
                Draw = null;
                if(_measureAreaStyle){
                    e.feature.setStyle(_measureAreaStyle);
                }
                // drawingFeature = null;
                // measureTooltipElement = null;
                // measureTooltip = createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
                // createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
                measureTooltip = createMeasureTooltip(measureTooltip,_measureTooltipStyle,_map);
                drawingFeature = e.feature;
                // let tooltipCoord = e.coordinate;
                // let geom = e.target;
                let output = e.feature.getGeometry().getArea();
                if (output > 10000) {
                    output = (Math.round(output / 1000000 * 100) / 100) + ' km<sup>2</sup>'
                } else {
                    output = (Math.round(output * 100) / 100) + ' m<sup>2</sup>'
                }
                let tooltipCoord = e.feature.getGeometry().getLastCoordinate();
                measureTooltipElement.innerHTML = output;
                measureTooltip.setPosition(tooltipCoord);
    
                if(_measureEndCallback){
                    let measureEndCallbackkObj = {};
                    // measureEndCallbackkObj.attributes={};
                    measureEndCallbackkObj.feature=e.feature;
                    measureEndCallbackkObj.length = output;
                    // measureEndCallbackkObj.attributes.x = (e.feature.getGeometry().getExtent()[0]+e.feature.getGeometry().getExtent()[2])/2;
                    // measureEndCallbackkObj.attributes.y = (e.feature.getGeometry().getExtent()[1]+e.feature.getGeometry().getExtent()[3])/2;
                    _measureEndCallback(measureEndCallbackkObj);
                }
            });
            function createMeasureTooltip(measureTooltip,_param,_map) {
                // if (measureTooltipElement) {
                //     measureTooltipElement.parentNode.removeChild(measureTooltipElement)
                // }
                // measureTooltipElement = document.createElement("div");
                // if(_param){
                if(_param==null||_param==undefined){
                    _param={};
                }
                measureTooltipElement.className = _param.className||'ol-overlay-container ol-selectable';
                measureTooltipElement.id='measureArea_DIV';
                measureTooltip = new ol.Overlay({
                    id:'measureArea_DIV',
                    element: measureTooltipElement,
                    offset: _param.offset||[0, -15],
                    positioning: _param.positioning||'bottom-center'
                });
                // }
                _map.addOverlay(measureTooltip);
                return measureTooltip;
            }

  • 相关阅读:
    事务的特性(ACID)
    网络代理
    防止SpringMVC拦截器拦截js等静态资源文件
    Tomcat配置虚拟目录
    SpringMVC总结(SSM)
    Spring声明式事务总结
    Linux中MySQL忽略表中字段大小写
    MySQL之sql文件的导入导出
    MyBatis总结
    Linux网络
  • 原文地址:https://www.cnblogs.com/yangzhengier/p/12195534.html
Copyright © 2011-2022 走看看