在现在很多的应用系统中,会提供一个地图模块,地图相关的应用和app也是非常多,最广泛的应用就属于导航,地图基本上分在线的和离线的两种,在线的一般都是实时的,数据也是最新的,速度很快路线很准,缺点是耗费流量,一直需要收发数据,而离线的需要先把地图包和对应的文件下载到本地,直接读取本地的地图数据进行交互。
用Qt做过很多个商业项目,其中有几个涉及到加载地图用于展示设备的分布,之前做的是在线的地图,通过网页的交互来获取和设置数据,最近几年越来越多需要离线地图的需求,离线地图最核心的就是地图数据包,也叫瓦片地图,需要通过下载器下载到本地使用,网上查了下,还非常多公司专门做这个离线瓦片地图的下载器,绝大部分都是收费的。
越来越多的地图服务用到瓦片技术,例如我国实行发布的天地图服务就运用了地图瓦片技术。其实切片之后的地图瓦片是栅格图像,并不具备定位信息,不过切片运用了相关切片算法之后,可以计算出具体定位的位置。例如采用WGS84大地坐标系为空间参考,对地图进行切片,采用一定的切片算法,例如用经纬度步长等比例分割形成地图瓦片,当需要对一个具体地方进行定位时,可以根据经纬度步长来计算具体位置,以此来达到定位的功能。
近期抽空特意将大屏系统中常用的区域地图以及地图功能模块重新封装了下,使得支持在线和离线两种模式,同时支持webkit、webengine、ie 三种方式,支持闪烁点图、迁徙图、区域地图、仪表盘,还带有交互功能。
echart仪表盘带交互demo开源地址:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo) [https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
文件名称:echartgauge
体验地址:[https://gitee.com/feiyangqingyun/QWidgetExe](https://gitee.com/feiyangqingyun/QWidgetExe) [https://github.com/feiyangqingyun/QWidgetExe](https://github.com/feiyangqingyun/QWidgetExe)
文件名称:bin_map.zip
### Echarts地图封装类功能特点
1. 同时支持闪烁点图、迁徙图、区域地图、仪表盘等。
2. 可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
3. 可设置城市的名称、值、经纬度 集合。
4. 可设置地图的放大倍数、是否允许鼠标滚轮缩放。
5. 内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。
6. 内置了各省市json数据文件转js文件功能,如有数据更新自行转换即可,支持单个文件转换和一键转换所有文件。
7. 内置了从json文件或者js文件获取该区域的所有名称和经纬度信息集合的功能,可以通过该方法获取到信息用来显示。
8. 依赖浏览器组件显示地图,提供的demo支持webkit、webengine、ie 三种方式加载网页。
9. 拓展性极强,可以依葫芦画瓢自行增加各种精美的echarts组件,做出牛逼的效果。
10. 内置的仪表盘组件提供交互功能,demo演示中包含了对应的代码。
11. 函数接口友好和统一,使用简单方便,就一个类。
12. 支持任意Qt版本、任意系统、任意编译器。
### 百度地图封装类功能特点
特别说明:从2019年6月份开始官方对部分功能开始收费比如主题样式、查询路线等,需要自行去后台充值后对应的秘钥才能使用。
1. 同时支持在线地图和离线地图两种模式。
2. 同时支持webkit内核、webengine内核、IE内核。
3. 支持设置多个标注点,信息包括名称、地址、经纬度。
4. 可设置地图是否可单击、拖动、鼠标滚轮缩放。
5. 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
6. 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。
8. 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
9. 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
10. 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
11. 可添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
12. 函数接口友好和统一,使用简单方便,就一个类。
13. 支持任意Qt版本、任意系统、任意编译器。
文转载自公众号“把科学带回家”(ID:steamforkids)
每天刷牙的时候,你有没有想过彩条牙膏的彩条怎么来的?为什么不同颜色的彩条在牙膏管子里不会混在一起?
其实,如今的彩条牙膏在管子里的样子和挤出来的样子差不多。你可以切开一个看看。切开的牙膏是这样的:
如果把彩条牙膏冻住,然后剪开包装,就是这样的:
那么彩条牙膏是怎么制作的呢?
在工厂里的时候,机器把不同颜色的彩条分别装到一个中间有隔板的管子里,不同颜色的彩条被隔板隔开。接着就像做冰淇淋那样,机器把所有彩条一起打到牙膏管子里。
彩条牙膏的制作
那么问题就来了,不同颜色的彩条在牙膏里怎么不会混合在一起,尤其是在被挤了很多次以后?
这要分成静止状态和挤牙膏2个情况讨论。
静止的牙膏里的彩条不变色,主要是因为2个因素——牙膏的流体物理性质以及彩条所用的色素。
牙膏是一种宾汉流体(bingham plastic),属于非牛顿流体。除了牙膏,血液、酸奶、蛋黄酱都是宾汉流体。
保龄球在神奇的非牛顿流体上弹弹弹。非牛顿流体看着像水,但却比水“结实”。
宾汉流体的一个超强属性就是,在不受力,比如没有被挤压的情况下,它可以像固体一样基本不流动。而受到了一定程度的挤压后,宾汉流体才能开始流动。
因此当牙膏没有被你挤的时候,彩条能保持比较稠密的状态,比较接近不能流动的固体,可以在牙膏管里互不干扰。
另外,在一般情况下,不同颜色的染料会发生渗色(bleeding)的现象。彩条牙膏的生产厂家为了防止彩条互相渗色,常用聚乙烯包裹染料,使它们变得稳定。
这就是静止的牙膏彩条不会混合的两大原因。
红色和蓝色是常用的彩条颜色
那么在挤牙膏的时候,为什么不同颜色的彩条不会混合呢?
刚才说到牙膏是一种宾汉流体。当你在挤牙膏的时候,彩条就会流动起来,变得更像液体而不是固体,这样它们才能从牙膏管子里流出。
当牙膏流动的时候,它就必须要符合一个可怕的流体力学规律——雷诺数(Reynolds number)。
雷诺数的计算公式,开不开心,惊不惊吓?
计算雷诺数的这个公式看看就好了,反正我们以后不考。它的意思是,一种流体的粘度(viscosity)越大,它的雷诺数就越小;反之粘度越小,雷诺数就越大。
粘度低(左)和粘度高(右)的液体
那么雷诺数高或者低又有什么影响呢?
雷诺数决定了液体是怎样流动的。
具体来说,如果雷诺数小于2100,那么液体将这样流动:
层流
这种流动叫做层流(laminar flow),层流的液体平行运动,不会搅和在一起。
如果雷诺数大于4000,那么液体将这样流动:
湍流
这种流动叫做湍流(turbulent flow),看图就知道,湍流的液体互相混合。
上面2个是层流,下面2个是湍流
对于牙膏来说,它的粘度非常大,因此它的流动只能是层流。挤牙膏的时候,位于边缘的彩条和中间的白条一起平行流出,所以挤出来的牙膏彩条也不会混合在一起。
当然了,牙膏和粘度较小的水混合后,雷诺数蹭蹭上涨,所以彩条的颜色就会混在一起,水乳交融了。
最后,因为不同颜色的彩条有相同的流速(它们的流变学性质相同),因此可以保证挤到最后也不会出现某种彩条被首先挤完的情况。
不过,当彩条牙膏刚刚诞生的时候,可不是现在这个样子。
历史上最早的彩条牙膏管子设计,和现在的彩条牙膏很不一样
在最早的彩条牙膏管子里,彩条被分别牙膏管里的不同位置。这个设计是在1955年出现的,它的发明人是个叫做 Leonard Lawrence Marraffino 的美国人。一开始 Marraffino 想设计的是一种带斑点的牙膏,没想到意外设计出了彩条牙膏。
在这种彩条牙膏里,两种不同颜色的彩条并不是被组合好再打到牙膏管子里的。
实际上,红色的彩条被放在靠近牙膏管子开口的地方。白色的彩条比较多,它被放在在靠后的位置。牙膏口子向内延伸了一段,这一段上面有几个狭长的缝,红色彩条就是从这里流出来,然后和白色彩条汇合的。
那么怎么保证挤到最后还有2种颜色的彩条呢?
这是因为在这种牙膏里,红色彩条和白色彩条的粘度不同,红色彩条的粘度比较小,所以它更加顺滑,流得比较快。白色彩条的粘度更大,流得更慢。
这两种不同粘度的彩条搭配以后,就能保证直到最后一滴,挤出来的牙膏都有两种颜色。
不过,这种设计的销量并不好,后来逐渐被更加简单的设计,也就是我们现在使用的彩条牙膏替代了。
图片来源:Groundwater Dictionary, wikipedia, ScienceAlert,nP-dog's blog, Business Insider, giphy, imgur
参考资料:
https://www.gsk.com/en-gb/behind-the-science/patients-consumers/science-of-a-different-stripe/
https://bashny.net/t/en/91030
https://www.sciencesetavenir.fr/fondamental/70-ans-de-sciences-et-avenir-le-secret-du-dentifrice-a-rayures_116813
https://www.youtube.com/watch?v=RVZ6mUffJgw
https://www.britannica.com/science/laminar-flow
https://www.archtoolbox.com/materials-systems/hvac/laminarflowvsturbulentflow.html
http://www.russochemie.ru/upload/iblock/documents/Brochure%20Cosmetic%20Dispersions.pdf
http://www.sensient-cosmetics.com/pageLibre000105e3.aspx
http://ijppsjournal.com/Vol3Suppl3/2152.pdf
来源:把科学带回家
编辑:重光
近期热门文章Top10
↓ 点击标题即可查看 ↓
1. 我家在地震带上,你家呢?
2. 自然常数e到底自然在哪?
3. 华为的5G技术,源于这种数学方法
4. 为什么在跑道上要沿逆时针方向跑步?| No.155
5. 苍蝇落在食物上会发生什么?让我们说的仔细一点
6. 仙童传奇
7. 90后学术论文致谢自救指南
8. 你看的每一篇Nature论文,都是这样出炉的!
9. 硬核预警:量子力学的九种形式
10. 为什么手指能滑动手机屏幕,手指甲却不能?| No.156
分享成果,随喜正能量】我们不良的行为、不善的念头、不好的言语,都属于我们内心的暴力,要想获得平和,我们需要自我修习,学会控制情绪,学会内观反省并接近善良。。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是专题九“利用IE抓取网络数据”:IE法提取网页数据
为了获取网页的数据,我们可以通过创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
这种方法可以模拟大部分的浏览器操作。浏览器能看到的数据就能用代码获取,但是有个致命的缺点:除去各种弹窗相当烦人外,兼容性也确实是个很伤脑筋的问题。在我自己的实践中感觉这种方法不是很稳定(仅仅是感觉)。
我们在实际工作中遇到网站和网页相关问题,例如:如何下载网页数据?网页之间的通讯是怎么实现的、它们能不能被控制等等。如果你是用VB/VBA/脚本或其它支持自动化对象(AUTOMATION)的语言编程,有一个值得了解的方法是掌握对象模型:将网页视为对象来控制,这个方法需要了解的是IE的自动化对象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及标准的文档对象模型(Document)。相关的知识我在前两个专题中做了大量的讲解,这里就不再详细的说明了。
我给出下面的代码:
Set ie=CreateObject("InternetExplorer.Application") ’创建对象
ie.Visible=True ’使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE
ie.navigate "about:blank" ’建立一个空白页
上面这几行代码的作用是创建一个IE应用程序对象,并打开一个空白的网页。这个网页独立于VBA的应用程序(WORD或EXCEL)之外,事实上,你必须自已关掉它,或者用ie.Quit下令退出——注意一下,单纯的关闭VBA或SET ie=nothing是不会退出这个网页的。我们经常用的是将第3行的字符串替换成一个网站的名字,或者替换成一个你主机中的文档名,也可以是一个图片名,都是可以的。和你在IE地址栏输入名称浏览这些文档是一样效果。
如果仅仅是创建了一个空的模型是没有任何利用的价值的,我们需要真正的网页,这时就需要我们在VBA的应用程序外打开一个完整的网页了,直到网页完全加载我们的操作才能向下进行。
我们修正一下上面的那段打开空网页的代码:
Sub mynz()
Set ie=CreateObject("InternetExplorer.Application") ’创建对象
ie.Visible=True ’使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE
ie.navigate " https://baijiahao.baidu.com" ’建立一个空白页
Do Until .ReadyState=4 '检查网页是否加载完毕(4表示完全加载)
DoEvents ‘循环中交回工作权限给系统,以免“软死机”
Loop
End sub
在上面的代码中增加了几行:
Do Until .ReadyState=4 '检查网页是否加载完毕(4表示完全加载)
DoEvents ‘循环中交回工作权限给系统,以免“软死机”
Loop
这几行代码可以保证网页的加载完成,这是根据ie.ReadyState的返回值来判断的。
readyState一共有5中状态:
状态 含义 说明
0 未初始化 对象已建立,但是尚未初始化(尚未调用open方法)
1 初始化 对象已建立,尚未调用send方法
2 发送数据 send()方法已调用,但是当前的状态及http头未知
3 数据传送中 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误
4 数据接收完毕 此时可以通过通过responseBody和responseText获取完整的回应数据
通过以上的分析,我们可以看出,只用当.ReadyState=4时网页的数据才是有效的数据。
当网页加载完毕,剩下的工作就是从网页中抓取数据了,数据的抓取主要是利用控件对象的属性和方法。
1)用Set doc=ie.Document 取得网页的文档对象
从文档对象(Document)以下展开的对象模型,它代表网页的内容,和前面那个IE的应用程序不是同一个体系.
Documnet(文档)是文档对象模型,相当于OFFICE对象中的APPLICATION,取得Document之后,不论修改网页还是读写网页,还是触发事件,一切都好说,每个URL都对应有一个Documnet(这是假如定成功导航Navigate到那个URL完成,因此之前要求确定IE对象READSTATE,以确定对应URL的Document打开了)
2) 在Documnet之下可以取得documentElement和body两个节点。
可以用下面的语句:
set xbody=doc.Body ‘取得body对象
set xDoc=doc. documentElement ‘取得根节点
body前面已经说过,相当于标记的对象,根节点相当于网页中的标记元素的对象,MHTML的类型库定义里,它们都属于HTMLHtmlElement类型的对象,下面我把这种类型的对象称为一个“节点”,不过要注意的是文档对象不是节点对象,它是HTMLDocument类型。根节点和body节点不同的是根节点包括整个网页,在HTML的文档对象模型中,这类对象有几种属性可以取得其中的内容:
对象.innerHtml ‘对象内部的HTML文本
对象.OuterHtml ‘对象中的HTML文本,包括对象本身的HTML标记在内
对象.innerText ‘对象内部的TEXT,不包括HTML标记
对象.OuterText ‘同上,包括对象本身的文本
所以,如果我们要抓取某个网站的所有HTML内容,代码可以这样写:
set doc=ie.Document
set xDoc=doc. documentElement ‘取得根节点
strX=xDoc.OuterHtml ‘取得所有的HTML内容
3) 每一个标记节点对象之下都有一个名为ChildNodes的集合,它包含了“直属于本节点下的标记”,就象是文件目录,根目录下的子目录.
我们可以看到:HTML标记是文档的根节点,是Document的Childnodes集合中的一个成员(Document不是节点,是另一种类型对象,上一级文档,但它可以有下级节点集合,正如磁盘可以有下级目录,但它本身不是目录),BODY是根节点的ChildNodes集合中的一个成员,而DIV和P两个节点则是BODY的ChildNodes集合中的两个成员,同样也有自己的Childnoes集合。
我们要注意:文档对象模型中,集合与OFFICE的集合有所不同,集合是从0开始计数的,计数属性是Length而不是Count。
4)除了ChildNodes集合,大家在网页文档对象中还常见到的就是很大气的一种集合:All集合,这是“最糊涂”的一种集合,文档和各级节点都带有这个集合,正如这个名字所示,它是不分层次的,但用起来也很方便:
Set doc=ie.Document
Set xCols=doc.All ’取得文档中的所有节点集合
Set xbCols=doc.body.All ’取得body节点下所有的节点集合
虽然任何标记节点都有ALL集合,但我们还是喜欢用DOCUMENT的ALL,原因无它,文档最大,一锅烩的ALL找起来也最合适。ALL查找是有条件的:如果这个标记没有ID,你无法查到它的名字。
不过,ALL集合有一个很方便的特性:ID可以挂到ALL集合之下:
strX=doc.All.mytag.innerhtml
5)获得文档对象的getElementsByName集合,可以利用下面的方法:
set mydivs=doc. getElementsByName(“div”) ‘取得所有DIV标记,注意还是集合
6) 文档对象的FORMS集合,因为大部分网页的数据提交都是通过FORM标记提交的:
Set myForms=doc.Forms ’取得所有的FORM标记
Set frmX=myForms.item(0) ’第1个FORM
FORM标记节点代表的对象是很多朋友关心的内容——在网页对象中,它可以发送数据到服务器,使服务器刷新网页(实际上是服务器按某个格式约定发回数据),我们可以把网页的FORM看成是一个远程的函数调用接口,FORM标记中的ACTION指向的URL地址就是函数入口,而FORM标记内的各个INPUT标记节点就是函数的参数,当发出FORM.Submit方法时,就是远程调用函数了,在服务器端,诸如ASP,PHP就是老老实实找FORM的参数,不管你是用GET还是POST:
frmX.submit ’相当于用户在页面上按下FORM的发送按键
上面我罗列了获取网页数据的一般的方法,并没有什么特别的使用要求,大家可以根据自己的习惯来利用,这个专题之后的内容就是灵活运用这些知识点来解决实际问题了。
本节知识点回向:
如何提交表单?如何下载图片的地址?如何获得表的数据?
【分享成果,随喜正能量】得意之时淡然,失意之时坦然,顺风顺水的时候需要一种内敛和沉稳,遭遇逆境和挑战的时候,要有一份举重若轻、生命昂扬的生命展望,就算匍匐于岁月尘埃,也要仰望生命的星辰灿烂。 ??。
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
*请认真填写需求信息,我们会在24小时内与您取得联系。