自2018年10月18日起,高德开发者论坛除车机板块外,其他板块将停止发帖与维护,如您有使用问题请 提交工单 联系我们,感谢您的理解。

查看: 531|回复: 5
打印 上一主题 下一主题

【JS API】判断一个点是否在一个多边形内

[复制链接]
最佳答案
0 

1

主题

3

帖子

21

积分

新手上路

Rank: 1

积分
21
跳转到指定楼层
楼主
发表于 2014-10-11 14:45:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//判断点是否在多边形外
var isPointInPolygon = function(o, l) {
    if (! (o instanceof AMap.LngLat) || !(l instanceof AMap.Polygon)) {
        return false;
    }
    var k = l.getBounds();
    if (!k.contains(o)) {
        return false;
    }
    var t = l.getPath();
    var h = t.length;
    var n = true;
    var j = 0;
    var g = 2e-10;
    var s, q;
    var e = o;
    s = t[0];
    for (var f = 1; f <= h; ++f) {
        if (e.equals(s)) {
            return n;
        }
        q = t[f % h];
        if (e.lat < Math.min(s.lat, q.lat) || e.lat > Math.max(s.lat, q.lat)) {
            s = q;
            continue;
        }
        if (e.lat > Math.min(s.lat, q.lat) && e.lat < Math.max(s.lat, q.lat)) {
            if (e.lng <= Math.max(s.lng, q.lng)) {
                if (s.lat == q.lat && e.lng >= Math.min(s.lng, q.lng)) {
                    return n;
                }
                if (s.lng == q.lng) {
                    if (s.lng == e.lng) {
                        return n;
                    } else {++j
                    }
                } else {
                    var r = (e.lat - s.lat) * (q.lng - s.lng) / (q.lat - s.lat) + s.lng;
                    if (Math.abs(e.lng - r) < g) {
                        return n;
                    }
                    if (e.lng < r) {++j;
                    }
                }
            }
        } else {
            if (e.lat == q.lat && e.lng <= q.lng) {
                var m = t[(f + 1) % h];
                if (e.lat >= Math.min(s.lat, m.lat) && e.lat <= Math.max(s.lat, m.lat)) {++j;
                } else {
                    j += 2;
                }
            }
        }
        s = q;
    }
    if (j % 2 == 0) {
        return false;
    } else {
        return true;
    }
};


如有BUG或者更好的方法,请回复一起探讨。
回复

使用道具 举报

最佳答案
0 

9

主题

111

帖子

349

积分

中级会员

Rank: 3Rank: 3

积分
349
推荐
发表于 2014-12-9 18:17:25 | 只看该作者
我也做了类似的分享,采用的也是射线原理,这个原理比较普遍~而且是从几何学中得来的~还是不错的方法。
但是我觉得高德应该吸收我们提供的比较好的idea,譬如说多边线包含点的计算。目前高德只是通过bounds去判断~这种判断方式有点太笼统,并不能满足开发人员的需求,建议高德改进一下。
http://lbsbbs.amap.com/forum.php ... ;tid=500&extra=
回复 支持 1 反对 0

使用道具 举报

最佳答案
5 

22

主题

760

帖子

1877

积分

超级版主

Rank: 8Rank: 8

积分
1877
QQ
沙发
发表于 2014-10-11 15:58:37 | 只看该作者
哈~赞~~大家多多分享,有小礼品相送哦~~
回复 支持 反对

使用道具 举报

最佳答案
0 

2

主题

7

帖子

46

积分

新手上路

Rank: 1

积分
46
板凳
发表于 2014-11-28 15:13:51 | 只看该作者
楼主用的是射线法的思想吧?我知道百度有提供这个方法的,高德要自己写吗?
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

6

帖子

41

积分

新手上路

Rank: 1

积分
41
地板
发表于 2014-12-9 14:47:40 | 只看该作者
这种能判断凹多边形吗
回复 支持 反对

使用道具 举报

最佳答案
0 

10

主题

24

帖子

86

积分

注册会员

Rank: 2

积分
86
6#
发表于 2015-1-21 18:32:21 | 只看该作者
请问一下,我是新手,这个函数传的参数,分别是指点和多边形对象吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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