首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android地理围栏(多边形)

Android地理围栏(多边形)
EN

Stack Overflow用户
提问于 2013-08-28 19:12:47
回答 2查看 11.5K关注 0票数 11

如何从多个地理位置(经度值、经度值)创建多边形Geofence。另外,如何跟踪用户在android上进入或退出此区域的地理围栏区域。

EN

回答 2

Stack Overflow用户

发布于 2013-08-28 19:40:04

geofence只是一组形成多边形的经度/经度点。有了经度/经度点列表后,可以使用多边形内部点检查来查看某个位置是否在多边形内。

这是我在自己的项目中使用的代码,用于对非常大的凹多边形(20K+顶点)执行多边形中的点检查:

代码语言:javascript
复制
public class PolygonTest
{
    class LatLng
    {
        double Latitude;
        double Longitude;

        LatLng(double lat, double lon)
        {
            Latitude = lat;
            Longitude = lon;
        }
    }

    bool PointIsInRegion(double x, double y, LatLng[] thePath)
    {
        int crossings = 0;

        LatLng point = new LatLng (x, y);
        int count = thePath.length;
        // for each edge
        for (var i=0; i < count; i++) 
        {
            var a = thePath [i];
            var j = i + 1;
            if (j >= count) 
            {
                j = 0;
            }
            var b = thePath [j];
            if (RayCrossesSegment(point, a, b)) 
            {
                crossings++;
            }
        }
        // odd number of crossings?
        return (crossings % 2 == 1);
    }

    bool RayCrossesSegment(LatLng point, LatLng a, LatLng b)
    {
        var px = point.Longitude;
        var py = point.Latitude;
        var ax = a.Longitude;
        var ay = a.Latitude;
        var bx = b.Longitude;
        var by = b.Latitude;
        if (ay > by)
        {
            ax = b.Longitude;
            ay = b.Latitude;
            bx = a.Longitude;
            by = a.Latitude;
        }
            // alter longitude to cater for 180 degree crossings
        if (px < 0) { px += 360; };
        if (ax < 0) { ax += 360; };
        if (bx < 0) { bx += 360; };

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : float.MAX_VALUE;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : float.MAX_VALUE;
        return (blue >= red);
    }
}

在程序流方面,您将需要一个后台服务来执行位置更新,然后对您的经纬度多边形数据执行此检查,以查看该位置是否在内部。

票数 19
EN

Stack Overflow用户

发布于 2019-08-10 03:00:23

如果人们仍在寻找多边形地理栅栏检查,您可以使用GoogleMaps.Util.PolyUtil containsLocation方法完成此检查。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18486284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档