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

作者: 狐狸家的鱼

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,"\n","after:",addCoordinate);//打印坐标
});
});

OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本的更多相关文章

  1. ArcGIS for qml -添加自由文本

    源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 实现地图上鼠标点击后添加自由文本功能 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载 ...

  2. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  3. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  4. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  5. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  6. angular学习笔记(三十)-指令(5)-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

  7. Liunx学习笔记(三) 文件权限

    一.文件权限 1.查看文件权限 (1)文件权限 在 Linux 中对于文件有四种访问权限,列举如下: 可读取:r,Readable 可写入:w,Writable 可执行:x,Execute 无权限:- ...

  8. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

  9. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

随机推荐

  1. 《Effective C++》资源管理:条款13-条款17

    条款13:以对象管理资源 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源 auto ...

  2. day 7-14 数据库完整性约束

    一. 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: PRIMARY KEY 标示该字段为表的主键,可以唯一的标示记录 FOREIGN KEY 标示该 ...

  3. C# Note7:MVVM模式之数据绑定

    一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文  数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM( ...

  4. 为linux主机增加file description

    在benchmarked写的服务器的时候就遇到了too many file open 这个报错. 由于遇到过很多次了,所以知道应该是单机fd打满了. 首先来看看 机器最多支持多少fd cat /pro ...

  5. 设计模式笔记:单一职责原则(SRP, Single Responsibility Principle)

    1. 单一职责原则核心思想 一个类应该有且只有一个变化的原因. 2. 为什么引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心. 在SRP中,把职责定义为变化的原因 ...

  6. Mybatis -SqlMapConfig.xml环境配置

    SqlMapConfig.xml的配置内容和顺序如下(顺序不能乱): Properties(属性) Settings(全局参数设置) typeAliases(类型别名) typeHandlers(类型 ...

  7. LodopJS代码模版的加载和赋值

    Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍JS模版的加载和赋值.两种模版都可以存入一下地方进行调用,比 ...

  8. DotNetty 实现 Modbus TCP 系列 (四) Client & Server

    本文已收录至:开源 DotNetty 实现的 Modbus TCP/IP 协议 Client public class ModbusClient { public string Ip { get; } ...

  9. SQL Server For XML

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  10. HttpWebRequest using Basic authentication

    System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); credentialCache.Add( ...