zoukankan      html  css  js  c++  java
  • OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本

    实现在地图随意点击,弹出文本输入框,输入任意文字,完成自由文本添加的功能

    作者: 狐狸家的鱼

    GitHub:八至

    本文链接:地图上点击添加自由文本

     关于如何QML与HTML通信已经在上一篇文章 QML与HTML通信之画图 详细讲述了。

    1.html

    //添加文本
            var addTextBoxContent;//添加文本弹出框的内容
            var addTextBoxCloser;//添加文本弹出框的关闭
            var addTextBoxTitle;
            var inputText;
            var confirmBtn;//确定按钮
            var clickCoordinate;//鼠标点击坐标
            var addCoordinate;//鼠标点击坐标转换为投影坐标
            var textLabelElement;//文本元素
            var textOverlayer;//文本叠加层
            var addTextOverlay;
            //创建弹出框叠加层
            var createTextPopup = () =>{
                addTextBox = document.createElement('div');
                addTextBox.className = 'add-text-popup';
                addTextBoxCloser = document.createElement('a');
                addTextBoxCloser.className = 'ol-popup-closer';
                addTextBox.appendChild(addTextBoxCloser);
                addTextBoxContent = document.createElement('div');
                addTextBoxContent.className = 'popup-content';
                addTextBox.appendChild(addTextBoxContent);
                addTextBoxTitle = document.createElement('p');
                addTextBoxTitle.className = 'content-title';
                inputText = document.createElement('input');
                inputText.className = 'inputText';
                confirmBtn = document.createElement('input');
                confirmBtn.className = 'btn btn-primary confirmBtn';
                confirmBtn.type = 'button';
                confirmBtn.value = 'Confirm';
                addTextBoxContent.appendChild(addTextBoxTitle);
                addTextBoxContent.appendChild(inputText);
                addTextBoxContent.appendChild(confirmBtn);
                addTextBoxCloser.onclick = function(){//添加一个单击处理程序来隐藏弹出窗口
                    addTextOverlay.setPosition(undefined);
                    addTextBoxCloser.blur();
                    return false;
                };
                confirmBtn.onclick = ()=>{//弹出框的确定按钮来添加文本
                    createTextLabel();//调用创建文本叠加层的函数
                    textLabelElement.innerHTML = $('.inputText').val();
                    textOverlayer.setPosition(clickCoordinate);//文本叠加层的位置
                    addTextOverlay.setPosition(undefined);//弹出框关闭
                };
                inputText.addEventListener('keypress',()=>{//给输入框添加回车键监听事件
                    if(event.keyCode == 13){
                        createTextLabel();//调用创建文本叠加层的函数
                    textLabelElement.innerHTML = $('.inputText').val();
                    textOverlayer.setPosition(clickCoordinate);//文本叠加层的位置
                    addTextOverlay.setPosition(undefined);//弹出框关闭
                    }
                });
                addTextOverlay = new ol.Overlay({//弹出框的叠加层
                    element:addTextBox,
                    autoPan:true,
                    autoPanAnimation:{
                        duration:250
                    }
                });
                map.addOverlay(addTextOverlay);
            }
            //创建文本元素叠加层
            var createTextLabel = () =>{
                textLabelElement = document.createElement('div');
                textLabelElement.className = 'text-label';//设置p标签的样式
                textOverlayer = new ol.Overlay({
                    element:textLabelElement,
                    stopEvent: false
                });
                map.addOverlay(textOverlayer);
            };

    2.QML

    在WebChannel添加信号

    signal addFreeText()                    //添加自由文本

    添加文本按钮调用信号

    CLButton{
            id:txaBtn;
            anchors.fill: parent;
            btnText: "TXA";
            onClicked: {
                map.addFreeText();//信号
                console.log("clicked addTextBtn");
            }
        }

    html中连接信号

    //添加自由文本
    content.addFreeText.connect(()=>{
         createTextPopup();//添加到地图中
         map.on('singleclick',(evt) => {//地图响应鼠标左键点击数事件
                clickCoordinate = evt.coordinate;//鼠标左键获取点击坐标
                addCoordinate = ol.proj.transform(clickCoordinate, 'EPSG:3857', 'EPSG:4326');//转换鼠标左键获取的坐标
                addTextOverlay.setPosition(clickCoordinate);
                console.log("before:",clickCoordinate,"
    ","after:",addCoordinate);//打印坐标
         });
    });
  • 相关阅读:
    GO学习-(31) Go语言操作Elasticsearch
    GO学习-(30) Go语言操作kafka
    GO学习-(29) Go语言操作etcd
    Maven+Spring打Jar包
    话说Session
    Apache Server与多个独立Tomcat集成
    一套Tomcat处理多个域名请求
    Tomcat多实例
    Linux下安装MySQL
    Java Enum
  • 原文地址:https://www.cnblogs.com/suRimn/p/10103596.html
Copyright © 2011-2022 走看看