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

最新文章

  1. 我为什么要写LeetCode的博客?
  2. 不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)
  3. BT协议分析(1)&mdash;1.0协议
  4. vim 显示颜色脚本
  5. at org.apache.catalina.loader.WebappClassLoader.loadClass问题处理
  6. 【转载】Velocity模板引擎的介绍和基本的模板语言语法使用
  7. setTimeout() 与 setInterval()
  8. POJ 3693 (后缀数组) Maximum repetition substring
  9. Windows下父进程监视子进程状态
  10. NoSQL数据库技术特性解析之文档数据库
  11. Jquery中常见问题
  12. makefile 单独编译一个文件
  13. Redux基础
  14. [google面试CTCI] 1-7.将矩阵中特定行、列置0
  15. 对比AutoResetEvent和ManualResetEvent
  16. BestCoder Round #86 A B C
  17. erlang erl文件编译的三种脚本
  18. maven打包如何跳过测试
  19. VMware Workstation14 安装Ubuntu18.04
  20. Grunt搭建自动化web前端开发环境--完整流程

热门文章

  1. BZOJ 2039 人员雇佣 二元关系 最小割
  2. CSU 2018年12月月赛 D 2216 : Words Transformation
  3. Python之禅 吾心笃定
  4. python3.x Day4 内置方法,装饰器,生成器,迭代器
  5. linux 负载各项查看命令
  6. ubuntu 安装python 编程环境
  7. PHP 处理接口保证数据安全性
  8. allegro中出光绘文件遇到问题的解决办法
  9. JAVA IO中read()方法的返回值
  10. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】