gpt4 book ai didi

Android 地理围栏(多边形)

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:43 39 4
gpt4 key购买 nike

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

最佳答案

地理围栏只是一组形成多边形的纬度/经度点。获得纬度/经度点列表后,您可以使用多边形内点检查来查看某个位置是否在多边形内。

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

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

关于Android 地理围栏(多边形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18486284/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com