1.はじめに
実際、インターネットにはさまざまなオフラインマップダウンローダーがあり、ほとんどが有料です。無料のダウンローダーは、ダウンロードするタイルの数またはレベルを制限するか、ダウンロードしたタイルマップに透かしを入れて非常に見栄えがします私はこの制限を取り除くためにオフラインマップを使用する必要があることがよくあります。タイルマップの原理を再検討するために意図的に時間を費やして、オフラインマップダウンローダーを作成しました。複数のサーバーアドレスが、要求されるタイルマップのアドレスを形成します。要求を送信すると、画像は自動的に返されます。画像データを取得して画像として保存するだけで済みます。
タイルマップをダウンロードする手順は次のとおりです。
- 可視領域または管理領域の範囲を取得します
- エリアの左下隅と右上隅の緯度と経度の座標を取得します
- レベルの数に応じて、対応するレベルのタイルの数を計算します
- タイルマップをダウンロードしてリクエストを発行するためのアドレスを自動的に生成します
- 受信したデータを解析して画像として保存します
- 対応するインターフェースのダウンロード数と進行状況を更新する
- 対応する保存済みディレクトリを選択したり、すべてのレベルを選択したり、ダウンロードを途中で停止したりできます。
- 道路地図または衛星地図などをダウンロードするかどうかを選択します。
2.機能
- オンラインとオフラインの両方のマップモードがサポートされています。
- 同時に、webkitカーネル、webengineカーネル、IEカーネルをサポートします。
- 複数のラベリングポイントを設定するためのサポート。情報には、名前、住所、緯度、経度が含まれます。
- マップをマウスホイールでクリック、ドラッグ、ズームできるかどうかを設定できます。
- プロトコルのバージョン、秘密鍵、テーマスタイル、中心座標、中心都市、ジオコーディングの場所などを設定できます。
- マップのズームレベルとレベル、およびサムネイル、スケール、交通情報の表示を設定できます。
- マウスを押して対応する場所の緯度と経度を取得するなど、マップの相互作用をサポートします。
- クエリルートをサポートし、開始位置、終了位置、ルートモード、ルートモード、ルート計画を設定できます(最小時間、最小転送、最小歩行、地下鉄なし、最短距離、高速回避)
- ポイント、ライン、サーフェスツールを表示でき、マップ上にライン、ポイント、長方形、円を直接描画できます。
- 行政区画を設定し、都市領域を指定してレイヤーを描画します。オンラインマップは、行政区画境界ポイントのコレクションをオフラインマップのjsファイルに自動的に出力します。
- 複数のカバーを静的または動的に追加できます。サポートポイント、ポリライン、ポリゴン、長方形、円、円弧、ポイント集約など。
- 関数インターフェイスは、1つのクラスだけで、使いやすく、使いやすく、使いやすくなっています。
- js動的インタラクティブ追加ポイント、削除ポイント、クリアポイント、リセットポイントをサポートします。ページを更新する必要はありません。
- Qtバージョン、システム、コンパイラをサポートします。
3.体験アドレス
- エクスペリエンスアドレス:https ://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ抽出コード:1jkpファイル名:bin_map.zip
- 国内サイト:https://gitee.com/feiyangqingyun
- 国際サイト:https : //github.com/feiyangqingyun
- 個人ホームページ:https : //blog.csdn.net/feiyangqingyun
- Zhihuホームページ:https ://www.zhihu.com/people/feiyangqingyun/
4、レンダリング
V.関連コード
void MapDownload::download(const QString &url, const QString &dirName, const QString &fileName, int zoom)
{
if (url.isEmpty()) {
return;
}
//启动计时
QTime time;
time.start();
//先判断文件夹是否存在,不存在则新建
QDir dir(dirName);
if (!dir.exists()) {
dir.mkpath(dirName);
}
//局部的事件循环,不卡主界面
QEventLoop eventLoop;
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
//设置下载超时
QTimer timer;
connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
timer.setSingleShot(true);
timer.start(timeout);
eventLoop.exec();
bool error = false;
if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
//读取所有数据保存成文件
QByteArray data = reply->readAll();
QFile file(dirName + fileName);
if (file.open(QFile::WriteOnly | QFile::Truncate)) {
file.write(data);
file.close();
}
} else {
//可以自行增加下载失败的统计
error = true;
qDebug() << TIMEMS << "下载出错" << reply->errorString();
}
int useTime = time.elapsed();
emit finsh(url, fileName, zoom, useTime, error);
}