您当前的位置:首页>>新闻中心>>行业动态

百度地图在汽车衡行业中的应用一例

时间:2017-06-01 02:21:49   点击数:

百度地图在汽车衡行业中的应用一例

随着“物联网”的概念深入各行各业,其重要的分支领域—“位置应用”也在不断发展。在地磅行业中,以称重传感器 + 称重仪表 + GPS+ GPR S+ 电子地图为主要组成部件的物联网解决方案,已经成功的应用在称重计量领域中。此文主要针对“百度地图”,介绍了其在汽车衡物联网中的一个典型应用案例。可为类似的物联网方案提供参考。

随着信息化社会的发展,“位置应用”已深入到人类生活的方方面面,应用场景包括手机导航社交网络、车载导航、老年人关爱、应急救援、交通路线规划、医疗定位、物流监控等。在地磅行业中也不例外。作者曾参与了一个“建筑环保砂浆 ”项目,其中就涉及到了 “称重计量”和“位置应用”—两者结合的需求。有了位置信息(即地理坐标) 后,就需要有电子地图,来直观呈现远程设备的状态。“百度地图”是众多电子地图中的一员。它稳定可靠、开发文档齐全,并免费向用户提供二次开发 API 接口。本文将针对“环保砂浆的称重计量”与“百度地图”二者结合应用的方案展开描述。

一、砂浆计量系统的组成

 “砂浆站”向“工地”供应“砂浆”(新型环保砂浆) ,“工地”根据施工进度,对供应量 (主要参考重量) 进行控制。为了达到“环保”的目的,施工现场严禁露天堆放物料。环保砂浆使用前,以干粉形式储存 (所以也叫“干粉砂浆”),现场有专用的储料罐。待到使用时,现场搅拌,用多少搅拌多少。搅拌设备和计量设备配合工作,完成砂浆的配制过程。砂浆罐计量控制系统的组成,如下图 1 所示:

宽度1.png

系统由两部分组成:一是搅拌电气控制部分;二是称重计量部分。两者独立工作,“计量部分”为“搅拌控制部分”提供重量参考。砂浆配置过程由人工操作电气设备完成。

 计量部分涉及到“位置应用”。各部件分工如下:称重传感器负责重量数据采集 (每个罐 4  20t 传感器),GPS 负责坐标信息采集,称重仪表显示重量,并将重量和位置信息通过 GPRS 传送到远程数据服务器端。用户打开客户端软件,客户端软件将从服务器读取重量和位置信息,在“百度地图”上显示覆盖物 (即砂浆罐图标)。用户可以直观的看到砂浆罐的地理位置和罐内储料的当前余量,为后续砂浆运输提供调度依据。“砂浆站”不用派人时刻驻守现场,节省人力资源,提高管理效率。

 二、GP S 坐标格式及转换

1 GPS 通信数据具有一定的格式,坐标数值需要经过处理,才能被“百度地图”API 接口使用    GPS 原始   11413.13562  2955.83360,格式为:hhmm.mmmmm 是‘度’, m    ’)。 转换成地理坐标后,经度为114+13.13562/60,纬度为 29+55.83360/60。然后调用“百度地图”API 接口转换成百度 DB09Ⅱ坐标类型。

 

2 GPS 坐标为什么要转换?因为 GPS 原始坐标为 WGS84 坐标系,不能直接用于“百度地图”。“百度地图”采用的是 BD09Ⅱ坐标系。要在“百度地图”上显示 GPS 设备的正确位置怎么办呢?“百度地图”提供了 Web API 进行转换,其链接地址为:

 

http://api.map.baidu.com/geoconv/v1/?coords=114.

 

2189273452129.575429778924&from=1&to=5&ak=

 

你的密钥

 

说明:coords 为坐标的经度、纬度;form 为转换前的坐标类型, WGS84 坐标系;to 为转换后的坐标类型, BD09 (百度经、纬度坐标);ak 为密钥,开发者在使用“百度地图”前,先要申请开发者密钥。

 

链接请求的返回数据为 json 格式,如下:

 

{

 

status:0,

 

result:

 

[

{

 

x:114.23075303426,

 

y:29.579086201042

 

}

 

]

 

}

 

上面的 x即为 BD09Ⅱ坐标,可以被“百度地图”识别。调用地图覆盖物 API,就能将指定的图片(支持 jpg,gif,png 等格式),显示到地图容器上。

 这个转换链接是 Web 形式的,如果是 Web 应用程序开发,可以直接调用,很简单。如果是桌面软件开发,该如何处理呢?笔者使用的是

 

C++Builder,它提供了处理 http 协议的控件即

 

TIdHttp。在其他开发工具中也有类似的函数库,如微软已经封装好的 WinInet 高级网络协议函数库,可供开发者开发基于 http 协议的应用程序。

 

作者写了一个函数,实现坐标转换,其中用到了 TIdHttp 控件,代码如下:

AnsiString__fastcall BD09::GpsToBD (const

 

GPSpoint & GpsCoord)

 

{

 

TIdHTTP * bdhttp= new TIdHTTP(NULL); TMemoryStream * ms;

 

LPSTR lpBuf; AnsiString strText; try

 

{

 

AnsiString strUrl="http://api.map.baidu. com/geoconv/v1/?coords="+GpsCoord.X+","+GpsCoord. Y+"&from=1&to=5&ak=Xd93xc2Z";

ms=new TMemoryStream;

 

bdhttp- >Get(strUrl,ms);//g_Url 是地图坐

 

 API

 

const int msSize=ms- >Size; lpBuf=new char[msSize]; ms- >Position=0;

ms- >Read(lpBuf,msSize);

 

strText=String (lpBuf,msSize);// 返回 json

 

字符串

}

 

__finally

 

{

 

delete ms; delete [] lpBuf; delete bdhttp; return strText;

}

 

}

 

上述代码中用到了“百度地图”坐标转换链接 strUrl (即百度地图 WebAPI),并展示了如何接收返回的数据。

 

三、“百度地图”常用的 J a va s cript 函数介绍要完成“百度地图”的二次开发,需要调用一些常用的地图控制 JavascriptAPI,比如:(1 创建地图容器

var map=new BMap.Map("allmap");// 创建地图容

 

器对象(2 设置默认的地图中心位置

 

地图加载完毕后,显示到地图容器中时,无论如何,总有一个中心位置,用户需要指定默认的地图中心:

 

map.centerAndZoom (new BMap.Point 115.788,

 

39.2615, 14;// 北京位置(可设置为用户所在城市)(3 滚轮缩放和地图惯性拖拽map.enableScrollWheelZoomtrue;// 启用滚轮放

 

大缩小,默认禁用

 

map.enableContinuousZoom();// 启用地图惯性拖

 

拽,默认禁用(4 添加地图工具

 

var top_left_control=new BMap.ScaleControl ( {anchor:BMAP_ANCHOR_TOP_LEFT});// 左上角,添

加比例尺

 

var top_left_navigation=new BMap.Navigation Control(); // 左上角,添加默认缩放平移控件

 

var top_right_navigation=new BMap.Navigation Control({anchor: BMAP_ANCHOR_TOP_RIGHT, type: BMAP_NAVIGATION_CONTROL_SMALL}); // 右上

 

角,仅包含平移和缩放按钮 map.addControl top_left_control);

map.addControl top_left_navigation) map.addControl top_right_navigation)

5 添加覆盖物和标注文字

 

var pt0=new BMap.Point(x, y);//x,y 即为 DB9Ⅱ坐

 

 

var myIcon0=new BMap.Icon pic, new BMap.

 

Size43,94));// 图标

 

var marker0=new BMap.Marker (pt0, {icon: myIcon0}); // 创建标注

 

map.addOverlaymarker0;// 将标注添加到地图

 

 

6 点击地图覆盖物,弹出提示框

 

var infoWindow0=new BMap.InfoWindow(tip);

 

marker0.addEventListener("click", function(){this.

 

openInfoWindowinfoWindow0;setTimeoutfunction()

 

{// 定时器

 

map.closeInfoWindow();

 

}, 5000);});

 

var pt0=new BMap.Point(x, y);

 

var infoWindow0 = new BMap.InfoWindow(tip);

 

map.openInfoWindow(infoWindow0,pt0);

 

四、地图的显示

 

有了地图 API 函数,如何才能将地图显示在我们的软件里呢?如,将地图显示在一个 Windows窗口上。因为“百度地图”本身是 Web 形式的,即 B/S 模式的。而我们的软件是在 Windows 桌面上运行的,即是 C/S 模式的。所以,首要解决的问题是:如何将 B/S 模式转换为 C/S 模式,即在Windows 窗口上显示 web 页面。至于是用 C/S 模式好,还是用 B/S 模式好?这个问题不是本文讨论的重点。笔者只是根据自己擅长的技术选择 C/S 模式。

 作者的解决方法是:“IE 浏览器控件 +

 

HTML 页面”的方案。C++Builder  IE 浏览器控

 

件名是 CppWebBrowserVC++ 中的 IE 浏览器控件名是 Microsoft Web Browser。他们都封装了 IE 

 

,可以快速开发出属于自己的专用浏览器 (如:

 

360 双核浏览器,其中有一个核即为 IE 内核),并可将 Web 页面嵌入到 Windows 窗口中。在浏览器控件中,如何控制地图并响应Web 页面上的鼠标事件呢?实际上 Windows 同时提供了浏览器控件的交互 COM 接口,包含在 #include 头文件中 (可参考 COM/COM+ 编程原理)。在开发中有一个特别重要的功能需求:即要能在 C++ 中调用 Javascript 代码,让 IE 控件中的页面产生动作。如:改变地图中心、删除 / 添加地图覆盖物、更新信息提示等。C++  Javascript 脚本驱动代码如下: bool__stdcall RunJS  IHTMLDocument2 *spDoc, LPSTR lpScript,LPSTR lpLang

 

{

 

IHTMLWindow2 *pWin;

 

VARIANT vRet;

 

bool bRet = false;

 

IEForm- >CppWebBrowser1- >Document - >QueryInterface (::IID_IHTMLDocument2, reinterpret _cast(&spDoc));

if(spDoc != NULL)

 

{

 

try

 

{

 

spDoc- >get_parentWindow(&pWin); if(pWin != NULL)

{

 

try

 

{

 

pWin- >execScript (WideString(lpScript), WideString(lpLang), &vRet);

bRet=true;

 

}

 

__finally

 

{

 

pWin=NULL;

 

}

 

}

 

}

 

__finally

 

{

 

spDoc == NULL;

 

}

 

}

return bRet;

 

}

 

因为微软提供了标准 COM 交互接口,所以

 

Windows 平台上的开发工具,调用方法都类似。

 

HTML 文件是一个普通的 Web 页面文件,中间嵌入“百度地图”容器,并包含了控制地图的Javascript 函数。在桌面软件中,利用 RunJS 函数可以调用这些 Javascript 代码。Javascript 代码和 IE

 内核交互,控制页面内容。HTML 文件的具体格式可以参考“百度地图”开发文档。在 HTML 文件中,须包含这样一行语句:

 

 

包含了这行代码后,才能调用“百度地图”的 API 接口函数。HTML 文件可以放在服务器端,也可以放在客户端。如果放在服务器端,服务器上要安装“Web 服务器”软件。如:IISApache等,其中的一种。

五、“百度地图”在砂浆称重系统中的应用作者在 “建筑环保砂浆 ”项目中,使用了“百度地图”。在任意一台能连上 Internet 网络的电

 

脑上,打开专用的客户端软件,软件就能接收服务器的数据,并在地图上显示出各个工地的所有砂浆罐的“当前位置”和“实时重量”信息。地图接口调用的流程如下:

宽度2.png

宽度3.png

 

要用好“百度地图”,除了掌握 C++ 编程技术外,还需要了解和掌握多种前端和后端的编程技术,如: HTML 标记语言、Javascript 脚本语言、Web 服务器架设、客户端和服务器端的 Socket 通信、浏览器控件的 COM 交互接口、“百度地图”的 API 功能函数、内存数据库等。文中已经介绍了基本的调用流程和关键的知识点。

 作者在“建筑环保砂浆”项目中—称重计量部分,使用了“百度地图”。经实践检验,达到了预期的效果。“百度地图”虽然是免费的,但也有一些限制。如:API 接口调用次数的限制。普通 API 接口:每个 IP 每天调用上限 2000 次;坐标逆向转换 API (即 Geocoding API 调用次数为:每个 IP 每天调用 6000 次限制 (具体请参考“百度地图”的相关政策)。超过使用次数之后,将返回{"status":302,"message":" 天配额超限,限制访问 "}

“建筑环保砂浆”项目中,地图接口 API 调用不算频繁,所以基本是够用的。如果需要更高频

次的调用,需要和“百度”公司协商。

 本文重点介绍的是“百度地图”的应用。对于其他的电子地图,开发过程也基本相同。当前市面上,除“百度地图”外,还有多种商业电子地图可供选用。如:国外的谷歌地图;国内的搜狗地图、高德地图、腾讯地图等。他们都提供了二次开发接口,且大多是免费的。具体选用哪种,要结合项目的实际需求和“地图服务商”的服务质量,综合考虑。

 我想,随着 “物联网 ”(Internet of thingsIoT 的技术普及,关于“地理位置”的应用,需求也会越来越多。除了 PC 端的应用外,移动端的应用也是方兴未艾。在汽车衡行业中,应用也会更加广泛。目前,国内地磅公司中,如:耀华、柯力已经推出了成熟的产品和解决方案,起到了行业“桥头堡”的作用,其他公司也会极积跟进,加大研发力度并开拓相关市场。