Qt开辟北斗定位系统融入百度地图API及Qt程序打包发表,GIS开源程序搜集

By admin in 4858美高梅 on 2019年5月5日

至于本身,应接关怀
品种地址: Github
文书档案地址:
Gitbook
自笔者的博客: SHLLL的小站

分拣包涵:GIS基础函数库、GIS控件、GIS桌面程序、GIS数据引擎、WEBGIS浏览器端程序、WEBGIS服务器程序、GPS相关程序,其余分类
派系:“NET”派系,“C”派系,“Java”派系,脚本派系,其余派系 “NET”派系项目
SharpMap类库 宗旨:用于web和桌面应用程序的易用的地形图库
分类:GIS基础函数库、WEBGIS服务器程序
描述:SharpMap是一个用于web和桌面应用程序的易用的地图库。它能够访问两种格式的GIS数据,提供对那些多少的空中寻觅,同时还足以绘制能够的地图。
初始时间: 语言:C# 许可:LGPL
演示:
项目网站: 成熟度(满分为拾):4活跃度(满分为10):伍 商酌:
小巧可爱,框架结构不错,以后正和NTS、MSSQLSpatial、GDAL/OG凯雷德等别的开源项目融合。
(点击次数) “C”派系项目 GDAL/OG奥迪Q7类库
主旨:补助各样矢量和栅格空间数据格式 分类:GIS基础函数库
描述:GDAL/OG中华V类库近日是四个差异的组成模块,GDAL提供了壹整套读写不相同栅格数据格式的效应的抽象类库,而OG智跑则是1个读写繁多矢量数据格式成效的空洞类库。
初叶时间: 语言:C、C++ 许可:MIT License
演示:使用GDAL的花色和制品不少,当中有名的统揽ESQX56I ArcGIS 九.贰+,Feature
Data Objects (FDO), FME,谷歌 Earth,GRASS,MapGuide,UMN
MapServer,OpenEV,Quantum GIS (QGIS)等。 项目网站:
成熟度(满分为10):八 活跃度(满分为十):7 讲评:
近来GDAL辅助达50各样栅格数据格式,差不多遮住了有着的商业贸易使用软件的格式,OG宝马X5已经协理包涵举世闻名的ES途睿欧I
Shapefiles、ArcSDE,以及MapInfo、Oracle公司在内的过多商业贸易铺面包车型的士矢量格式。此类库是此外众多开源GIS项目和生意项目标根底。
Proj四类库 主旨:开源的坐标投影调换类库 分类:GIS基础函数库
描述:能够产生在两套分化制图投影系统里面包车型大巴转移,一样不相同的椭球体或大地基准面之间也能够成功的形成更动。
开端时间: 语言:C 许可:MIT License
演示:使用Proj四的档期的顺序和制品包涵GRASS
GIS,MapServer,PostGIS,Thuban,OGDI,OG奥德赛CoordinateTransformation等
项目网站:
成熟度(满分为10):八 活跃度(满分为十):伍 两道三科: GEOS
主旨:JTS的C++完结 分类:GIS基础函数库 描述:是“吉优metry Engine, Open
Source”的含义,其提供了OGC标准中回顾几何要素对象操作的C++语言的贯彻,详细的正儿八经能够在OGC网站上找到(“Simple
Features for SQL”),具体的达成格局里面都抱有描述。 早先时间: 语言:C++
许可:LGPL 演示: 项目网站:
成熟度(满分为10):六 活跃度(满分为10):伍 讲评:
拓扑模型的估摸划办公室法轻松易行可是一般来说很宝贵以实现。GEOS/JTS/NTS的算法则对此具有的上空谓词都是那多少个结实的,同时在半空操作方面也特别健全。
UMN MapServer 核心:成熟的WEBGIS服务器端程序 分类:WEBGIS服务器程序
描述:UMN
MapServer是依据CGI的经过万维网来传输动态GIS与图像的应用程序。这些软件包还包蕴了有的独立的离线软件工具,来构造建设地图、比例尺与图例。伊始时间:1998语言:C 许可:
演示:
项目网站: 成熟度(满分为十):八活跃度(满分为十):5 讲评:
老牌的WEBGIS服务器端程序,是WEBGIS的相当了。 GRASS QGIS
大旨:易用的GIS桌面程序 分类:GIS桌面程序
描述:分界面友好,方便易用的GIS数据桌面浏览、编辑程序。 早先时间:二零零三.5语言:C++ 许可:GPL 演示:
项目网站: 成熟度(满分为10):7 活跃度(满分为十):陆商议:
QGIS是贰个用户分界面友好的桌面地理音信种类,可运维在Linux、Unix、Mac
OSX和Windows等平台之上。QGIS项目始于于二零零一年
4月,是依附跨平台的图形工具Qt软件包,采纳C++
语言开垦的一个GIS软件。方今的开支万分活跃,当前的流行版本是0.八版,版本名叫Titan。
OSSIM MapGuide OpenSource PostGIS “Java”派系项目 吉优Tools TMJava
主旨:基于java applet的时态互连网地图 分类:WEBGIS浏览器端程序 描述:
初阶时间: 语言:Java 许可: 演示:

项目网站: 成熟度(满分为10):6活跃度(满分为10):肆 说长话短:
落成的效益有:时态地图、专题图成效比较有特色。 uDig 吉优Server

吉优server是1个功能齐全,遵守OGC开放规范的开源WFS-T和WMS服务器。利用
吉优server能够把多少作为maps/images来发布(利用WMS来兑现)也能够一贯发布实际的数目(利用WFS来得以落成),同时也提供了修改,删除和新添的功力(利用WFS-T)。
JavaTopologySuite JUMP DeeGree OpenMap 吉优API The 吉优API project aims to
reduce duplication and increase interoperability by providing neutral,
interface-only APIs derived from OGC/ISO 斯坦dards.
Batik Batik is a
Java-based toolkit for applications or applets that want to use images
in the Scalable Vector Graphics (SVG) format for various purposes, such
as display, generation or manipulation.
转载:
gvSIG
瓦伦西亚自治区的开源地理新闻种类 汉语网址地址:

gvSIG是五个地理音信处理工科具。
分界面友好和飞快读取栅格数据或矢量数据的效用是该种类的特等风味。而且,它不唯有能够读取本地数据还是能够因此WMS、WCS或WFS服务读取远程数据。
GNU/GPL OpenGTS OpenGTS(Open sourced GPS Tracking
System)提供叁个基础框架用于创制属于您的基于Web的GPS追踪系统。它如今选取谷歌Maps来mapping。并可以透过插件扩展对种种GPS追踪设备的支持。
Mapyrus
Mapyrus是三个可见把地理音讯类其余多寡绘制成PostScript,PDF,SVG和Web图片格式的开源项目。它构成1种恍若于BASIC的脚
本语言来读取存在关系型空间数据库(如PostGIS)中GIS数据集,文本文件,表格等。Mapyrus既能够以单独应用程序的格局运维,也得以作为二个完整的Web服务器为基于web的应用程序提供map和graph图片。 脚本派系项目
MapEasy 核心:2个像样谷歌Map的客户端JS开源库 分类:WEBGIS浏览器端程序
描述:MapEasy以谷歌(Google) Map的点子落成了骨干的GIS功用和精炼地物标注等。
起头时间: 语言:Javascript 许可:
演示:
项目网站: 成熟度(满分为10):叁活跃度(满分为10):四 商议:
完成的效益有:放大,缩短,地图切换,漫游等GIS基本成效,也兑现了一些地图覆盖物对象,如标注等。完全国人温馨开支的。
OpenLayers 主旨:浏览器端地图浏览JS开源库 分类:WEBGIS浏览器端程序
描述:OpenLayers用于在浏览器端落成地图浏览的功效和着力的zoom,pan等成效。扶助的地形图来源包含了WMS,谷歌Map,KaMap,MSVirtualEarth等等,也可以用轻便的图形作为源。
初步时间: 语言:Javascript 许可:
演示:
项目网站: 成熟度(满分为10):六活跃度(满分为十):五 商酌:
OpenLayers达成访问地理空间数据的秘籍都合乎行业标准。比方OpenGIS的WMS(Web
Mapping Service)和WFS(Web Feature
Service)标准。OpenLayers接纳面向对象方式支付,并采纳来源Prototype.js和Rico中的一些零件。
kaMap JavaScript完结的Ajax Web
Map客户端,包括基于MapServer的服务端帮忙代码,客户端浮现流畅,但和MapServer关联很紧,客户端和服务端代码关联太紧,不是彻彻底底的WMS客户端。
MapBuilder 用JavaScript落成了Web Map
Context标准,可以突显和决定来自不一样WMS服务的不一致map
Mapbender
提供显示、导航和询问WMS相匹配地图服务的才干,其框架包蕴用户和组管理、访问WMS所生成地图等功效的接口,下一步将协理WFS和目录服务;
msCross

CartoWeb
CartoWeb是3个成效强大的Web-GIS(吉优graphical Information
System)同时也是八个能力所能达到创设可定制GIS应用程式的付出框架。CartoWeb采取PHP伍语言开荒基于UMN
MapServer引擎。

本文来自CSDN博客,转发请标明出处:

Qt开辟北斗定位系统融入百度地图API及Qt程序打包发布

本项目是电子消息系统总结安排中活动参数提取与轨道再次出现实验的兑现。为造成实验须要,大家付出了以下多少个档案的次序:

一、上位机介绍

近年来有个接了一个微型项目,内容很简短,正是分析北斗GPS的串口数据然后输出经纬度,但接过来感觉太轻巧,就表明了主观能动性,扩展了百度地图API,不但能实时定位,还是能在地图上标志出地点音信,用的QT5.伍。上位机运行图片如图所示:全体运转相比较流畅。

4858美高梅 1

4858美高梅 2

4858美高梅 3

4858美高梅 4

4858美高梅 5

原理正是分界面上并轨贰个WebKits/WebView,让Qt和Javascript举办互相。Qt开辟北斗定位系统融入百度地图API及Qt程序打包发表,GIS开源程序搜集。但必要留意Qt五.六上述版本撤除了WebView的模块,换到了webenginewidgets,看上去配置好劳累,以至还要本身编写翻译什么的,纵然品质恐怕有指数性的晋升,但对此笔者这么些做嵌入式软件和硬件,上位机会个基础的就算是很好的人来讲,照旧webkits好一些。

2017/07/22 更新:


在本文后续版本现已适配了Qt 5.陆以上版本的QWebEngine版本,放弃了QWebKits组件,后续若有经费的话,将一连立异支持QWebChannel通讯通道。八个版本都能够在本文尾巴部分的附属类小部件中下载,欢迎学习座谈。


  1. 依靠LeafletJS的GPS轨迹重现的WEB端
  2. 据说Qt WebEngine的桌面端程序
  3. 依靠NodeJS和MySQL数据库的地图离线服务器

二. 开荒介绍

本统一筹划开辟首要涉及四个方面:

  • 串口开拓(北斗GPS基于UART的,波特率115200,捌,一),那几个北斗GPS模块隔1s发二遍GPS数据组,会通讯多少个卫星接收数据,时而一些卫星不举报数据。
  • 数量解析。数据解析模块包蕴把多少个卫星的多少按协议分开然后解析出来,这里有个难点在于Qt串口和CH340缓存BUG导致的数据包粘连和多少不一连化解。
  • 地图API驱动

GPS轨迹再现WEB版

4858美高梅 6
选择LeafletJS为底蕴,并完美扩充了LeafletJS的功效,完成了读取GPS数据仁同一视现轨迹的功能。

2.1 串口开荒

串口开采不用说了,请参见笔者前几篇有个Bluetooth的博客,上边有源码,Qt on
Android
蓝牙五.0开采,本规划中的串口部分正是依据这几个串口开采的。串口开拓自动物检疫查评定连接装置,无需进入管理器和找到COM口是稍微,自动和串口举行延续。

GPS轨迹重现桌面版

4858美高梅 7
依据Qt5的QWebEngineWidget落成了三个Windows客户端,从而使得无需浏览器景况就可以运转轨道重现项目。

二.二 数据解析

串口数据粘包和数码不三番五次很发烧,进入多个串口接收槽函数QString
rxArray.append(serialPort->readAll() );
接收数据不完全,恐怕说会分好几遍开始展览吸收,而且分好两遍收到长度未有规律,所以无法直接运用收取的数据。

一S钟GPS出殡二次数据为:

/*
$GNRMC,114821.880,V,3957.378130,N,11620.848015,E,0.000,0.000,230417,,E,N*23
$GNGGA,114821.880,3957.378130,N,11620.848015,E,0,00,127.000,100.800,M,0,M,,*6D
$GNGLL,3957.378130,N,11620.848015,E,114821.880,V,N*52
$GNGSA,A,1,,,,,,,,,,,,,127.000,127.000,127.000*2A
$GNGSA,A,1,,,,,,,,,,,,,127.000,127.000,127.000*2A
$GPGSV,1,1,4,17,57,315,21,22,35,67,,28,75,176,,30,12,204,*74
*/

数据量比较巨大,所以那边扩展管理机制,尽量保留完好数据。

// 接收数据槽函数

void Widget::RxData(){


    QString rxString;

    rxArray.append(serialPort->readAll());
    //qDebug() << QString(rxArray);
    if( serialRead == true ){
        // 数据对齐,如果上次数据是一半,抛弃数据,重新接受
        times++;
        rxString = QString(rxArray);
        //qDebug() << "rec:" << rxString;
        ui->textBrowser->append(tr("--------------------------------------------------------------------------"));
        ui->textBrowser->append("从北斗GPS传感器第("+QString::number(times)+")次接受数据:");
        ui->textBrowser->append(tr("--------------------------------------------------------------------------"));
        ui->textBrowser->append(QString(rxArray));
        gpsDatasProcessing( rxArray );
        rxArray.clear();
        serialRead = false;
        if( times%50 == 0 ) {
            ui->textBrowser->clear();
        }
        ui->textBrowser->append(tr("--------------------------------------------------------------------------\r"));
    }else{
        return;
    }
    // 解析数据

}
void Widget::gpsDatasProcessing(QByteArray GPSBuffer)
{

    QString GPSBufferString = QString( GPSBuffer );
    int error_pos = 0;
    QString GNRMC_String = NULL;
    QString GPGGA_String = NULL;
    QString GPGSV_String = NULL;
    QString GPRMC_String = NULL;
    QString GPGLL_String = NULL;
    QString GNGGA_String = NULL;
    bool latiflag = false;
    bool atiflag = false;
    bool utcflag = false;
    bool speedflag = false;
    bool longtiflag = false;

    QList<QString> gpsStringList = GPSBufferString.split('\n');


    // 由于定时间隔,数据包发生黏连,纠正数据。
    if( gpsStringList.at(0).at(0) != '$' ) {
        QString ErrorString =  gpsStringList.at(gpsStringList.length()-1) + gpsStringList.at(0);
        error_pos = 1;
        if( ErrorString.contains("$GNRMC") ){
            GNRMC_String = ErrorString;
        }else if( ErrorString.contains("$GPGGA") ) {
            GPGGA_String = ErrorString;
        }else if( ErrorString.contains("$GPGSV")  ) {
            GPGSV_String = ErrorString;
        }else if( ErrorString.contains("$GPRMC") ) {
            GPRMC_String = ErrorString;
        }else if( ErrorString.contains("$GPGLL") ) {
            GPGLL_String = ErrorString;
        }else if( ErrorString.contains("$GNGGA") ) {
            GNGGA_String = ErrorString;
        }

    }else{
        error_pos = 0;
    }
    // 从QList中得到数据
    for( int i = error_pos; i < gpsStringList.length()- error_pos; i++ ) {
        if( gpsStringList.at(i).contains("$GNRMC") ){
            GNRMC_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGGA") ) {
            GPGGA_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGSV")  ) {
            GPGSV_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPRMC") ) {
            GPRMC_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GPGLL") ) {
            GPGLL_String = gpsStringList.at(i);
        }else if( gpsStringList.at(i).contains("$GNGGA") ) {
            GNGGA_String = gpsStringList.at(i);
        }
    }
    if( !GPGGA_String.isNull() ) {
        QList<QString> gpggaStrList = GPGGA_String.split(",");
        QString utcstr = gpggaStrList.at(1);
        ui->lineEdit_UTC->setText("格林威治时间:"+utcstr.mid(0,2)+":"+utcstr.mid(2,2)+":"+utcstr.mid(4,2));
        QString latistr = gpggaStrList.at(2);
        ui->lineEdit_latitude->setText("北纬"+latistr.mid(0,2)+"度"+latistr.mid(2,7)+"分");
        QString altistr = gpggaStrList.at(4);
        ui->lineEdit_longitude->setText("西经"+altistr.mid(0,3)+"度"+altistr.mid(3,7)+"分");
        utcflag = true;
        latiflag = true;
        atiflag = true;
    }
    if( !GNGGA_String.isNull() ) {
        if( !latiflag ) {
            QList<QString> gnggaStrList = GNGGA_String.split(",");
            QString utcstr = gnggaStrList.at(1);
            UTC2BTC(&utcstr);
            ui->lineEdit_UTC->setText("北京时间:"+utcstr.mid(0,2)+":"+utcstr.mid(2,2)+":"+utcstr.mid(4,2));
            QString latistr = gnggaStrList.at(2);
            ui->lineEdit_latitude->setText("北纬"+latistr.mid(0,2)+"°"+latistr.mid(2,9)+"'");
            double double_lati = latistr.mid(0,2).toDouble()+(latistr.mid(2,7).toDouble()+0.25)/60;
            QString altistr = gnggaStrList.at(4);
            ui->lineEdit_longitude->setText("西经"+altistr.mid(0,3)+"°"+altistr.mid(3,9)+"'");
            double double_alti = altistr.mid(0,3).toDouble()+(altistr.mid(3,7).toDouble()+0.25)/60;

            setCoordinate(QString::number(double_alti),QString::number(double_lati));
            //setCoordinate(QString::number(108.886119),QString::number(34.223921));
            qDebug()<< "纬度:"<<QString::number(double_alti)<<"|"<<"经度:"<< QString::number(double_lati) << "\n";
            QString longtistr = gnggaStrList.at(9);
            ui->lineEdit_altitude->setText(longtistr+"m ");
            ui->lineEdit_speed->setText("无效PPS");

            utcflag = true;
            latiflag = true;
            atiflag = true;

        }
    }

}
void Widget::slotSerialTimerOut()
{
    if( serialRead == false ){
        serialRead = true;
    }
}

本地离线地图服务器

基于Node.JS达成的离线地图服务端,读取存款和储蓄至MySQL中的离线瓦片地图数据,并家庭当地端口落成当地服务器。

贰.叁 百度地图API

百度地图API笔者找了重重素材,参考资料本文附录,非凡谢谢博客名“灿三哥”,“我是大渣男”的整理,“灿堂弟”在小说中不止提供了离线地图和办法,还提供了对于地图的主干介绍,对于地图下边包车型大巴操作,请参考灿小弟的博客。但就作者付出本人想建议两点:

  • 本统一希图使用的是离线地图,地图包30M左右,不联网也能够利用。把地图包,放在编写翻译的release也许debug文件夹下,载Qt主程序中的url协商地图html的职务。
  • 倘诺利用的是在线地图就须要两次三番网络,最注重的是坐标调换,经纬度须求和百度地图坐标举办二个转移,这些转变是因此百度地图API的接口实行的,而且普通用户转变还有次数限制。  
  • 其一离线地图没有须要转移,直接利用经纬度就能够稳固。

下边代码能够观察Qt和Javascript怎样相互的。

void Widget::getCoordinate(QString lon,QString lat)
{
    QString tempLon="鼠标经度:"+lon+"°";
    QString tempLat="鼠标纬度:"+lat+"°";
    ui->labelMouseLongitude->setText(tempLon);
    ui->labelMouseLatitude->setText(tempLat);
}

void Widget::setCoordinate(QString lon,QString lat)
{
    QWebFrame *webFrame = ui->webView->page()->mainFrame();
    QString cmd = QString("showAddress(\"%1\",\"%2\")").arg(lon).arg(lat);
    webFrame->evaluateJavaScript(cmd);
}
void Widget::on_pushButtonStreetMap_clicked()
{
    QWebFrame *frame = ui->webView->page()->mainFrame();
    QString cmd = QString("showStreetMap()");
    frame->evaluateJavaScript(cmd);
    ui->pushButtonSatelliteMap->setEnabled(true);
    ui->pushButtonStreetMap->setEnabled(false);
}

void Widget::on_pushButtonSatelliteMap_clicked()
{
    QWebFrame *frame = ui->webView->page()->mainFrame();
    QString cmd = QString("showSatelliteMap()");
    frame->evaluateJavaScript(cmd);
    ui->pushButtonSatelliteMap->setEnabled(false);
    ui->pushButtonStreetMap->setEnabled(true);
}

void Widget::slotPopulateJavaScriptWindowObject()
{
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ReinforcePC", this);

}

总结

通过以上多少个连串,大家全体的兑现了从GPS数据读取到轨道重现再到离线地图加载等每个职能,较为完好的姣好了尝试。

三. 顺序打包

做完那个程序今后呢,笔者起来商量怎样给程序打包,终于在三个小时内消除了。

Step1:把所急需的dll文件集成出来。

Step二:用工具把dll文件exe文件和此外文件封装起来,做成msi大概exe文件。

工具就是贰个Qt自带的windeployqt工具,另3个是Advanced
installer安装包打包程序。

3.1 搜集dll文件

1)在开始菜单找到Qt文件夹,里面有个像是cmd命令行同样的事物,小编的是MinGW的。反正运营出来那么些样子:

4858美高梅 8

二)进入Qt的工程文件夹,在release或许debug里面(看你用的是release编译依旧debug编写翻译了),找到变化的exe文件夹,把那么些exe文件复制到3个方便人民群众找,方便输入路线的地点。我放在了D:\setup文件里了。

3)在刚刚出格外命令行里面输入: cd /d D:\setup 切换成那几个文件夹。

4)输入指令: windeployqt xxx.exe xxx.exe正是您刚才编写翻译出exe的名字。

下一场您会发觉Qt把富有这么些exe文件要求的.dll文件和其他协理库文件都放在那些文件夹了。骨子里到了这步你可以打成压缩包然后宣布到任何电脑,解压直接运营

三.二 使用Advanced Installer打包程序

自家或许比较喜欢把她弄成安装包,那样更便宜,更职业。Advanced
Installer这些工具简直太赞了,打包的程序安装分界面十一分的标准,一点都不山寨,还有很多安装包的皮层可供选用。如图为打好包的Logo:

4858美高梅 9

运作后的意义如图:

4858美高梅 10

4858美高梅 11

4858美高梅 12

里面还提供了导入注册表、安装后创设神速情势等等方便的配置。

** 下载地址: **

运用教程,依然参考前面包车型地铁参考文献中的【四】,这里不在赘述了。

本文附属类小部件:

[1]
本程序旧版安装包下载地址如下:百度云盘地址
提取码:41hx (2017-04-29)

[2]
本程序新版安装包下载地址如下:百度云盘地址
提取码:o59r (2017-07-22更新)

参考文献:

[1]
小编是大渣男,gps定位Qt分界面百度地图api的介绍,CSDN博客,2014-08-24
[2]
灿哥哥,Qt加载百度离线地图,CSDN博客,2016-03-30
[3]
winland0704,Qt官方开拓景况变迁的exe揭橥办法–使用windeployqt,Qt百度贴吧,2015-04-28
[4] Prodesire,Windows安装包制作指南-Advanced
Installer的运用,cnBlogs博客,2016-08-18
[5]
jwq2011的专栏,GPS数据包格式+数据解析4858美高梅 ,,CSDN博客,2016-12-15

版权申明:

1· 本文为MULTIBEANS团队研究开发跟随小说,未经同意不得转发。

2· 文中涉嫌的剧情若有侵权行为,请与笔者联系,自身会立马删除。

三·
讲究成果,本文将用的参考文献全体付给,向无私的程序猿,爱好者致敬。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有