Android Geofencing(多边形)

如何从多个地理位置创build多边形地理栅栏(长,纬度值)。 另外如何跟踪用户正在进入这个地理围栏区域或在Android上从这个区域退出。

Solutions Collecting From Web of "Android Geofencing(多边形)"

地理围栏只是形成多边形的经纬度点arrays。 一旦你有一个纬度/长点的列表,你可以使用点内多边形检查来查看一个位置是否在多边形内。

这是我在自己的项目中使用的代码,用于对非常大的凹多边形(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); } } 

在程序stream程方面,你需要一个后台服务来进行位置更新,然后对你的纬度/经度的多边形数据进行检查,看看位置是否在里面。