• Bing必应地图中国API


    Bing必应地图中国API - 在地图上画圆  

    2011-05-24 14:49:37|  分类: Bing&Google|字号 订阅

     
     

    《变形金刚2》上映4日国内票房过亿,基本上我只能等盗版流出下载观看了。很多时候愿望很小,却不容易实现。比如我一直想写一篇博客,介绍一下在地图上画圆。这个想法来源于不止一个客户问起怎么在必应地图上实现区域搜索,比如搜索一个圆、长方形、多边形内的兴趣点。

    于是衍生出来一个问题,微软必应地图为什么不提供更丰富的地图功能,比如测量两点之间的距离,画各种形状等等;

    再衍生一个问题,不止一个朋友抱怨微软spcase越来越难用了,比QQ空间做的还差,为什么不这么做,为什么不那么做;

    其实,如果微软什么都做了,什么都做得很好的话,就没有别的公司机会了。我常常和别人讲,在美国微软挣10块钱,要分给合作伙伴7块钱,因为我们知道很多事情应该交给合作伙伴去完成。

    回到刚才的问题,微软必应地图是没有提供画圆的工具,但是我们提供了画圆的方法,或者画圆方法的方法。但是我们不一定需要在界面上给出这个功能,因为有人需要有人不需要。所以有需要的用户可以自己去实现,或者找合作伙伴去实现。

    在地图上画圆更是一个数学算法问题,所以我就直接给出代码,大家直接拷贝下面的代码就行了。

    function drawCircle(origin,radius)
    {  
          var earthRadius = 6371;
          
          //latitude in radians
            var lat = (origin.Latitude*Math.PI)/180; 
            
            //longitude in radians
            var lon = (origin.Longitude*Math.PI)/180; 
            
            //angular distance covered on earth's surface
            var d = parseFloat(radius)/earthRadius;  
            
            var points = new Array();
            for (i = 0; i <= 360; i++) 
            { 
                var point = new VELatLong(0,0)            
                var bearing = i * Math.PI / 180; //rad
                point.Latitude = Math.asin(Math.sin(lat)*Math.cos(d) + Math.cos(lat)*Math.sin(d)*Math.cos(bearing));
                point.Longitude = ((lon + Math.atan2(Math.sin(bearing)*Math.sin(d)*Math.cos(lat), Math.cos(d)-Math.sin(lat)*Math.sin(point.Latitude))) * 180) / Math.PI;
                point.Latitude = (point.Latitude * 180) / Math.PI;
                points.push(point);
            }
            
           var circle = new VEShape(VEShapeType.Polyline, points); 
           circle.HideIcon();
           searchShapeLayer.AddShape(circle);
           
           map.SetMapView(points);
        }

    上面的算法只是在地图上简单的画一个圆,位置和大小都固定的。有朋友会继续问,如何在地图用鼠标画圆,圆的大小随着鼠标移动而变化。这个问题需要研究一下鼠标事件的响应函数。同学们可以把它当做课后作业吧,呵呵。

    进一步探讨如何搜索一个圆形区域内的兴趣点,其实就是判断兴趣点与圆心的距离是否小于半径。所以额外给出地球上两点之间距离的计算方法:

    function distance(latlong,latlong2)
        {
          var lat1 = latlong.Latitude;
          var lon1 = latlong.Longitude;
          var lat2 = latlong2.Latitude;
          var lon2 = latlong2.Longitude;
          var earthRadius = 6371;
          
          var factor = Math.PI/180;
          var dLat = (lat2-lat1)*factor;
          var dLon = (lon2-lon1)*factor; 
          var a = Math.sin(dLat/2) * Math.sin(dLat/2)+Math.cos(lat1*factor)*Math.cos(lat2*factor)*Math.sin(dLon/2) * Math.sin(dLon/2); 
          var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
          var d = earthRadius * c;
          
          return d;
        }


    引用:http://www.htchen.com/post/11.html
  • 相关阅读:
    3. 算法分析
    4. union-find算法
    1.基础编程模型和数据抽象
    2. 背包,队列和栈
    .NET Core 单元测试
    ASP.NET Core Web API
    ASP.NET Core MVC 之区域(Area)
    ASP.NET Core MVC 之依赖注入 Controller
    ASP.NET Core MVC 之依赖注入 View
    微服务架构学习与思考(04):微服务技术体系
  • 原文地址:https://www.cnblogs.com/meimao5211/p/3278547.html
Copyright © 2020-2023  润新知