由于目前的一个项目涉及离线地图,经过查找资料论证,最终还是决定采用百度地图。在项目过程中,遇到一个比较实际的问题:怎么判断地图上的一个点(经纬坐标下)在一个多边形区域内?

由于我采用的是百度地图JavaScript API v2.0接口,同时由于要做的是离线地图,百度地图离线版有一些功能函数是不能用的。针对上述问题,在网上查资料发现,百度的BMapLib.GeoUtils里面有一个函数isPointInPolygon可以用于解决这个问题,但是很遗憾,我用的接口函数版本并不能用这个函数,所以我研究了一下,经过修改写了一个满足条件的函数。下面是代码部分:

function isInsidePolygon(point, polygon)
{  if(!(point instanceof BMap.Point) || !(polygon instanceof BMap.Polygon)){return false;}var polygonBounds = polygon.getBounds();if(!polygonBounds.containsPoint(point)){return false;}var pts = polygon.getPath();var N = pts.length;var boundOrVertex = true; var intersectCount = 0;var precision = 2e-10; var p1, p2;//neighbour bound verticesvar p = point; p1 = pts[0];//left vertex        for(var i = 1; i <= N; ++i)  //check all rays  {            if(p.equals(p1)){return boundOrVertex;  //p is an vertex}            p2 = pts[i % N];//right vertex            if(p.lat < Math.min(p1.lat, p2.lat) || p.lat > Math.max(p1.lat, p2.lat)) //ray is outside of our interests {               p1 = p2; continue;//next ray left point}if(p.lat > Math.min(p1.lat, p2.lat) && p.lat < Math.max(p1.lat, p2.lat)){if(p.lng <= Math.max(p1.lng, p2.lng)){                  if(p1.lat == p2.lat && p.lng >= Math.min(p1.lng, p2.lng)){return boundOrVertex;}if(p1.lng == p2.lng){                      if(p1.lng == p.lng){return boundOrVertex;}else{++intersectCount;} }else{                      var xinters = (p.lat - p1.lat) * (p2.lng - p1.lng) / (p2.lat - p1.lat) + p1.lng;                 if(Math.abs(p.lng - xinters) < precision){return boundOrVertex;}if(p.lng < xinters){++intersectCount;} }}}else{             if(p.lat == p2.lat && p.lng <= p2.lng){            var p3 = pts[(i+1) % N]; //next vertex                    if(p.lat >= Math.min(p1.lat, p3.lat) && p.lat <= Math.max(p1.lat, p3.lat)){++intersectCount;}else{intersectCount += 2;}}}            p1 = p2;//next ray left point}if(intersectCount % 2 == 0){//偶数在多边形外return false;} else { //奇数在多边形内return true;}
}  

参考资料:

http://api.map.baidu.com/library/GeoUtils/1.2/docs/symbols/BMapLib.GeoUtils.html(百度开发平台)

http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html(百度地图JavaScript API v2.0类参考)

百度地图——判断一个点是否在一个区域内?相关推荐

  1. MFC判断一个点是否在一个区域内

    1.判断一点是否在矩形区域内的方法: CRect rc (point_1,point_2);//构造矩形区域 调用CRect::PtInRect     BOOL flag = rc.PtInRect ...

  2. Java 判断一个点是否在一个三角形内

    题目描述:   如何判断一个点是否在一个三角形内. 测试样例: 自定义的POINT类: class POINT{int x;int y;public POINT(int x,int y){this.x ...

  3. Algorithm: 如何判断一个点是否在一个三角形内

    昨日因为机缘巧合,做了一道阿里的实习生编程题.题目很有趣,其中涉及到了如何判断一个点是否在一个三角形内. 其中,判断这个问题最简单的方法是面积法.(图片来源:http://www.cnblogs.co ...

  4. 能否构成三角形的条件代码_Java 如何判断一个点是否在一个三角形内

    题目描述: 如何判断一个点是否在一个三角形内. 测试样例: 自定义的POINT类: class POINT{ int x; int y; public POINT(int x,int y){ this ...

  5. 百度地图——判断用户是否在配送范围内解决方案

    需求: 在pc端设置商家的配送范围,用户在下单时,根据用户设置的配送地点判断是否在可配送范围内,并给用户相应的提示. 实现: 1.用百度地图在PC端设置配送范围,可拖拽选择 2.根据用户设置的配送地址 ...

  6. 如何判断一个点是否在一个多边形内?

    提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的 ...

  7. 判断一个经纬度是不是在一个范围内

    /// <summary>/// 判断经纬度是否在范围类/// </summary>/// <param name="longitudeCur"> ...

  8. 关于java中判断一个点是否在一个长方形内和一个长方形是否包含另一个长方形或者两个相重叠的问题。

    案例代码 import java.util.Scanner; public class rhh {     public static void main(String[] args){        ...

  9. Java 判断一个点是否在一个多边形内

    工具类 提供:监测点的X轴.Y轴.多边形的多个坐标.如果存在多边形里面返回true,反之返回false import java.awt.geom.Point2D; import java.awt.ge ...

最新文章

  1. 极客大赛助力BCH应用开发
  2. Grafana中整个Dashboard报错问题解决
  3. computed get set 传参_ES6 的 Set 与 Map深入理解
  4. vb mysql ado_VB中的ADO数据对象编程详解
  5. mysql sample函数_Oracle SAMPLE 语法应用
  6. 前端学习(902):this指向问题
  7. java mvc实例_Java Web实现的基本MVC实例分析
  8. 一道笔试题:贿赂选民
  9. Qt 学习之路 2(2):Qt 简介 笔记
  10. lamp mysql登录_LAMP 3.2 mysql登陆
  11. python3基础教程[第一版] 中
  12. C语言编写猜数字小游戏
  13. java获取网页表单数据,转发与重定向,使用application统计访问次数
  14. 吾爱破解专用虚拟机系统不能安装VMwaretools问题!
  15. 电动汽车动力系统整车仿真,具有双向DCDC变换器实现能量反馈,可带异步电机
  16. CSS基础之 文字和文本元素
  17. NotifyIcon的属性、事件、方法
  18. 如何制作绿色透明的立体字效果
  19. ds18b20温度转换指令_DS18B20传感器温度转换指令( )。
  20. 【OpenCV学习】 《OpenCV3编程入门》--毛星云 01 邂逅OpenCV(OpenCV基本概念与基本架构) ROS系统上的运用(python实现)

热门文章

  1. 【时间管理】从零开始GTD——GTD原则
  2. squid反向代理(实现缓存)加速web
  3. 如何在windows7和windows8双系统中卸载windows8
  4. VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti
  5. php 屏蔽mysql错误提示_PHP.ini中配置屏蔽错误信息显示和保存错误日志
  6. InsecureRequestWarning: Unverified HTTPS request is being made to host(requests证书警告)
  7. 前端面试系列-ES6
  8. 一文了解c/c++、java、JavaScript、php、Python的用途
  9. Verilog 编写规范
  10. 史上最具体Android集成QQ,微信,微博分享(不用第三方)持续更新中