当前位置: 首页 > 知识库问答 >
问题:

Android地理Geofence(多边形)

吴康平
2023-03-14

如何从多个地理位置(长,晚值)创建多边形地理围栏。也可以在Android上跟踪用户进入或退出该地理区域的情况。

共有1个答案

范麒
2023-03-14

地理围栏只是形成多边形较晚/较长点的阵列。一旦有了lat/long点的列表,就可以使用point-inside-polygon检查来查看某个位置是否在多边形内。

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

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);
    }
}

在程序流程方面,您将希望后台服务进行位置更新,然后根据您的lat/long polygon数据执行此检查,以查看位置是否在内部。

 类似资料:
  • 根据API文件,只允许圆形土工篱笆: 但我有4个位置,代表矩形的4个角,我想让我的地理围栏是那个矩形。 我想避免建立我的自定义位置监控服务的解决方案扩展的功能监测地理围栏,因为我认为这类服务是CPU和功耗消耗。 谢谢,

  • 有没有人知道如何在Android中创建一个多边形的地理围栏?我知道Android支持圆形(即lat/long+radius)地理围栏,但我需要对它们的边界进行更精确的控制。

  • 我正在google maps android中开发一个监控地理围栏的应用程序,但是在Geofence Builder类中我们只能设置圆形区域,是不是他们的任何类我们都可以使用多边形来监控地理围栏,请帮助我谢谢和问候

  • 目前我们有一个坐标数组,这些坐标将勾勒出一个矩形形状。 到目前为止,它要求一个圆形区域来监视: 这甚至可以创建一个自定义形状区域吗?

  • 我对Android系统中的地理围栏有问题。我按照https://developer.android.com/training/location/geofencing.html的说明建立了地理位置的列表,我连接到LocationClient,它工作了,它返回连接,我可以得到最后一个位置...但当我执行: 在OnAddGeOfencesResult中没有响应。我在logcat中没有看到任何消息。 我使

  • 我尝试在用户到达定义的区域时向其显示推送警报。 所以我在https://developer.android.com/training/location/geofencing编写了我的应用程序 如果我的应用使用遵循用户位置的服务运行,则它可以正常工作。 例如,如果我启动谷歌地图,它也会跟踪我的位置。推送会出现。 但是,如果我关闭我的应用程序,推送将不会显示,因此如果没有应用程序跟踪我的位置,则不会检