QT編寫(xiě)地圖實(shí)現(xiàn)離線輪廓圖的示例代碼
一、前言
離線輪廓圖使用起來(lái),就沒(méi)有在線輪廓圖方便了,在線的可以直接傳入名稱拿到,離線的只能自己繪制了,一般需要用區(qū)域輪廓圖下載器將你需要的區(qū)域下載好對(duì)應(yīng)的js文件,其實(shí)就是一堆坐標(biāo)點(diǎn)集合數(shù)組,這些數(shù)據(jù)可以在有網(wǎng)絡(luò)的地方的時(shí)候下載好,也可以在地圖上通過(guò)繪制不規(guī)則的多邊形區(qū)域得到,只要你熟知該區(qū)域的輪廓。
離線輪廓圖的加載首先引入該區(qū)域的坐標(biāo)點(diǎn)數(shù)組js文件,然后通過(guò)讀取該文件的數(shù)據(jù)傳入自定義的 addBoundary 函數(shù)進(jìn)行繪制,還可以設(shè)置顏色、粗細(xì)、透明度等。
二、功能特點(diǎn)
同時(shí)支持在線地圖和離線地圖兩種模式。
同時(shí)支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。
支持設(shè)置多個(gè)標(biāo)注點(diǎn),信息包括名稱、地址、經(jīng)緯度。
可設(shè)置地圖是否可單擊、拖動(dòng)、鼠標(biāo)滾輪縮放。
可設(shè)置協(xié)議版本、秘鑰、主題樣式、中心坐標(biāo)、中心城市、地理編碼位置等。
可設(shè)置地圖縮放比例和級(jí)別,縮略圖、比例尺、路況信息等控件的可見(jiàn)。
支持地圖交互,比如鼠標(biāo)按下獲取對(duì)應(yīng)位置的經(jīng)緯度。
支持查詢路線,可設(shè)置起點(diǎn)位置、終點(diǎn)位置、路線模式、路線方式、路線方案(最少時(shí)間、最少換乘、最少步行、不乘地鐵、最短距離、避開(kāi)高速)。
可顯示點(diǎn)線面工具,可直接在地圖上劃線、點(diǎn)、矩形、圓形等。
可設(shè)置行政區(qū)劃,指定某個(gè)城市區(qū)域繪制圖層,在線地圖自動(dòng)輸出行政區(qū)劃邊界點(diǎn)集合到j(luò)s文件給離線地圖使用。
可靜態(tài)或者動(dòng)態(tài)添加多個(gè)覆蓋物。支持點(diǎn)、折線、多邊形、矩形、圓形、弧線、點(diǎn)聚合等。
提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標(biāo)。
提供的demo直接可以單獨(dú)選點(diǎn)執(zhí)行對(duì)應(yīng)的處理比如路線查詢。
可以拿到路線查詢到的點(diǎn)坐標(biāo)信息集合,比如用于機(jī)器人坐標(biāo)導(dǎo)航等。
封裝了豐富的函數(shù)比如刪除指定點(diǎn)和所有點(diǎn),刪除指定覆蓋物和所有覆蓋物等。
標(biāo)注點(diǎn)彈框信息可以自定義內(nèi)容,標(biāo)準(zhǔn)html格式。
標(biāo)注點(diǎn)單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號(hào)。
標(biāo)注點(diǎn)可設(shè)置動(dòng)畫(huà)效果 0-不處理 1-跳動(dòng) 2-墜落
標(biāo)注點(diǎn)可設(shè)置本地圖片文件等。
函數(shù)接口友好和統(tǒng)一,使用簡(jiǎn)單方便,就一個(gè)類(lèi)。
支持js動(dòng)態(tài)交互添加點(diǎn)、刪除點(diǎn)、清空點(diǎn)、重置點(diǎn),不需要刷新頁(yè)面。
支持任意Qt版本、任意系統(tǒng)、任意編譯器。
三、體驗(yàn)地址
體驗(yàn)地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 文件名:bin_map.zip
國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國(guó)際站點(diǎn):https://github.com/feiyangqingyun
四、效果圖
五、相關(guān)代碼?
void MapBaiDu::addOverlay(QStringList &list)
{
if (overlayTypes.count() == 0 || overlayTypes.count() != overlayPoints.count()) {
return;
}
//判斷不同的類(lèi)型,添加多個(gè)覆蓋物
int count = overlayTypes.count();
for (int i = 0; i < count; ++i) {
OverlayType type = overlayTypes.at(i);
QStringList points = overlayPoints.at(i);
QString property = getOverlayProperty();
//為了支持多個(gè)覆蓋物,每個(gè)覆蓋物對(duì)應(yīng)的變量名都不一樣
QString name;
if (type == OverlayType_Marker) {
name = QString("marker%1").arg(i + 1);
list << QString(" var %2 = new %1.Marker(new %1.Point(%3));").arg(mapFlag).arg(name).arg(points.at(0));
} else if (type == OverlayType_Polyline) {
//每個(gè)圖形都有點(diǎn)集合
QStringList listPoints;
foreach (QString point, points) {
listPoints << QString("new %1.Point(%2)").arg(mapFlag).arg(point);
}
name = QString("polyline%1").arg(i + 1);
list << QString(" var %2 = new %1.Polyline([%3], %4);").arg(mapFlag).arg(name).arg(listPoints.join(",")).arg(property);
} else if (type == OverlayType_Polygon) {
//每個(gè)圖形都有點(diǎn)集合
QStringList listPoints;
foreach (QString point, points) {
listPoints << QString("new %1.Point(%2)").arg(mapFlag).arg(point);
}
name = QString("polygon%1").arg(i + 1);
list << QString(" var %2 = new %1.Polygon([%3], %4);").arg(mapFlag).arg(name).arg(listPoints.join(",")).arg(property);
} else if (type == OverlayType_Rectangle) {
if (points.count() < 2) {
continue;
}
name = QString("rectangle%1").arg(i + 1);
QString ptStart = QString("pStart%1").arg(i + 1);
QString ptEnd = QString("pEnd%1").arg(i + 1);
list << QString(" var %2 = new %1.Point(%3);").arg(mapFlag).arg(ptStart).arg(points.at(0));
list << QString(" var %2 = new %1.Point(%3);").arg(mapFlag).arg(ptEnd).arg(points.at(1));
list << QString(" var %2 = new %1.Polygon([").arg(mapFlag).arg(name);
list << QString(" new %1.Point(%2.lng, %3.lat),").arg(mapFlag).arg(ptStart).arg(ptStart);
list << QString(" new %1.Point(%2.lng, %3.lat),").arg(mapFlag).arg(ptEnd).arg(ptStart);
list << QString(" new %1.Point(%2.lng, %3.lat),").arg(mapFlag).arg(ptEnd).arg(ptEnd);
list << QString(" new %1.Point(%2.lng, %3.lat)").arg(mapFlag).arg(ptStart).arg(ptEnd);
list << QString(" ], %1);").arg(property);
} else if (type == OverlayType_Circle) {
if (points.count() < 2) {
continue;
}
//取第二個(gè)值作為半徑
int circleRadius = points.at(1).toInt();
name = QString("circle%1").arg(i + 1);
list << QString(" var point%2 = new %1.Point(%3);").arg(mapFlag).arg(i + 1).arg(points.at(0));
list << QString(" var %2 = new %1.Circle(point%3, %4, %5);").arg(mapFlag).arg(name).arg(i + 1).arg(circleRadius).arg(property);
} else if (type == OverlayType_CurveLine) {
//弧形點(diǎn)集合
QStringList listPoints;
foreach (QString point, points) {
listPoints << QString("new %1.Point(%2)").arg(mapFlag).arg(point);
}
name = QString("curveline%1").arg(i + 1);
list << QString(" var points%1 = [%2];").arg(i + 1).arg(listPoints.join(","));
list << QString(" var %2 = new %1Lib.CurveLine(points%3, %4);").arg(mapFlag).arg(name).arg(i + 1).arg(property);
} else if (type == OverlayType_Boundary) {
//離線地圖從本地加載行政區(qū)劃邊界點(diǎn)集合
if (mapLocal) {
//可能會(huì)有多個(gè)數(shù)據(jù),比如臺(tái)灣的金門(mén)島,都是獨(dú)立的區(qū)域形狀
//這個(gè) boundarys 通過(guò)最上面js文件引入產(chǎn)生的變量
list << QString(" var pointArray = [];");
list << QString(" var count = boundarys.length;");
list << QString(" for (var i = 0; i < count; ++i) {");
list << QString(" var ply = new %1.Polygon(boundarys[i].points, %2);").arg(mapFlag).arg(property);
list << QString(" map.addOverlay(ply);");
list << QString(" pointArray = pointArray.concat(ply.getPath());");
list << QString(" }");
//調(diào)整視野自適應(yīng)行政區(qū)劃區(qū)域
list << QString(" map.setViewport(pointArray);");
} else {
list << QString(" var bdary = new %1.Boundary();").arg(mapFlag);
//獲取行政區(qū)域
list << QString(" bdary.get(\"%1\", function(rs) {").arg(points.first());
//清除地圖覆蓋物
list << QString(" map.clearOverlays();");
//行政區(qū)域的點(diǎn)有多少個(gè)
list << QString(" var datas = rs.boundaries;");
list << QString(" var count = datas.length;");
list << QString(" if (count <= 0) {");
list << QString(" return;");
list << QString(" }");
list << QString(" var pointsAll = [];");
list << QString(" var pointArray = [];");
list << QString(" for (var i = 0; i < count; ++i) {");
//建立多邊形覆蓋物
list << QString(" var ply = new %1.Polygon(datas[i], %2);").arg(mapFlag).arg(property);
//取出點(diǎn)集合
list << QString(" var pts = ply.getPath();");
list << QString(" var points = [];");
list << QString(" for (var j = 0; j < pts.length; ++j) {");
list << QString(" var point = pts[j].lng + ',' + pts[j].lat;");
list << QString(" points.push(point);");
list << QString(" }");
list << QString(" pointsAll.push(points.join(';'));");
//范圍可編輯,開(kāi)啟以后可以拖動(dòng)邊界然后可以重新輸出邊界點(diǎn)集合
//list << QString(" ply.enableEditing();");
//添加覆蓋物
list << QString(" map.addOverlay(ply);");
list << QString(" pointArray = pointArray.concat(ply.getPath());");
list << QString(" }");
//調(diào)整視野自適應(yīng)行政區(qū)劃區(qū)域
list << QString(" map.setViewport(pointArray);");
//彈出+調(diào)試輸出+回調(diào)輸出 行政區(qū)劃的邊界坐標(biāo)點(diǎn)集合
//list << QString(" alert(count);");
//list << QString(" alert(datas);");
//list << QString(" console.log(datas);");
list << QString(" receiveData('boundary', pointsAll.join('|'));");
list << QString(" });");
}
} else if (type == OverlayType_MarkerClusterer) {
//點(diǎn)集合
QStringList listPoints;
foreach (QString point, points) {
listPoints << QString("new %1.Marker(new %1.Point(%2))").arg(mapFlag).arg(point);
}
list << QString(" var markers = [%1];").arg(listPoints.join(","));
//最簡(jiǎn)單的用法,生成一個(gè)marker數(shù)組,然后調(diào)用markerClusterer類(lèi)即可
list << QString(" var markerClusterer = new %1Lib.MarkerClusterer(map, {markers:markers});").arg(mapFlag);
}
//添加覆蓋物,行政區(qū)劃的覆蓋物已經(jīng)在上面代碼中添加
if (!name.isEmpty()) {
list << QString(" map.addOverlay(%1);").arg(name);
}
//設(shè)置其他效果,要放在addOverlay方法后面才有作用
if (type == OverlayType_Marker) {
//設(shè)置跳動(dòng)的點(diǎn)動(dòng)畫(huà)
list << QString(" %1.setAnimation(BMAP_ANIMATION_BOUNCE);").arg(name);
} else if (type == OverlayType_CurveLine) {
//開(kāi)啟編輯功能
list << QString(" %1.enableEditing();").arg(name);
}
}
}
到此這篇關(guān)于QT編寫(xiě)地圖實(shí)現(xiàn)離線輪廓圖的示例代碼的文章就介紹到這了,更多相關(guān)QT離線輪廓圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實(shí)現(xiàn)
這篇文章主要介紹了Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例文字相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07基于C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++中char*轉(zhuǎn)換為L(zhǎng)PCWSTR的解決方案
最近在學(xué)習(xí)C++,遇到了一個(gè)char*轉(zhuǎn)換為L(zhǎng)PCWSTR的問(wèn)題,通過(guò)查找資料終于解決了,所以下面這篇文章主要介紹了C++中char*轉(zhuǎn)LPCWSTR的解決方案,文中通過(guò)詳細(xì)的示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01QT中QColorDialog開(kāi)發(fā)實(shí)例
QColorDialog是Qt框架中用于選擇顏色的對(duì)話框類(lèi),本文主要介紹了QT中QColorDialog開(kāi)發(fā)實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式
這篇文章主要介紹了C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語(yǔ)言實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++實(shí)現(xiàn)bmp格式圖像讀寫(xiě)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)bmp格式圖像讀寫(xiě),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10搭建C語(yǔ)言開(kāi)發(fā)環(huán)境(Windows平臺(tái))匯總
本文給大家匯總了5種在WIN平臺(tái)下搭建C語(yǔ)言開(kāi)發(fā)環(huán)境的方法,包括一、在Windows平臺(tái)配置GNU環(huán)境,二、使用Sublime Test開(kāi)發(fā)C語(yǔ)言程序,三、使用VisualStudio開(kāi)發(fā)C語(yǔ)言程序,四、搭建EclipseCDT集成開(kāi)發(fā)環(huán)境,五、搭建Clion集成開(kāi)發(fā)環(huán)境,有需要的小伙伴可以參考下2015-11-11