zoukankan      html  css  js  c++  java
  • 关于百度地图偏移的问题

    首先看官方是怎么说的

    /*
    4.3 百度坐标为何有偏移?
    国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
    http://developer.baidu.com/map/question.htm
    */

    然后看这位怎么说的

    /*
    下面简单介绍下经纬度坐标偏移问题的解决方法,这个官方说法是因为百度在国家标准的加密算法的基础上又进行了一次加密导致的,解决方案需要询问百度。这里有一个百度hi群的群号:1306508,有问题的可以加群里问,不过一般也会被告知这个需要合作伙伴才可以告诉,很郁闷。
    
      我是发邮件给mapapi@baidu.com才获得了解决方法,也是通过一个网址,将待转换的经纬度以url参数的形式传递进去,打开的页面是经过了Base64形式的校正经纬度坐标,实验了一下还挺准确的。之前在互联网上查到过一个网址,不过都说已经被百度停止服务了,不过对比了一下和百度给我的网址,发现并没有停止服务,而是对参数名称进行了改变。。。具体的网址我就不便多说了(其实是掩耳盗铃),跟百度沟通应该就可以获取得到~
    http://www.cnblogs.com/funnydavid/archive/2011/03/02/1969244.html
    */

    最后呀在这里找到答案

    http://malagis.com/baidu-maps-api-map-coordinate-conversion.html

    demo:http://malagis.com/demo/demo-html5-baidumap2.html

    贴上代码备用

    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
    <title>GIS开发利用html5获取经纬度并在百度地图中查看</title>
    <!--加载百度 map api-->
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=8827ee39511568ac0705d037d67b2624"></script>  
    <script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
    </head>
    
    <body>
    <span id="support">将下面的经纬度输入谷歌地图:</span>
    <div id="show">
    纬度:<span id="latitude"></span><br />
    经度:<span id="longitude"></span><br />
    准确度:<span id="accuracy"></span>
    </div>
    <div id="map_canvas" style="500px; height:500px;"></div>
    <script type="text/javascript">
    var doc = document,
        latitude = doc.getElementById('latitude'),
        longitude = doc.getElementById('longitude'),
        accuracy = doc.getElementById('accuracy'),
        support = doc.getElementById('support'),
        showDiv = doc.getElementById('show');
    var map = new BMap.Map("map_canvas");
    function lodeSupport(){
        if(navigator.geolocation){
            support.innerHTML = '将下面的经纬度输入谷歌地图(纬度 经度)查看自己位置:';
            showDiv.style.display = 'block';
            navigator.geolocation.getCurrentPosition(updataPosition);
        }else{
            support.innerHTML = '对不起,浏览器不支持!';
            showDiv.style.display = 'none';
        }
    }
    function updataPosition(position){
        var latitudeP = position.coords.latitude,
            longitudeP = position.coords.longitude,
            accuracyP = position.coords.accuracy;
        latitude.innerHTML = latitudeP;
        longitude.innerHTML = longitudeP;
        accuracy.innerHTML = accuracyP;
        //在百度 map中显示地址
        
        var point = new BMap.Point(longitudeP , latitudeP);  // 创建点坐标  
        map.centerAndZoom(point, 15);// 初始化地图,设置中心点坐标和地图级别  
        var marker = new BMap.Marker(point);    
        map.addOverlay(marker); 
        BMap.Convertor.translate(point,0,translateCallback);     //真实经纬度转成百度坐标
        
    }
    //坐标转换完之后的回调函数
    function translateCallback(point1){
        var marker1 = new BMap.Marker(point1);
        map.addOverlay(marker1);
        var label = new BMap.Label("转换后的百度坐标",{offset:new BMap.Size(20,-10)});
        marker1.setLabel(label); //添加百度label
        map.setCenter(point1);
    }
    
    window.addEventListener('load', lodeSupport , true);
    </script>
    </body>
    </html>

    convertor.js

    //2011-7-25
    (function(){        //闭包
    function load_script(xyUrl, callback){
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = xyUrl;
        //借鉴了jQuery的script跨域方法
        script.onload = script.onreadystatechange = function(){
            if((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")){
                callback && callback();
                // Handle memory leak in IE
                script.onload = script.onreadystatechange = null;
                if ( head && script.parentNode ) {
                    head.removeChild( script );
                }
            }
        };
        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
        head.insertBefore( script, head.firstChild );
    }
    function translate(point,type,callback){
        var callbackName = 'cbk_' + Math.round(Math.random() * 10000);    //随机函数名
        var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from="+ type + "&to=4&x=" + point.lng + "&y=" + point.lat + "&callback=BMap.Convertor." + callbackName;
        //动态创建script标签
        load_script(xyUrl);
        BMap.Convertor[callbackName] = function(xyResult){
            delete BMap.Convertor[callbackName];    //调用完需要删除改函数
            var point = new BMap.Point(xyResult.x, xyResult.y);
            callback && callback(point);
        }
    }
    
    window.BMap = window.BMap || {};
    BMap.Convertor = {};
    BMap.Convertor.translate = translate;
    })();

    嘿嘿嘿      转换的地址是这个

     var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from="+ type + "&to=4&x=" + point.lng + "&y=" + point.lat + "&callback=BMap.Convertor." + callbackName;
  • 相关阅读:
    自调用匿名函数和js的Module模式
    设置一天中不同时段的倒计时,计算时针和分针的夹角
    移动端web开发中对点透的处理,以及理解fastclick如何做到去除300ms延迟
    使用Fiddler改变线上js文件的引用路径
    Linux下常用设置文件和文件夹读写权限操作
    RESTful API
    mysql之load语句
    Django学习之点赞功能
    Django学习之网站图标
    python学习之pyenv
  • 原文地址:https://www.cnblogs.com/0banana0/p/3395108.html
Copyright © 2011-2022 走看看