flash地图放大缩小效果源码-百度地图BMap API的应用实例

前几天,我帮一个朋友研究了几个地图API接口,推荐他使用百度BMap和谷歌GMap API。 后来他直接让我帮他做。

首先,上周我帮研究生院老师们完成的学位证书精准打印系统已经基本完成了。 晚上有时间学习js。

其次,我去年正月刚来百度实习。 我是搞js的,所以对BMap的源码、API接口风格和文档也有一些了解。

花了一天两夜的时间,实现了基本的功能需求(自定义标注、精确模糊查询、个性化添加、右键菜单等)。 我先贴出效果图:

上图的布局在顶部显示了测试的浏览器及其版本。 左边是动态加载的数据源和查询函数flash地图放大缩小效果源码flash地图放大缩小效果源码,右边是调用BMap API来实现自己的应用程序。

放大地图缩小地图_放大缩小代码_flash地图放大缩小效果源码

知识拓展:关于js和css的浏览器兼容性问题,请参考我在百度空间的博客Javascript和CSS浏览器兼容性总结

设计思路:接口为BMap API,内部功能采用模块化设计,如搜索模块、自定义添加、右键菜单事件等,这样的设计方便扩展和维护。 未来我们会考虑添加Google的GMap

下面,我们详细介绍一下内部功能是如何设计和实现的。

1. 数据源格式

数据源格式比较规则,具体格式如下:

放大地图缩小地图_flash地图放大缩小效果源码_放大缩小代码

var data = [
				{ id: 100, point: "116.397128|39.916527", addr: "紫金天子城", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 101, point: "116.422792|40.009471", addr: "十里村", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 202, point: "116.484289|39.97936", addr: "杨家大湾", mainFlow: 13, subFlow: 19.9, press: 14, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 303, point: "116.454494|39.964011", addr: "赵鹏", mainFlow: 3, subFlow: 69.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 404, point: "116.394601|39.987925", addr: "王店", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
                { id: 500, point: "116.469899|39.87684", addr: "刘村", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 501, point: "116.331292|39.949031", addr: "西子营", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 602, point: "116.374561|39.894302", addr: "马甲镇", mainFlow: 13, subFlow: 19.9, press: 14, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 703, point: "116.419527|39.945374", addr: "大牛集市", mainFlow: 3, subFlow: 69.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 804, point: "116.394601|39.987925", addr: "小牛峡湾", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" },
				{ id: 905, point: "116.368099|39.942332", addr: "徐家水库", mainFlow: 3, subFlow: 169.9, press: 4, voltage: 13.3, flashFlow: 1, isEle: "有市电", time: "2011-7-13 16:30:00" }
			];

数据源目前采用文本格式进行存储和加载。 随着需求和应用的扩展,未来将采用MySQL数据库进行保存和提取。

2.动态加载数据源(左表)

function init_MiddleLeft() {
        var top_div = document.getElementById("id_middle_left");
        var table = document.createElement("table");
        table.setAttribute("border", 1);
        table.setAttribute("width", 280);
        for (var i = 0; i < data.length; i++) {
            var tr = document.createElement("tr");
            var td = document.createElement("td");
            var str = data[i].id;
            var msg = document.createTextNode(str);
            td.appendChild(msg);
            tr.appendChild(td);
            td = document.createElement("td");
            str = data[i].addr;
            msg = document.createTextNode(str);
            td.appendChild(msg);
            tr.appendChild(td);
            td = document.createElement("td");
            var img = document.createElement("img");
            img.src = "./info.gif";
            img.value = this.data[i];
            img.onclick = function(){return click(this)};     //  img.οnclick=Function("click(this.value)");
            td.appendChild(img);
            tr.appendChild(td);
            table.appendChild(tr);
        }
        top_div.appendChild(table);
    }

左侧动态加载数据源效果图:

flash地图放大缩小效果源码_放大缩小代码_放大地图缩小地图

3.精确和模糊查询(正则表达式实现)

    // search类原型
    function searchClass(data) {
        this.datas = data;
    }
    // 设置数据源
    searchClass.prototype.setData = function (data) {
        this.datas = data;
    }
    // 去掉字符串空格
    searchClass.prototype.trim = function (str) {
        if (null == str) {
            str = "";
        } else {
            str = str.toString();
        }
        return str.replace(/(^[stxa0u3000]+)|([u3000xa0st]+$)/g, ""); 
    }
    // search原型查询模块
    // rule = {id: "id", key: "keyword", query: "single|more", show: "one|all"}
    searchClass.prototype.search = function (rule) {
        if (null == this.datas) {
            alert("数据源不存在!");
            return false;
        }
        if ("" == this.trim(rule) || "" == this.trim(rule.id) || "" == this.trim(rule.key) || "" == this.trim(rule.query)) {
            alert("请指定要搜索内容!");
            return false;
        }
        var reval = [];              // 返回值,object数组类型
        var datas = this.datas;      // search类,成员变量
        me = this;                   // 全局this,getData中me
        // 添加查询结果
        var addData = function (data) {
            reval.push(data);
        }
        // 获取查询数据源串
        var getData = function (data, id) {
            var _id = me.trim(id);
            var d = "data";
            if (0 == _id.length) {
                return data;
            } else {
                d += '["' + _id + '"]';
                return eval(d);
            }
        }
        // 检索遍历
        for (var i = 0; i < datas.length; i++) {
            var data = datas[i];
            var d = getData(data, rule.id);
            var dReg = new RegExp(this.trim(rule.key));
            if ("one" == rule.show) {                                // 显示查询标记
                if ("single" == rule.query && d == rule.key) {       // 精准查询(single)
                    addData(data);
                } else if ("more" == rule.query && dReg.test(d)) {   // 模糊查询(正则式实现)
                    addData(data);
                }
            } else if ("all" == rule.show) {                         // 显示全部标记      
                addData(data);
            }
        }
        // 返回结果
        return reval;
    }

4.标记查询结果

    // 标记查询结果
    window.addMarker = function (data_a) {
        map.clearOverlays();    // 首先清理已有标记
        // 遍历查询结果数据(data_a)
        for (var i = 0; i < data_a.length; i++) {
            // 获取坐标(经度、纬度),在地图map上显示
            var px = data_a[i].point.split("|")[0];
            var py = data_a[i].point.split("|")[1];
            var point = new BMap.Point(px, py);
            var marker = new BMap.Marker(point);
            map.addOverlay(marker);
            //marker.enableDragging(true);
            // 生成标记信息(table)
            var content = "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content = content + "";
            content += "
设备编号:" + data_a[i].id + "
安装地点:" + data_a[i].addr + "
主表流量:" + data_a[i].mainFlow + "
副表流量:" + data_a[i].subFlow + "
管网压力:" + data_a[i].press + "
设备电压:" + data_a[i].voltage + "
瞬时流量:" + data_a[i].flashFlow + "
有无市电:" + data_a[i].isEle + "
记录时间:" + data_a[i].time + "
"; // 捕获标记点击事件,并且显示信息 // 函数闭包,总是执行 (function () { var infoWindow = new BMap.InfoWindow(content); marker.addEventListener("click", function () { this.openInfoWindow(infoWindow); }); })() } }

flash地图放大缩小效果源码_放大地图缩小地图_放大缩小代码

标注效果图:

5.右键菜单的实现

    // 添加右键菜单
    var contextMenu = new BMap.ContextMenu();
    var txtMenuItem = [
        {
            text: "放大",
            callback: function () { map.zoomIn() }
        },
        {
            text: "缩小",
            callback: function () { map.zoomOut() }
        },
        {
            text: '查看北京',
            callback: function () { map.centerAndZoom("北京") }
        },
        {
            text: '放置到最大',
            callback: function () { map.zoomTo(18) }
        },
        {
            text: '获取改点坐标',
            callback: function(p){
                var px = p.lng;
                var py = p.lat;
                alert("该点坐标:n经度:" + px + "; n纬度:" + py);
            }
        },
        {
            text: '添加该店标注',
            callback: function (p) {
                var marker = new BMap.Marker(p), px = map.pointToPixel(p);
                map.addOverlay(marker);
                marker.enableDragging(true);
            }
        }
    ];
    // 遍历菜单items,添加进菜单
    for (var i = 0; i < txtMenuItem.length; i++) {
        contextMenu.addItem(new BMap.MenuItem(txtMenuItem[i].text, txtMenuItem[i].callback, 100));
        if (i == 1 || i == 3) {
            contextMenu.addSeparator();
        }
    }
    map.addContextMenu(contextMenu);    // 添加菜单到map

菜单效果图:

6. 模糊查询结果

在左侧输入“1”进行模糊匹配查询,并显示查询结果。

右侧输出3个标记结果

验证:100、101、501均包含查询关键字“1”,查询结果正确。