GPS参数提取与轨道再一次现身,GIS开源程序搜聚

至于我,应接关怀
品类地址: Github
文档地址:
Gitbook
自己的博客: SHLLL的小站

分拣包罗:GIS基础函数库、GIS控件、GIS桌面程序、GIS数据引擎、WEBGIS浏览器端程序、WEBGIS服务器程序、GPS相关程序,别的分类
派系:“NET”派系,“C”派系,“Java”派系,脚本派系,别的派系 “NET”派系项目
SharpMap类库 宗旨:用于web和桌面应用程序的易用的地图库
分类:GIS基础函数库、WEBGIS服务器程序
描述:SharpMap是3个用于web和桌面应用程序的易用的地图库。它能够访问多样格式的GIS数据,提供对那么些多少的长空寻觅,同时仍是能够绘制美好的地形图。
开头时间: 语言:C# 许可:LGPL
演示:
项目网站: 成熟度(满分为拾):四活跃度(满分为十):5 言三语四:
小巧可爱,架构不错,以后正和NTS、MSSQLSpatial、GDAL/OGLacrosse等任何开源项目融合。
(点击次数) “C”派系项目 GDAL/OGENCORE类库
宗旨:援助各类矢量和栅格空间数据格式 分类:GIS基础函数库
描述:GDAL/OGQashqai类库近来是七个不等的组合模块,GDAL提供了壹整套读写分化栅格数据格式的效能的抽象类库,而OGLX570则是3个读写多数矢量数据格式功效的空洞类库。
开始时间: 语言:C、C++ 许可:MIT License
演示:使用GDAL的项目和制品居多,在那之中知名的回顾ES福睿斯I ArcGIS 九.贰+,Feature
Data Objects (FDO), FME,谷歌(Google) Earth,GRASS,MapGuide,UMN
MapServer,OpenEV,Quantum GIS (QGIS)等。 项目网址:
成熟度(满分为10):8 活跃度(满分为拾):7 评价:
近来GDAL帮助达50两种栅格数据格式,差不多覆盖了独具的购销使用软件的格式,OG智跑已经支撑包蕴天下闻名的ESLacrosseI
Shapefiles、ArcSDE,以及MapInfo、Oracle公司在内的累累买卖商城的矢量格式。此类库是其余众多开源GIS项目和小购销类型的功底。
Proj肆类库 宗旨:开源的坐标投影转变类库 分类:GIS基础函数库
描述:能够完毕在两套区别制图投影系统里面包车型地铁转换,同样差别的椭球体或大地基准面之间也得以成功的成就更动。
初阶时间: 语言:C 许可:MIT License
演示:使用Proj四的品种和产品包含GRASS
GIS,MapServer,PostGIS,Thuban,OGDI,OG汉兰达CoordinateTransformation等
项目网址:
成熟度(满分为十):八 活跃度(满分为十):5 议论: GEOS
宗旨:JTS的C++落成 分类:GIS基础函数库 描述:是“吉优metry Engine, Open
Source”的含义,其提供了OGC标准中归纳几何要素对象操作的C++语言的得以达成,详细的正规化能够在OGC网址上找到(“Simple
Features for SQL”),具体的落成格局里面都享有描述。 开头时间: 语言:C++
许可:LGPL 演示: 项目网站:
成熟度(满分为10):陆 活跃度(满分为十):伍 商量:
拓扑模型的计量格局简便可是一般来说很贵重以落到实处。GEOS/JTS/NTS的算法则对此具备的空间谓词都以十分健全的,同时在上空操作方面也极度全面。
UMN MapServer 主题:成熟的WEBGIS服务器端程序 分类:WEBGIS服务器程序
描述:UMN
MapServer是依靠CGI的通过万维网来传输动态GIS与图像的应用程序。那么些软件包还包蕴了有些单独的离线软件工具,来塑造地图、比例尺与图例。早先时间:199九语言:C 许可:
演示:
项目网站: 成熟度(满分为拾):8活跃度(满分为拾):伍 研商:
老牌的WEBGIS服务器端程序,是WEBGIS的那几个了。 GRASS QGIS
核心:易用的GIS桌面程序 分类:GIS桌面程序
描述:分界面友好,方便易用的GIS数据桌面浏览、编辑程序。 开始时间:二零零二.5语言:C++ 许可:GPL 演示:
项目网站: 成熟度(满分为10):7 活跃度(满分为十):6研究:
QGIS是四个用户分界面友好的桌面地理消息种类,可运维在Linux、Unix、Mac
OSX和Windows等平台之上。QGIS项目上马于二〇〇〇年
八月,是凭借跨平台的图纸工具Qt软件包,采取C++
语言开垦的1个GIS软件。近期的开采相当活跃,当前的新式版本是0.捌版,版本名字为Titan。
OSSIM MapGuide OpenSource PostGIS “Java”派系项目 GeoTools TMJava
宗旨:基于java applet的时态网络地图 分类:WEBGIS浏览器端程序 描述:
开首时间: 语言:Java 许可: 演示:

项目网站: 成熟度(满分为十):6活跃度(满分为十):4 讲评:
落成的功用有:时态地图、专题图功效相比较有特点。 uDig GeoServer

吉优server是叁个作用齐全,遵从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 Standards.
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追踪系统。它近来采用谷歌(Google)Maps来mapping。并能够通过插件增添对种种GPS跟踪设备的支撑。
Mapyrus
Mapyrus是二个可见把地理消息类别的数码绘制成PostScript,PDF,SVG和Web图片格式的开源项目。它构成1种恍若于BASIC的脚
本语言来读取存在关系型空间数据库(如PostGIS)中GIS数据集,文本文件,表格等。Mapyrus既能够以单独应用程序的点子运转,也得以作为1个完全的Web服务器为基于web的应用程序提供map和graph图片。 脚本派系项目
MapEasy 核心:贰个接近GoogleMap的客户端JS开源库 分类:WEBGIS浏览器端程序
描述:MapEasy以谷歌 Map的措施落成了大旨的GIS作用和轻巧地物标注等。
初始时间: 语言:Javascript 许可:
演示:
项目网站:GPS参数提取与轨道再一次现身,GIS开源程序搜聚。 成熟度(满分为十):三活跃度(满分为10):肆 评价:
完成的成效有:放大,收缩,地图切换,漫游等GIS基本作用,也促成了有个别地形图覆盖物对象,如标注等。完全国人和好支付的。
OpenLayers 主题:浏览器端地图浏览JS开源库 分类:WEBGIS浏览器端程序
描述:OpenLayers用于在浏览器端完成地图浏览的效应和中坚的zoom,pan等效果。帮忙的地图来源包涵了WMS,谷歌(Google)Map,KaMap,MSVirtualEarth等等,也得以用简短的图样作为源。
起首时间: 语言:Javascript 许可:
演示:
项目网站: 成熟度(满分为10):6活跃度(满分为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(Geographical Information
System)同时也是1个能力所能达到构建可定制GIS应用程式的成本框架。CartoWeb选取PHP伍语言开采基于UMN
MapServer引擎。

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

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

本项目是电子音信系统归结设计中移动参数提取与轨道再次出现实验的落成。为成功实验供给,大家开采了以下多少个品类:

一、上位机介绍

如今有个接了2个微型项目,内容非常的粗略,便是分析北斗GPS的串口数据然后输出经纬度,但接过来感到太简单,就发表了主观能动性,扩展了百度地图API,不但能实时定位,还是可以在地形图上标记出地方音信,用的QT伍.5。上位机运转图片如图所示:全部运维相比流利。

美高梅开户网址 1

美高梅开户网址 2

美高梅开户网址 3

美高梅开户网址 4

美高梅开户网址 5

原理就是分界面上并轨四个WebKits/WebView,让Qt和Javascript举办相互。但须要留意Qt5.陆上述版本撤废了WebView的模块,换到了webenginewidgets,看上去配置好忙绿,以致还要自个儿编写翻译什么的,固然品质只怕有指数性的晋升,但对于自个儿这一个做嵌入式软件和硬件,上位机会个基础的即便是很好的人来讲,依然webkits好一些。

2017/07/22 更新:


在本文后续版本现已适配了Qt 5.6以上版本的QWebEngine版本,抛弃了QWebKits组件,后续若有经费的话,将一而再立异扶助QWebChannel通讯通道。多个版本都得以在本文尾巴部分的附属类小部件中下载,招待学习座谈。


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

二. 付出介绍

本规划开荒入眼涉及五个方面:

  • 串口开辟(北斗GPS基于UART的,波特率115200,八,1),这些北斗GPS模块隔一s发叁回GPS数据组,会通讯多少个卫星接收数据,时而一些卫星不反馈数据。
  • 数量解析。数据解析模块蕴涵把多少个卫星的多寡按协议分开然后解析出来,这里有个难题在于Qt串口和CH340缓存BUG导致的数量包粘连和多少不总是化解。
  • 地图API驱动

GPS轨迹重现WEB版

美高梅开户网址 6
运用LeafletJS为根基,并全面庞大了LeafletJS的意义,完成了读取GPS数据仁同一视现轨迹的魔法。

2.一 串口开拓

串口开荒不用说了,请参考小编前几篇有个Bluetooth的博客,上边有源码,美高梅开户网址 ,Qt on
Android
Bluetooth开垦,本规划中的串口部分便是依赖那么些串口开垦的。串口开采自动物检疫查测试连接装置,无需进入管理器和找到COM口是稍微,自动和串口进行连接。

GPS轨迹再次出现桌面版

美高梅开户网址 7
依赖Qt五的QWebEngineWidget达成了2个Windows客户端,从而使得无需浏览器情形就可以运转轨迹再次出现项目。

2.二 数据解析

串口数量粘包和数码不一而再很脑瓜疼,进入一个串口接收槽函数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的职位。
  • 一经应用的是在线地图就须求连接网络,最注重的是坐标转变,经纬度需求和百度地图坐标进行1个改换,那几个调换是经过百度地图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文件。

工具正是2个Qt自带的windeployqt工具,另一个是Advanced
installer安装包打包程序。

3.1 搜集dll文件

一)在初步菜单找到Qt文件夹,里面有个像是cmd命令行同样的事物,作者的是MinGW的。反正运转出来那么些样子:

美高梅开户网址 8

贰)进入Qt的工程文件夹,在release大概debug里面(看您用的是release编写翻译照旧debug编译了),找到变化的exe文件夹,把这些exe文件复制到一个惠及找,方便输入路径的位置。笔者放在了D:\setup文件里了。

三)在刚刚出十二分命令行里面输入: cd /d D:\setup 切换成那些文件夹。

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

接下来您会发掘Qt把具有那一个exe文件供给的.dll文件和此外扶助库文件都放在这么些文件夹了。实在到了那步你能够打成压缩包然后发表到任何计算机,解压间接运转

3.2 使用Advanced Installer打包程序

自个儿要么相比较欣赏把他弄成安装包,那样更便宜,更标准。Advanced
Installer那个工具大概太赞了,打包的程序安装分界面13分的正经,一点都不山寨,还有大多安装包的皮肤可供采用。如图为打好包的Logo:

美高梅开户网址 9

运转后的功用如图:

美高梅开户网址 10

美高梅开户网址 11

美高梅开户网址 12

内部还提供了导入注册表、安装后创设快速格局等等方便的布局。

** 下载地址: **

应用教程,照旧参考前边的参考文献中的【4】,这里不在赘述了。

正文附属类小部件:

[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百度贴吧,贰零14-04-2八
[4] Prodesire,Windows安装包制作指南-Advanced
Installer的利用,cnBlogs博客,2016-08-18
[5]
jwq2011的专栏,GPS数据包格式+数据解析,CSDN博客,2016-12-15

版权评释:

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

贰· 文中涉及的剧情若有侵权行为,请与作者联系,本人会及时去除。

三·
另眼相看成果,本文将用的参考文献全体交付,向无私的程序猿,爱好者致敬。


发表评论

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

网站地图xml地图