离线百度地图,QT添加按钮点击切换卫星地图和街道地图

一 、首先,需要在自己的map.html文件内添加:

var bdmapcfg;
	
        // 切换地图类型
	function satemap()
	{
	//百度地图api配置
	bdmapcfg = {
		'home':'../../baidumapv2/', //api主目录
		'imgext':'.jpg',  //瓦片地图后缀
		'tiles_dir':'../../baidumapv2/satellite'  //瓦片图目录
	};
		bdmapcfg.tiles_dir="../../baidumapv2/satellite";
		loadJScript();
	}
	
	function normalmap()
	{
	//百度地图api配置
	bdmapcfg = {
		'home':'../../baidumapv2/', //api主目录
		'imgext':'.png',  //瓦片地图后缀
		'tiles_dir':'../../baidumapv2/roadmap'  //瓦片图目录
	};
		bdmapcfg.tiles_dir="../../baidumapv2/roadmap";
		loadJScript();
	}
	//百度地图api功能
	function loadJScript()
	{
		var script = document.createElement("script");
		script.type = "text/javascript";
		script.src =  "../../baidumapv2/baidumap_offline_v2_20160921_min.js";
		document.body.appendChild(script);
		
		//异步加载增加代码
		window.BMap=window.BMap||{};
		window.BMap.apiLoad = function(){
			delete window.BMap.apiLoad;
			if(typeof init == "function")
			{
				init();
			}
		}
	}
	function init()
	{
		var lon = 116.403694,lat = 39.914271;
		var onlinemap = new OnlineMap(lon,lat,"map_demo");
		onlinemap.init();
	}
	
	//异步加载地图
	window.onload = loadJScript;

二、QT中添加两个QRadioButton,用来切换地图类型:

    connect(ui->radioButton,SIGNAL(clicked(bool)),this,SLOT(checkMapType()));
    connect(ui->radioButton_2,SIGNAL(clicked(bool)),this,SLOT(checkMapType()));
void MainWindow::checkMapType()
{
    if(ui->radioButton->isChecked())
    {
        QString command = QString("normalmap()");
        ui->widget->page()->runJavaScript(command);
    }
    else if(ui->radioButton_2->isChecked())
    {
        QString command = QString("satemap()");
        ui->widget->page()->runJavaScript(command);
    }
}

三、最后还需要添加一个js文件:
mapControl.js :

function OnlineMap( lon, lat, dom, mapType) {
    debugger;
    var isShow = false;
    var t1;
    //地图上加载一个要素
    function addCircle() {
        remove_overlay();
        var SW = new BMap.Point(lon - 0.022146, lat - 0.018801);
        var NE = new BMap.Point(lon + 0.022317, lat + 0.018025);

        groundOverlayOptions = {
            opacity : 0.3,
            displayOnMinLevel : 13,
            displayOnMaxLevel : 18
        }
        // 初始化GroundOverlay
        var groundOverlay = new BMap.GroundOverlay(new BMap.Bounds(SW, NE),
            groundOverlayOptions);
        // 设置GroundOverlay的图片地址
        groundOverlay.setImageURL("images/leida_white.gif");

        map.addOverlay(groundOverlay);
    }

    //清除覆盖物
    function remove_overlay() {
        map.clearOverlays();
    }

    //自动刷新要素信息
    function refreshFlyInfo() {
        var level = map.getZoom();
        if (level < 13) {
            //remove_overlay();
            isShow = false;
            //window.clearInterval(t1);
        } else {
            isShow = true;
        }
        if (isShow) {
            addCircle();
        }
    }
    OnlineMap.prototype.init = function(mapType) {
        map = "";
        map = new BMap.Map(dom,{enableMapClick:false}); // 创建Map实例
        point = new BMap.Point(lon, lat);
        map.centerAndZoom(point, 18);
        map.setMaxZoom(21);
        if(mapType){map.setMapType(mapType);}
        map.enableScrollWheelZoom(); //启用滚轮放大缩小
        t1 = window.setInterval(function() {
            refreshFlyInfo();
        }, 3000);
        map.addEventListener("zoomend", function() {
            window.clearInterval(t1);
            if (this.getZoom() < 13) {
                //remove_overlay();
            } else {
                for (var i = 0; i < map.getOverlays().length; i++) {
                    map.getOverlays()[i].show();
                }
                t1 = window.setInterval(function() {
                    refreshFlyInfo();
                }, 1000);
                addCircle();
            }
        });
        addCircle();
    }
    //显示点图标和文字信息
    OnlineMap.prototype.pointsInfo = function(flyInfo) {
        addCircle();
        if (flyInfo.length > 0) {
            for (var i = 0; i < flyInfo.length; i++) {
                var point1 = new BMap.Point(Number(flyInfo[i].x),
                    Number(flyInfo[i].y));
                var marker = new BMap.Marker(point1); // 创建标注
                marker.setTop(true);
                var icon = new BMap.Icon("images/fly.png",
                    new BMap.Size(80, 80));
                var iconshaow = new BMap.Icon("/images/fly_shadow.png", new BMap.Size(50, 50));
                marker.setIcon(icon);
                marker.setZIndex(100);
                marker.setShadow(iconshaow);
                if (map.getZoom() >= 13) {
                    map.addOverlay(marker); // 将标注添加到地图中
                }
                var label = new BMap.Label(flyInfo[i].message, {
                    offset : new BMap.Size(20, -10)
                });
                marker.setLabel(label);
            }
        }

    }

}

对了,别忘了在map.html中添加:
这是加载mapControl.js的路径

<script type="text/javascript" src="../mapControl.js"></script>

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现Qt中的离线百度地图,可以参照以下步骤: 1.首先下载离线百度地图的数据,可以从百度官方网站或其他第三方网站获取。这些数据通常以瓦片(tile)的形式呈现,并且按照地理坐标系统进行存储。 2.在Qt中创建地图窗口,可以使用QGraphicsView或QOpenGLWidget等控件来显示地图。根据需要将其放置在主窗口中。 3.在Qt中创建一个自定义的类来加载离线地图数据,并将其显示在地图窗口中。可以使用QImage或QPixmap来加载地图瓦片,并使用QPainter绘制地图。 4.根据用户的操作,可以实现地图的缩放、平移等功能。在地图窗口中使用鼠标事件和键盘事件来处理用户的交互操作,并在自定义的类中更新地图的显示。 5.为了提高地图的加载速度和性能,可以使用缓存机制来存储已经加载过的地图瓦片,避免重复加载。 6.如果需要在地图上显示标记、路径等信息,可以使用Qt中的图形元素类来实现。例如,使用QGraphicsItem来绘制标记点,使用QGraphicsPathItem来绘制路径等。 7.在加载离线百度地图时,需要根据地图瓦片的坐标系进行转换。百度地图采用的是墨卡托投影(Mercator Projection)坐标系,而Qt默认使用的是经纬度坐标系。可以通过相应的坐标转换算法来完成转换。 8.最后,根据具体需求,可以进一步定制和优化离线百度地图的功能和性能,例如添加地图切换、地理位置搜索等功能。 总之,通过使用Qt的图形和事件处理功能,结合合适的地图数据和坐标转换算法,就可以实现离线百度地图的显示和交互。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值