弹性搜索GeoPolygonFilter算法

时间:2016-01-31 09:56:39

标签: algorithm elasticsearch

通过弹性搜索GeoPolygonFilter源代码,我遇到了pointInPolygon方法。我无法理解为什么算法有效,或者它是如何工作的。这如何确定给定(lat,lon)对位于由点定义的多边形内?

private static boolean pointInPolygon(Point[] points, double lat, double lon) {
    int i;
    int j = points.length - 1;
    boolean inPoly = false;

    for (i = 0; i < points.length; i++) {
        if (points[i].lon < lon && points[j].lon >= lon
                || points[j].lon < lon && points[i].lon >= lon) {
            if (points[i].lat + (lon - points[i].lon) /
                    (points[j].lon - points[i].lon) * (points[j].lat - points[i].lat) < lat) {
                inPoly = !inPoly;
            }
        }
        j = i;
    }
    return inPoly;
}

1 个答案:

答案 0 :(得分:0)

pointInPolygon()方法实现crossing number algorithm。如果您对此功能的完整初步讨论感兴趣,可以找到它here

基本思想(在上面的第一个链接和here中说明)是检查从测试点开始的线在每个方向上越过多边形边界的次数。如果该点位于多边形内部,则会得到奇数个十字形,如果该点位于多边形之外,则会得到偶数个十字形。