您好!即日起至2025年7月20日,高德地图车机版官网论坛的全部板块功能将陆续下线。2025年7月20日后论坛将无法访问,请及时备份个人数据,您可以在公示期内(2025年6月20日-7月19日)在论坛页面点击右键,选择“存储为”功能,将页面保存(HTML文件格式),以便在本地保留相关数据。此外, 点击此处 可下载最新版本的高德地图车机版软件,如遇问题您可通过车机端内的反馈入口提交问题或建议,感谢您一直以来的理解与支持。

查看: 1486|回复: 3
打印 上一主题 下一主题

[应用案例] 判断线/面是否包含点的扩展方法

[复制链接]
最佳答案
0 

9

主题

111

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
跳转到指定楼层
楼主
发表于 2014-10-9 15:52:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhoumh1988 于 2015-3-5 14:06 编辑
  1. (function(h){
  2.     /**
  3.      * 多边形包含点
  4.      * @param {} p 判断的点
  5.      * @return {Boolean} true 包含,false不包含
  6.      */
  7.     h.Polygon.prototype.Contains = function(p) {
  8.         var nCross = 0;
  9.         var path = this.getPath();
  10.         var nCount = path.length;
  11.         for (var i = 0; i < nCount; i++) {
  12.             var p1 = path[i];
  13.             var p2 = path[(i + 1) % nCount];
  14.             if (p1.lat == p2.lat) continue;
  15.             if (p.lat < Math.min(p1.lat, p2.lat)) continue;
  16.             if (p.lat >= Math.max(p1.lat, p2.lat)) continue;
  17.             var x = parseFloat(p.lat - p1.lat) * parseFloat(p2.lng - p1.lng) / parseFloat(p2.lat - p1.lat) + p1.lng;
  18.             if (x > p.lng) nCross++;
  19.         }
  20.         return (nCross % 2 == 1);
  21.     };
  22.     /**
  23.      * 圆包含点
  24.      * @param {} p 判断的点
  25.      * @return {Boolean} true 包含,false不包含
  26.      */
  27.     h.Circle.prototype.Contains = function(p) {
  28.         var c = this.getCenter();
  29.         var radius = this.getRadius();
  30.         var distance = p.distance(c);
  31.         // var distance = Math.sqrt((p.lng - c.lng) * (p.lng - c.lng) + (p.lat - c.lat) * (p.lat - c.lat));
  32.         return distance <= radius;
  33.     };
  34.     /**
  35.      * 线包含点
  36.      * @param {} p 判断的点
  37.      * @return {Boolean} true 包含,false不包含
  38.      */
  39.     h.Polyline.prototype.Contains = function(p) {
  40.         var path = this.getPath();
  41.         var length = path.length;
  42.         for (var i = 0; i < length - 1; i++) {
  43.             var p1 = path[i], p2 = path[(i+1) % length];
  44.             if(p2.lng == p1.lng) {
  45.                 if(p.lng != p1.lng) continue;
  46.                 else if(p.lat < p.lat < Math.max(p1.lat, p2.lat) && p.lat > p.lat < Math.min(p1.lat, p2.lat)) {
  47.                     return true;
  48.                 } else {
  49.                     continue;
  50.                 }
  51.             } else {
  52.                 var k = (p2.lat - p1.lat) / (p2.lng - p1.lng),
  53.                 b = p2.lat - k * p2.lng;
  54.                 if ((p.lat - k * p.lng) == b) return true;
  55.             }
  56.         }
  57.         return false;
  58.     };
  59. })(AMap);
复制代码
此扩展方法是本人自己写的,仅供参考,如有BUG或者更好的方法,请回复一起探讨。
回复

使用道具 举报

最佳答案
5 

22

主题

760

帖子

1877

积分

超级版主

Rank: 8Rank: 8

积分
1877
QQ
沙发
发表于 2014-10-10 11:42:40 | 只看该作者
感谢zhoumh1988无私分享,不造送出的礼物喜欢吗?
回复 支持 反对

使用道具 举报

最佳答案
0 

9

主题

111

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
板凳
 楼主| 发表于 2014-10-10 13:31:21 | 只看该作者
emilyvivi5 发表于 2014-10-10 11:42
感谢zhoumh1988无私分享,不造送出的礼物喜欢吗?

号大了,我送同事了~
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

4

帖子

11

积分

新手上路

Rank: 1

积分
11
地板
发表于 2015-7-22 09:46:13 | 只看该作者
太感谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|高德开发者论坛

Copyright ©2014 高德开发者论坛.All Rights Reserved |京ICP证070711号

意见反馈 常见问题 服务条款 联系我们
快速回复 返回顶部 返回列表