整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt编写地图综合应用4-仪表盘

Qt编写地图综合应用4-仪表盘

# 一、前言

仪表盘在很多汽车和物联网相关的系统中很常用,最直观的其实就是汽车仪表盘,这个以前主要是机械的仪表,现在逐步改成了智能的带屏带操作系统的仪表,这样美观性和拓展性功能性大大增强了,上了操作系统的话,除了基本的仪表指示以外,还可以听歌导航接电话等,这应该也是目前汽车领域发展的一个大趋势,Qt在这方面还单独搞了个3D studio设计的,可以让美工直接设计好效果图,设置一些动画效果之类的,可以说这些年Qt公司也在不断谋求新的发展,探索新的机遇,找到新的增长点和突破口。

用Qt开发仪表盘控件非常方便,无论是用widget的painter还是qml,尤其是qml,内置的那些动画效果非常适合做这类的应用,这次不讨论如何用qt开发仪表盘,而是直接用echart内置的仪表盘控件,做的也挺好的,不知道echart这么小的一个文件,还能有如此多的效果,连仪表盘都有,这个非常震惊,仪表盘的使用在官网非常详细,与Qt的结合难点可能就在如何交互,Qt中无论是webkit也还还是webengine,都提供了runJavaScript或者evaluateJavaScript函数类来执行js函数,只需要在html文件写好对应的js文件函数就可以直接触发执行,比如设置仪表盘的角度我这里写的是setGaugeValue(value),则只需要runJavaScript或者evaluateJavaScript参数传入 setGaugeValue(88)这个即可,只需要根据界面上的滚动条或者滑块的值动态改变setGaugeValue的参数即可。

## 二、功能特点

1. 同时支持闪烁点图、迁徙图、区域地图、仪表盘等。

2. 可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。

3. 可设置城市的名称、值、经纬度 集合。

4. 可设置地图的放大倍数、是否允许鼠标滚轮缩放。

5. 内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。

6. 内置了各省市json数据文件转js文件功能,如有数据更新自行转换即可,支持单个文件转换和一键转换所有文件。

7. 内置了从json文件或者js文件获取该区域的所有名称和经纬度信息集合的功能,可以通过该方法获取到信息用来显示。

8. 依赖浏览器组件显示地图,提供的demo支持webkit、webengine、ie 三种方式加载网页。

9. 拓展性极强,可以依葫芦画瓢自行增加各种精美的echarts组件,做出牛逼的效果。

10. 内置的仪表盘组件提供交互功能,demo演示中包含了对应的代码。

11. 函数接口友好和统一,使用简单方便,就一个类。

12. 支持任意Qt版本、任意系统、任意编译器。

## 三、体验地址

国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)

国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)

## 四、效果图



## 五、相关代码

线制”是指仪表供电和标准信号传输采用的导线数。几线制的称谓,是在两线制变送器诞生后才有的。这是电子放大器在仪表中广泛应用的结果, 放大的本质就是一种能量转换过程,这就离不开供电。因此最先出现的是四线制的变送器,即两根线负责电源的供应,另外两根线负责输出被转换放大的信号(如电压、电流等)。
◆AC220V供电的仪表一定是四线制
四线制信号的仪表是指:供电回路和信号回路各自独立,采用隔离电路分开,用于隔离的4-20mA标准信号。所以信号一定是隔离的,通常不接地。电源可以是DC24V,也可以是AC220V。
仪表线制yunrun.com.cn/tech/2312.html
◆当用两线制提供的功率不足以给仪表供电时,采用三线制方式,信号为4-20mA标准信号
三线制的三根线是:一根为电源线(通常为DC24V+),一根为信号线,一根为电源与信号的公共线,用于电压参考点和电流回路。


◆非4-20mA标准信号不称为两线制
二线制是两根导线供电的同时传输4-20mA标准信号。非此标准信号不称为两线制。两线制最少供电能力为:4mA×24V-接收仪表功耗-线路损耗。


◆在实际现场操作中,四线制,三线制,二线制主要供电方式是?
①四线制供电大多为AC220V,也有供电为DC24V的
四线制变送器如下图所示,其供电大多为AC220V,也有供电为DC24V的。输出信号有4-20mA/负载电阻为250Ω,或者0-10mA/负载电阻为0-1.5KΩ;有的还有mA和mV信号,但负载电阻或输入电阻,因输出电路形式不同而数值有所不同。


②三线制供电大多为DC24V。
三线制变送器如下图所示,所谓三线制就是电源正端用一根线,信号输出正端用一根线,电源负端和信号负端共用一根线。其供电大多为DC24V,输出信号有4-20mADC,负载电阻为250Ω或者0-10mA,负载电阻为0-1.5KΩ;有的还有mA和mV信号,但负载电阻或输入电阻,因输出电路形式不同而数值有所不同。


③二线制供电为DC24V
二线制变送器如下图所示,其供电为DC24V,输出信号为DC4-20mA,负载电阻为250Ω,24V电源的负线电位最低,它就是信号公共线,对于智能变送器还可在4-20mA信号上加载HART协议的FSK键控信号。
由于各种变送器的工作原理和结构不同,从而出现了不同的产品,也就决定了变送器的两线制、三线制、四线制接线形式。


◆如何选用四线制、三线制、二线制仪表
①功率大于10W,精度要求较高时,一般选用四线制仪表。
四线制仪表的应用,最早始于DDZ-II型电动单元组合仪表的出现,供电为AC220V,后续输出信号为0-10mA的四线制变送器得到了广泛的应用。由于转换电路复杂、功耗大等原因,现在很多仪表仍优先选用四线制,最常见的像科氏力质量流量计和电磁流量计,到现在还是四线制,因为质量流量计需要振动功耗,电磁流量计需要励磁功耗,2个表的功率都到了10W以上,所以得四线制。


②减少非安全电压供电,一般选用三线制仪表。
三线制的应用,为了满足仪表需要的供电功率设计,把变送器的供电由AC220V改为低压直流供电,如电源从DC24V电源箱取用,减少非安全电压供电。这样就有了三线制的变送器产品。


③功率较小且经济实惠,一般选用二线制。
二线制仪表的应用,采用4-20mA信号,现场仪表就可实现二线制,现在国内二线制变送器的产品应用非常广泛。


综上所述,对于用户而言,选型时应根据本单位的实际情况,如信号制的统一、防爆要求、接收设备的要求、投资等问题来综合考虑选择。
昌晖仪表要指出的是三线制和四线制变送器输出的4-20mA信号,由于其输出电路原理及结构与二线制的是不一样的,因此在应用中其输出负端能否和24V电源的负线相接能否共地这是要注意的,必要时可采取隔离措施,如用配电器、安全栅等,以便和其它仪表共电、共地及避免附加干扰的产生。

者: 俊欣

来源:关于数据分析与可视化

今天小编来为大家安利另外一个用于绘制可视化图表的Python框架,名叫Dash,建立在FlaskPlotly.js以及React.js的基础之上,在创建之出的目的是为了帮助前端知识匮乏的数据分析人员,以纯Python编程的方式快速制作出交互特性强的数据可视化大屏,在经过多年的迭代发展,如今不仅仅可以用来开发在线数据可视化作品,即便是轻量级的数据仪表盘、BI应用甚至是博客或者是常规的网站都随处可见Dash框架的影子,今天小编就先来介绍一下该框架的一些基础知识,并且来制作一个简单的数据可视化大屏。

Dash框架中的两个基本概念

我们先来了解一下Dash框架中的两个基本概念

  • Layout
  • Callbacks

Layout顾名思义就是用来设计可视化大屏的外观和布局,添加一些例如下拉框、单选框、复选框、输入框、文本框、滑动条等组件,其中Dash框架对HTML标签也进行了进一步的封装,使得我们直接可以通过Python代码来生成和设计每一个网页所需要的元素,例如

<div>
    <h1>Hello World!!</h1>
    <div>
        <p>Dash converts Python classes into HTML</p>
    </div>
</div>

我们转化成DashPython结构就是

html.Div([
    html.H1('Hello Dash'),
    html.Div([
        html.P('Dash converts Python classes into HTML'),
    ])
])

Callbacks也就是回调函数,基本上是以装饰器的形式来体现的,实现前后端异步通信的交互,例如我们在点击按钮或者下拉框之后出现的功能就是通过回调函数来实现的。

安装和导入模块

在导入模块之前,我们先用pip命令来进行安装,

! pip install dash   
! pip install dash-html-components
! pip install dash-core-components                           
! pip install plotly

然后我们导入这些刚刚安装完的模块,其中dash-html-components用来生成HTML标签,dash-core-components模块用来生成例如下拉框、输入框等组件,这里我们还需要用到plotly模块,因为我们需要用到的数据来自该模块,里面是一众互联网公司过去一段时间中股价的走势

import dash
import dash_html_components as html
import dash_core_components as dcc
import plotly.graph_objects as go
import plotly.express as px

读取数据并且绘制折线图

那么我们读取数据并且用plotly来绘制折线图,代码如下

app=dash.Dash()   #实例化Dash
df=px.data.stocks() #读取股票数据 

def stock_prices():
    # 绘制折线图
    fig=go.Figure([go.Scatter(x=df['date'], y=df['AAPL'],
                                line=dict(color='firebrick', width=4), name='Apple')
                     ])
    fig.update_layout(title='股价随着时间的变幻',
                      xaxis_title='日期',
                      yaxis_title='价格'
                      )
    return fig
    
app.layout=html.Div(id='parent', children=[
    html.H1(id='H1', children='Dash 案例一', style={'textAlign': 'center',
                                                 'marginTop': 40, 'marginBottom': 40}),
    dcc.Graph(id='line_plot', figure=stock_prices())
])

if __name__=='__main__':
    app.run_server()

我们点击运行之后会按照提示将url复制到浏览器当中便可以看到出来的结果了,如下所示

从代码的逻辑上来看,我们通过Dash框架中的Div方法来进行页面的布局,其中有参数id来指定网页中的元素,以及style参数来进行样式的设计,最后我们将会指出来的图表放在dcc.Graph()函数当中。

添置一个下拉框

然后我们再添置一个下拉框,当我们点击这个下拉框的时候,可是根据我们的选择展示不同公司的股价,代码如下

dcc.Dropdown(id='dropdown',
             options=[
                 {'label': '谷歌', 'value': 'GOOG'},
                 {'label': '苹果', 'value': 'AAPL'},
                 {'label': '亚马逊', 'value': 'AMZN'},
             ],
             value='GOOG'),

output

options参数中的label对应的是下拉框中的各个标签,而value对应的是DataFrame当中的列名

df.head()

output

添加回调函数

最后我们将下拉框和绘制折线图的函数给连接起来,我们点击下拉框选中不同的选项的时候,折线图也会相应的产生变化,

@app.callback(Output(component_id='bar_plot', component_property='figure'),
              [Input(component_id='dropdown', component_property='value')])
def graph_update(dropdown_value):
    print(dropdown_value)
    # Function for creating line chart showing Google stock prices over time
    fig=go.Figure([go.Scatter(x=df['date'], y=df['{}'.format(dropdown_value)],
                                line=dict(color='firebrick', width=4))
                     ])
    fig.update_layout(title='股价随着时间的变幻',
                      xaxis_title='日期',
                      yaxis_title='价格'
                      )
    return fig

我们看到callback()方法中指定输入和输出的媒介,其中Input参数,里面的component_id对应的是下拉框的id也就是dropdown,而Output参数,当中的component_id对应的是折线图的id也就是bar_plot,我们来看一下最后出来的结果如下

最后,全部的代码如下所示