百度地图坐标转换的异步回调事件

在后台拿到数据后,需要将坐标转化为百度坐标进行标注打点,同时进行划线。

代码如下:

1.请求service拿到坐标数据

        //设备定位
        $scope.loadPosition = function () {
            deviceService.Position($scope.coudition, function success(result, status) {
                line=[];
                if (status) {
                    if (result.data.length > 0) {
                        line.push(result.data[result.data.length-1]);
                        $scope.loadMap();
                    } else {
                        var myCity = new BMap.LocalCity();
                        myCity.get(setCenter);
                    }
                }
            });
        };
        $scope.loadPosition();

解析:$scope.loadMap()方法将坐标数据进行标注。代码如下

$scope.loadMap = function () {
            var time = $translate.instant("devicePosition.location-time");
            var device = $translate.instant("devicePosition.device");
            var convertor = new BMap.Convertor();
            var pointArr = [];
            for (var i = 0; i < line.length; i++) {
                var dateTime = $filter(‘date‘)(line[i].locationTime, ‘yyyy-MM-dd hh:mm:ss‘);
                var Sn = line[i].deviceSn;
                var piontTrr = [];
                linePoint[i] = new BMap.Point(line[i].lng, line[i].lat);
                piontTrr.push(linePoint[i]);
                convertor.translate(piontTrr, 1, 5, function (data) {
                    if (data.status === 0) {
                        pointArr.push(data.points[0]);
                        var content = ‘<p style="width:100%;margin:0;line-height:20px;">‘ + device + ‘SN:‘ + Sn + ‘<br/>‘ + time + ‘:‘ + dateTime + ‘</p>‘;
                        addMarker(data.points[0], content);  //标注坐标
                    }
                });
            }          console.log(pointArr);
          //轨迹生成方法
                polyline(pointArr);
                //让所有点在视野范围内
                map.setViewport(pointArr);
 };

解析:控制台pointArr打印为空,地图显示了标注,但是未画轨迹(折线)。

解决方法:采用定时器,将该异步问题解决

 //解决坐标转化异步问题,采用定时器延迟执行方法
            setTimeout(function () {
                //doSomething
                //轨迹生成方法
                polyline(pointArr);
                //让所有点在视野范围内
                map.setViewport(pointArr);
            },300);

附带完整代码:

    //设备定位
        $scope.loadPosition = function () {
            deviceService.Position($scope.coudition, function success(result, status) {
                line=[];
                if (status) {
                    if (result.data.length > 0) {
                        line.push(result.data[result.data.length-1]);
                        $scope.loadMap();
                    } else {
                        var myCity = new BMap.LocalCity();
                        myCity.get(setCenter);
                    }
                }
            });
        };
    $scope.loadMap = function () {
            var time = $translate.instant("devicePosition.location-time");
            var device = $translate.instant("devicePosition.device");
            var convertor = new BMap.Convertor();
            var pointArr = [];
            for (var i = 0; i < line.length; i++) {
                var dateTime = $filter(‘date‘)(line[i].locationTime, ‘yyyy-MM-dd hh:mm:ss‘);
                var Sn = line[i].deviceSn;
                var piontTrr = [];
                linePoint[i] = new BMap.Point(line[i].lng, line[i].lat);
                piontTrr.push(linePoint[i]);
                convertor.translate(piontTrr, 1, 5, function (data) {
                    if (data.status === 0) {
                        pointArr.push(data.points[0]);
                        var content = ‘<p style="width:100%;margin:0;line-height:20px;">‘ + device + ‘SN:‘ + Sn + ‘<br/>‘ + time + ‘:‘ + dateTime + ‘</p>‘;
                        addMarker(data.points[0], content);
                    }
                });
            }

            //解决坐标转化异步问题,采用定时器延迟执行方法
            setTimeout(function () {
                //doSomething
                //轨迹生成方法
                polyline(pointArr);
                //让所有点在视野范围内
                map.setViewport(pointArr);
            },300);
        };

        function polyline(linePoint) {
            var polyline = new BMap.Polyline(linePoint, {strokeColor: "blue", strokeWeight: 2, strokeOpacity: 0.5});   //创建折线
            map.addOverlay(polyline);   //增加折线
        }

        //增加标注
        function addMarker(point, content) {
            var marker = new BMap.Marker(point);
            map.addOverlay(marker);
            addClickHandler(content, marker);//给标记点注册事件。
        }

        function addClickHandler(content, marker) {
            marker.addEventListener("click", function (e) {
                openInfo(content, e);
            });
        }

        function openInfo(content, e) {
            var p = e.target;
            var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat);
            var infoWindow = new BMap.InfoWindow(content, opts);  // 创建信息窗口对象
            map.openInfoWindow(infoWindow, point); //开启信息窗口
        }
时间: 2024-10-04 22:03:25

百度地图坐标转换的异步回调事件的相关文章

java腾讯地图与百度地图坐标转换

/** * 坐标转换,腾讯地图转换成百度地图坐标 * @param lat 腾讯纬度 * @param lon 腾讯经度 * @return 返回结果:经度,纬度 */ public String map_tx2bd(double lat, double lon){ double bd_lat; double bd_lon; double x_pi=3.14159265358979324; double x = lon, y = lat; double z = Math.sqrt(x * x +

百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和DOM编程里的事件模型一样,百度地图API也提供了类似的事件机制.本文介绍了事件监听的添加和移除方法,this指针和事件参数的使用以及绑定事件监听函数中涉及的闭包问题,最后分享了一个用来增强地图API事件机制的开源项目. 事件添加和移除 我们最简单的事件开始,下面的代码示例给map对象添加了click事件的监听

百度地图坐标转换服务封装(优化批量并发异步访问)

本人接触网页地图以来已有5年之窗,与百度地图打交道少说也有3年以上了,百度坐标转换从最开始的只支持单组坐标转换到现在的批量转换(限制每次100组),而且是无规律的算法纠偏,根本不好复制这种算法到本地进行转换,每次只能乖乖的ajax get到百度服务接口返回结果. 这种做法对于单组坐标的转换体验上影响不大,但是当我们需要纠偏的坐标量很多的时候,按正常的写法ajax异步请求,而且每次最多只能传入100组坐标,只能分批来调,而且是异步处理,还要定义一堆全局变量记住状态值,代码量多且复杂,项目大就难以管

百度地图聚合点加点击事件

在做项目的时候需要用到聚合点  看完聚合点的时候有需要详情 下面是效果 代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user

百度地图坐标转换

在百度地图开发过程中,有可能会遇到一些关于坐标转换的问题,下面就把自己在项目过程中遇到的一些转换方法以及网上搜集到的一些方法写下来,以备不时之需 1.国测局坐标转百度坐标 /** * 国测局转换百度经纬度 * @param point * @return */ public static LatLng gcjTobaidu(LatLng point) { // double x = gg_lon, y = gg_lat; double x = point.longitude, y = point

关于百度地图周边雷达的回调函数会重复调用问题的解决方案

//构造请求参数,其中centerPt是自己的位置坐标 RadarNearbySearchOption option = newRadarNearbySearchOption().centerPt(pt).pageNum(pageIndex).radius(2000); //发起查询请求 mManager.nearbyInfoRequest(option); @Override publicvoidonGetNearbyInfoList(RadarNearbyResult result, Rad

百度地图API之覆盖物和事件

前言 之前已经介绍了如何添加地图上一些控件,添加一些控件后就会实现一些常用的功能.具体请参考http://blog.csdn.net/u010989191/article/details/51326397.下面主要介绍如何添加覆盖物及给地图.地标等添加响应事件. 覆盖物相关API介绍 地图覆盖物概述 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物.如标注.矢量图形元素(包括:折线和多边形和圆).信息窗口等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动. 地图API提供了如下

微信小程序--百度地图坐标转换成腾讯地图坐标

最近开发小程序时出现一个问题,后台程序坐标采用的时百度地图的坐标,因为小程序地图时采用的腾讯地图的坐标系,两种坐标有一定的误差,导致位置信息显示不正确.现在需要一个可以转换两种坐标的方法,经过查询发现腾讯地图提供了一个接口用来将多种坐标类型转换成腾讯可用的坐标. 方法如下: reverseGeocoder(options:Object) 本接口提供由坐标到坐标所在位置的文字描述的转换,输入坐标返回地理位置信息和附近poi列表. options参数属性说明: 如图上所示,只需要传递坐标时加上参数c

百度地图坐标转换API和地图API

利用百度地图的服务将经纬度转换为米单位坐标 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) {