qt4.8.5使用webkit加载百度离线地图

环境:

qt:4.8.5

system:ubuntu12.04

一 百度离线地图API

自己制作百度地图离线JavaScript API

1.首先获取百度 JavaScript API

首先用浏览器打开 http://api.map.baidu.com/api?v=1.3 如下图所示

其中 http://api.map.baidu.com/getscript?v=1.3&ak=&services=&t=20181030064438这个链接就是我们要找的API文件,

同样在浏览器中打开它,并另存为诸如“apiv1.3.min.js”

2.获取css文件

其中http://api.map.baidu.com/res/13/bmap.css这个链接就是我们要找的css文件,在浏览器打开他。并另存为"bmp.css"

3.js和css格式化工具

JS/HTML/CSS格式化:http://tool.chinaz.com/tools/jsformat.aspx

4.存放格式可以参考文末提供的源码

 

二. 百度离线瓦片地图

1.瓦片地图介绍

百度地图是由一张张正方形瓦片组成,在拖动地图时,只加载可视范围内的瓦片。如下图所示,每个方格代表一个瓦片,这样就可以通过访问百度瓦片地图服务器下载瓦片地图。。

2.制作瓦片地图(全能电子地图下载器)

2.1使用源码包里面的install/DiTuXiaZaiQi371015.zip解压安装,未破解(我的是xp)

2.2安装完成界面如下


3.加载瓦片地图

将下载的地图放在百度离线API指定的目录下,当然这个目录是可以通过API的源码更改的。我使用的目录是maptile(卫星地图)和maptile_(街道地图)。这样通过html引用百度离线API时,地图就显示出来了

三. qt调用百度离线瓦片地图

效果如图

四 部分源码

map.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>百度地图API1.3</title>
<script type="text/javascript" src="js/apiv1.3.min.js"></script>
<!--script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script-->
<link rel="stylesheet" type="text/css" href="bmap.css"/>
</head>
<body>
<div style="left:0;top:0;width:100%;height:100%;position:absolute;" id="container"></div>
</body>
</html>
<script type="text/javascript">
var mapOptions={
                minZoom: 3,
                maxZoom:19,
                mapType:  BMAP_NORMAL_MAP
              }
var map = new BMap.Map("container",mapOptions);      // 设置街道图为底图
//var point = new BMap.Point(116.468278, 39.922965);   // 创建点坐标
var point = new BMap.Point(120.072528, 30.328262);     //更改为自己创建的瓦片地图的经纬度
map.centerAndZoom(point,15);                         // 初始化地图,设置中心点坐标和地图级别。

//map.addControl(new BMap.MapTypeControl());
//map.addControl(new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, isOpen: true})); //缩略图控件
map.addControl(new BMap.NavigationControl({offset: new BMap.Size(10, 90)}));
map.enableScrollWheelZoom();                  // 启用滚轮放大缩小。
map.enableKeyboard();                         // 启用键盘操作。
map.enableContinuousZoom();                   // 启用连续缩放
//map.setCurrentCity("杭州");
var myIcon = new BMap.Icon("images/Point.png", new BMap.Size(20,25));
var marker = new BMap.Marker(point,{icon:myIcon});   // 创建标注
map.addOverlay(marker);                              // 加载标注
//marker.enableDragging();

var dragFlag=false;
function showAddress(longjitude,latitude)
{
   var gpsPoint = new BMap.Point(longjitude, latitude);

   if(!dragFlag)
   {
     map.panTo(gpsPoint);
   }
   marker.setPosition(gpsPoint);
}


function showStreetMap()
{
   map.setMapType(BMAP_NORMAL_MAP);
};
function showSatelliteMap()
{
   map.setMapType(BMAP_SATELLITE_MAP);
}
map.addEventListener("mousemove",function(e)
{
  qtwebkit.getCoordinate(e.point.lng,e.point.lat); //qtwebkit qt注册的对象

 });

map.addEventListener("dragstart",function(e){
   dragFlag=true;

 });

map.addEventListener("dragend",function(e){
   dragFlag=false;

 });

map.addEventListener("zoomend",function(e){

 });

</script>

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QModelIndex>
#include <QUrl>

namespace Ui {
class MainWindow;
}
class QWebView;
class QLineEdit;
class QListWidget;

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void getCoordinate(const QString &longitude, const QString &latitude);
private slots:
    void changeLocation();
    void loadStarted();
    void setProgress(int);
    void adjustTitle();
    void finishLoading(bool);
    void changeIcon();
    void showHistory();
    void gotoHistory(QModelIndex);
    void urlChanged(QUrl);
    void findText();

    void on_pbStreet_clicked();
    void on_pbMap_clicked();
protected slots:
    void onBtnCallJsClicked();
    void slotPopulateJavaScriptWindowObject();
protected:
    void paintEvent(QPaintEvent *);
private:
    Ui::MainWindow *ui;
    QWebView *mainWebView;
    QLineEdit *mainLineEdit;
    QListWidget *historyList;
    int progress;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWebView>
#include <QLineEdit>
#include <QWebHistory>
#include <QListWidget>
#include <QDebug>
#include <QWebFrame>
#include <QDir>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),progress(0)
{
    ui->setupUi(this);
    mainWebView = new QWebView(this);
    mainWebView->setParent(ui->webframe);
    resize(1024, 600);

    mainWebView->settings()->setIconDatabasePath("./");

    connect(mainWebView, SIGNAL(iconChanged()), this, SLOT(changeIcon()));
    connect(mainWebView, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
    connect(mainWebView, SIGNAL(loadProgress(int)), this, SLOT(setProgress(int)));
    connect(mainWebView, SIGNAL(titleChanged(QString)), this, SLOT(adjustTitle()));
    connect(mainWebView, SIGNAL(loadFinished(bool)), this, SLOT(finishLoading(bool)));
    connect(mainWebView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(slotPopulateJavaScriptWindowObject()));

    mainLineEdit = new QLineEdit(this);
    connect(mainLineEdit, SIGNAL(returnPressed()), this, SLOT(changeLocation()));

    ui->mainToolBar->addAction(mainWebView->pageAction(QWebPage::Back));
    ui->mainToolBar->addAction(mainWebView->pageAction(QWebPage::Forward));
    ui->mainToolBar->addAction(mainWebView->pageAction(QWebPage::Reload));
    ui->mainToolBar->addAction(mainWebView->pageAction(QWebPage::Stop));
    ui->mainToolBar->addAction(tr("查找"), this, SLOT(findText()));
    ui->mainToolBar->addWidget(mainLineEdit);
    ui->mainToolBar->addAction(tr("历史"), this, SLOT(showHistory()));

    mainLineEdit->setText("http://www.baidu.com");

    ///把源码目录下的baidu文件夹复制到可执行程序目录下
    QString htmlPth ="file://";
    htmlPth += qApp->applicationDirPath()+"/baidu/map.html";
    //mainWebView->setUrl(QUrl("file:///home/yangtq/qtSet/qtexampleset/qtcretorstudycode/webkit/baidu/map.html"));
    mainWebView->load(QUrl(htmlPth));

    historyList = new QListWidget;
    historyList->setWindowTitle(tr("历史记录"));
    historyList->setMinimumWidth(300);
    connect(historyList, SIGNAL(clicked(QModelIndex)), this, SLOT(gotoHistory(QModelIndex)));

    mainWebView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
    connect(mainWebView, SIGNAL(linkClicked(QUrl)), this, SLOT(urlChanged(QUrl)));

    connect(ui->pbCallJs, SIGNAL(clicked()), this, SLOT(onBtnCallJsClicked()));

    ui->pbMap->setEnabled(true);
    ui->pbStreet->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/*!
 * \brief MainWindow::getCoordinate
 * js地图返回的经纬度
 * \param longitude
 * 经度
 * \param latitude
 * 纬度
 */
void MainWindow::getCoordinate(const QString &longitude, const QString &latitude)
{
    ui->leMouseLongitude->setText(longitude);
    ui->leMouseLatitude->setText(latitude);
}

/*!
 * \brief MainWindow::changeLocation
 * 改变网址跳转
 */
void MainWindow::changeLocation()
{ 
    QUrl url = QUrl(mainLineEdit->text());
    mainWebView->load(url);
    mainWebView->setFocus();
}

void MainWindow::loadStarted()
{
    qDebug()<<"start:"<<mainWebView->title()<<endl;
}

void MainWindow::setProgress(int p)
{
    progress = p;
    adjustTitle();
}
/*!
 * \brief MainWindow::adjustTitle
 * 加载网页标题显示
 */
void MainWindow::adjustTitle()
{
    if( progress <= 0 || progress >= 100 )
    {
        setWindowTitle(mainWebView->title());
    }
    else
    {
        ui->statusBar->showMessage(QString("%1 (%2%)").arg(mainWebView->title()).arg(progress));
        setWindowTitle(QString("%1 (%2%)").arg(mainWebView->title()).arg(progress));
    }
}

void MainWindow::finishLoading(bool finished)
{
    if( finished )
    {
        progress = 100;
        setWindowTitle(mainWebView->title());
        ui->statusBar->showMessage(QString("%1").arg(mainWebView->title()));
    }
    else
    {
        setWindowTitle("web page loading error");
    }
}
/*!
 * \brief MainWindow::changeIcon
 * 显示网页logo
 */
void MainWindow::changeIcon()
{
    setWindowIcon(mainWebView->icon());
}
/*!
 * \brief MainWindow::showHistory
 * 加载历史纪录列表
 */
void MainWindow::showHistory()
{
    QList<QWebHistoryItem> list;
    list = mainWebView->history()->items();
    historyList->clear();
    foreach (QWebHistoryItem item, list) {
        QListWidgetItem *history = new QListWidgetItem(item.icon(), item.title());
        historyList->addItem(history);
    }
    historyList->show();
}
/*!
 * \brief MainWindow::gotoHistory
 * 跳转制定的历史记录url
 * \param index
 */
void MainWindow::gotoHistory(QModelIndex index)
{
    mainWebView->load(QUrl(mainWebView->history()->itemAt(index.row()).url()));
}

void MainWindow::urlChanged(QUrl url)
{
    mainWebView->load(url);
}
/*!
 * \brief MainWindow::findText
 * 网页搜索文本高亮显示
 */
void MainWindow::findText()
{
    mainWebView->page()->findText(mainLineEdit->text(), QWebPage::HighlightAllOccurrences);
}
/*!
 * \brief MainWindow::onBtnCallJsClicked
 * qt调用js方法
 */
void MainWindow::onBtnCallJsClicked()
{
    QString strVal = QString("showAddress(\"%1\",\"%2\");").arg(ui->leLongitude->text()).arg(ui->leLatitude->text() );
    mainWebView->page()->mainFrame()->evaluateJavaScript(strVal);

}
/*!
 * \brief MainWindow::slotPopulateJavaScriptWindowObject
 * qt注册js对象对应baidu/map.html/line58-62
 * map.addEventListener("mousemove",function(e)
{
  qtwebkit.getCoordinate(e.point.lng,e.point.lat);

 });
 */
void MainWindow::slotPopulateJavaScriptWindowObject()
{
    mainWebView->page()->mainFrame()->addToJavaScriptWindowObject("qtwebkit", this);
}

void MainWindow::paintEvent(QPaintEvent *)
{
    if(ui->leLongitude->text().isEmpty() || ui->leLatitude->text().isEmpty())
    {
        ui->pbCallJs->setEnabled(false);
    }
    else
    {
        ui->pbCallJs->setEnabled(true);
    }

}
/*!
 * \brief MainWindow::on_pbStreet_clicked
 * 显示街道图
 */
void MainWindow::on_pbStreet_clicked()
{
    QString strVal = QString("showStreetMap();");
    mainWebView->page()->mainFrame()->evaluateJavaScript(strVal);
    ui->pbMap->setEnabled(true);
    ui->pbStreet->setEnabled(false);
}
/*!
 * \brief MainWindow::on_pbMap_clicked
 * 显示卫星图
 */
void MainWindow::on_pbMap_clicked()
{
    QString strVal = QString("showSatelliteMap();");
    mainWebView->page()->mainFrame()->evaluateJavaScript(strVal);
    ui->pbStreet->setEnabled(true);
    ui->pbMap->setEnabled(false);
}

源码+jsapi+全能电子地图下载器+地图资源  (https://download.csdn.net/download/u014213012/10802932)

五 参考

http://www.cnblogs.com/i-gps/archive/2012/11/28/2791826.html (百度地图离线化(API v=1.3))

https://blog.csdn.net/caoshangpa/article/details/51015483      (Qt加载百度离线地图)

https://blog.csdn.net/jwq2011/article/details/53674125  (GPS数据包格式+数据解析)

https://blog.csdn.net/caoshangpa/article/details/51014690 (Qt WebKit与JavaScript交互)

http://lbsyun.baidu.com/jsdemo.htm#subway0_0  (百度地图api)

https://www.cnblogs.com/sigma0/p/7220334.html  (北斗定位)

http://blog.sina.com.cn/s/blog_7d0e2a110102v1o1.html  (gps定位Qt界面百度地图api的介绍)

 

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值