• 百度地图标注多个点


    从业多年来,一直都是在计算kpi,最近由于项目需要需要在地图上打点。很好玩,希望可以深入下去;

    1 GPS坐标和百度坐标转换

    static double pi = 3.14159265358979324;
        static double a = 6378245.0;
        static double ee = 0.00669342162296594323;
        public final static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    
        public static double[] wgs2bd(double lat, double lon) {
               double[] wgs2gcj = wgs2gcj(lat, lon);
               double[] gcj2bd = gcj2bd(wgs2gcj[0], wgs2gcj[1]);
               return gcj2bd;
        }
    
        public static double[] gcj2bd(double lat, double lon) {
               double x = lon, y = lat;
               double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
               double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
               double bd_lon = z * Math.cos(theta) + 0.0065;
               double bd_lat = z * Math.sin(theta) + 0.006;
               return new double[] { bd_lat, bd_lon };
        }
    
        public static double[] bd2gcj(double lat, double lon) {
               double x = lon - 0.0065, y = lat - 0.006;
               double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
               double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
               double gg_lon = z * Math.cos(theta);
               double gg_lat = z * Math.sin(theta);
               return new double[] { gg_lat, gg_lon };
        }
    
        public static double[] wgs2gcj(double lat, double lon) {
               double dLat = transformLat(lon - 105.0, lat - 35.0);
               double dLon = transformLon(lon - 105.0, lat - 35.0);
               double radLat = lat / 180.0 * pi;
               double magic = Math.sin(radLat);
               magic = 1 - ee * magic * magic;
               double sqrtMagic = Math.sqrt(magic);
               dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
               dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
               double mgLat = lat + dLat;
               double mgLon = lon + dLon;
               double[] loc = { mgLat, mgLon };
               return loc;
        }
    
        private static double transformLat(double lat, double lon) {
               double ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * Math.sqrt(Math.abs(lat));
               ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
               ret += (20.0 * Math.sin(lon * pi) + 40.0 * Math.sin(lon / 3.0 * pi)) * 2.0 / 3.0;
               ret += (160.0 * Math.sin(lon / 12.0 * pi) + 320 * Math.sin(lon * pi  / 30.0)) * 2.0 / 3.0;
               return ret;
        }
    
        private static double transformLon(double lat, double lon) {
               double ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * Math.sqrt(Math.abs(lat));
               ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
               ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
               ret += (150.0 * Math.sin(lat / 12.0 * pi) + 300.0 * Math.sin(lat / 30.0 * pi)) * 2.0 / 3.0;
               return ret;
        }
    百度和GPS坐标转换

    2 百度map API 接口学习

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap { 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
            #l-map{height:100%;78%;float:left;border-right:2px solid #bcbcbc;}
            #r-result{height:100%;20%;float:left;}
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
        <title>添加多个标注点</title>
    </head>
    <body>
        <div id="allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
        // 百度地图API功能
        var map = new BMap.Map("allmap");
        var point = new BMap.Point(116.404, 39.915);
        map.centerAndZoom(point, 15);
        // 编写自定义函数,创建标注
        function addMarker(point){
          var marker = new BMap.Marker(point);
          map.addOverlay(marker);
        }
        // 随机向地图添加25个标注
        var bounds = map.getBounds();
        var sw = bounds.getSouthWest();
        var ne = bounds.getNorthEast();
        var lngSpan = Math.abs(sw.lng - ne.lng);
        var latSpan = Math.abs(ne.lat - sw.lat);
        for (var i = 0; i < 25; i ++) {
            var point = new BMap.Point(sw.lng + lngSpan * (Math.random() * 0.7), ne.lat - latSpan * (Math.random() * 0.7));
            addMarker(point);
        }
    </script>
    百度实例

    3 实现过程

    工程文件结构目录
    
    ---js
    ---css
    ---img
    index.html

    要打点的数据放入js文件夹中的data.js文件中
    css存放一些样式模版
    img存放一些标注的图例

    index.html

    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap { 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=LQzxqhwaGvdrWbKI4BGmwIEy"></script>
        <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
        <script type="text/javascript" src="js/data.js"></script>
        <link rel="stylesheet" href="css/ui-dialog.css">
        <script type="text/javascript" src="js/dialog.js"></script>
        <title>HZ_ATM</title>
    </head>
    <body>
        <div id="allmap"></div>
    </body>
    </html>
    
    
    <script type="text/javascript">
    function drawBoundary(name) {
        var bdary = new BMap.Boundary();
        bdary.get(name, function(rs){
            var count = rs.boundaries.length;
            for(var i = 0; i < count; i++){
                var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 3, strokeColor: "#ff0000", fillColor: ""});
                map.addOverlay(ply);
                if (i == 0) {
                    // x1,y1;x2,y2;
                    var tmp = rs.boundaries[i].split(";");
                    var pa = [];
                    for (var j = 0; j < tmp.length; j++) {
                        var tmp1 = tmp[j].split(",");
                        if (tmp1.length == 2) {
                            pa.push(new BMap.Point(tmp1[0], tmp1[1]));
                        }
                    }
                    console.log(pa);
                    map.setViewport(pa);
                }
            }
        });
    }
    
    function drawAreaBoundary() {
        var d = dialog({
            title: '请输入行政区名(如"北京")',
            content: '<div style="margin:5px" ><input autofocus id="input_area_name"/></div>',
            okValue: '确定',
            ok: function () {
                var name = $('#input_area_name').val();
                if (name == "") {
                    return false;
                }
                drawBoundary(name);
                this.remove();
            },
            cancelValue: '取消',
            cancel: function () {}
        });
        d.showModal();
    }
    
    
    
        // 百度地图API功能
        var menu = new BMap.ContextMenu();
        menu.addItem(new BMap.MenuItem('绘制行政区边界', drawAreaBoundary, 100));
        var map = new BMap.Map("allmap");
        var point = new BMap.Point(120.149287,30.256395);
        map.centerAndZoom(point, 9);
        map.addControl(new BMap.MapTypeControl());          //添加地图类型控件
        map.addControl(new BMap.NavigationControl());               // 添加平移缩放控件
        map.addControl(new BMap.ScaleControl());                    // 添加比例尺控件
        map.addControl(new BMap.OverviewMapControl());              //添加缩略地图控件
        map.enableScrollWheelZoom();                  // 启用滚轮放大缩小
        map.enableKeyboard();                         // 启用键盘操作    
        map.addContextMenu(menu);
        
        var myIcon = new BMap.Icon("img/atm.png", new BMap.Size(20, 30), {  
             offset: new BMap.Size(0, 0), // 指定定位位置  
             imageOffset: new BMap.Size(0, 0) // 设置图片偏移  
        }); 
       $.each(a,function(n,value){
         var marker2 = new BMap.Marker(new BMap.Point(value.ln,value.la),{icon:myIcon});  // 创建
         map.addOverlay(marker2);
         marker2.addEventListener("click",getAttr2);
         function getAttr2(){
            var p = marker2.getPosition();       //获取marker的位置
            alert("已有ATM的百度坐标:" + p.lng + "," + p.lat);   
        }
        })
        $.each(b,function(n,value){
         var marker1 = new BMap.Marker(new BMap.Point(value.ln,value.la));  // 创建
         map.addOverlay(marker1);
         marker1.addEventListener("click",getAttr1);
         function getAttr1(){
            var p = marker1.getPosition();       //获取marker的位置
            alert("备选ATM的百度坐标:" + p.lng + "," + p.lat);   
        }
        })
    </script>
    index.html
    
    

    4  后记

    1 需要学习js语法知识
    
    2 善用官方demo

    参考资料

    1 百度地图JavaScript API    http://lbsyun.baidu.com/index.php?title=jspopular

    2 https://files-cdn.cnblogs.com/files/hdu-2010/%E6%B5%B7%E9%87%8F%E7%82%B9-demo.zip

  • 相关阅读:
    需求获取常见的方法是进行客户访谈,结合你的实践谈谈会遇到什么问题,你是怎么解决的?
    软件工程导论 习题五
    软件工程导论 习题四
    软件工程导论 习题三
    软件工程导论 习题二(1.2.3.5)
    软件工程导论 习题一
    面向对象分析方法和面向过程分析方法的区别
    几大开发模型区别与联系
    项目总结
    关于需求
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/5535325.html
Copyright © 2020-2023  润新知