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;
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中使用OpenLayers进行面积测量,可以通过以下步骤实现: 1. 首先,在Vue项目中,安装OpenLayers库。可以通过运行以下命令进行安装: ``` npm install ol ``` 2. 在Vue组件中引入OpenLayers库,可以使用`import`语句进行引入: ```javascript import ol from 'ol'; ``` 3. 创建一个Vue组件,并在`mounted`钩子函数中进行OpenLayers地图的初始化。在地图初始化过程中,可以设置视图的初始中心以及缩放级别: ```javascript mounted() { const map = new ol.Map({ target: 'map', view: new ol.View({ center: [0, 0], zoom: 2 }) }); } ``` 4. 在组件的模板中,添加一个具有特定ID的`div`元素,作为地图的容器: ```html <template> <div id="map"></div> </template> ``` 5. 在`mounted`钩子函数中,创建一个用于绘制图形的矢量源和矢量层。可以通过`ol.source.Vector`和`ol.layer.Vector`来实现: ```javascript mounted() { // ...省略地图初始化代码 const vectorSource = new ol.source.Vector(); const vectorLayer = new ol.layer.Vector({ source: vectorSource }); map.addLayer(vectorLayer); } ``` 6. 添加一个测量控件,用于测量面积。可以通过`ol.control.Measure`来实现: ```javascript mounted() { // ...省略地图初始化和添加矢量层代码 const measureControl = new ol.control.Measure({ source: vectorSource, type: 'area', interactionType: 'click' }); map.addControl(measureControl); } ``` 7. 最后,在模板中添加一个按钮或其他元素,用于触发测量功能: ```html <template> <div id="map"> <button @click="startMeasurement">开始测量</button> </div> </template> ``` 8. 在组件的方法中,编写`startMeasurement`方法,用于启动测量功能: ```javascript methods: { startMeasurement() { const measureControl = map.getControls().getArray().find(control => control instanceof ol.control.Measure); measureControl.setActive(true); } } ``` 通过以上步骤,Vue中的OpenLayers地图将具备面积测量功能。用户可以点击“开始测量”按钮,然后在地图上绘制多边形,测量结果将以弹窗或其他形式呈现给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值