8
複数の地理的位置(長い緯度値)からポリゴンジオフェンスを作成する方法。また、ユーザーを追跡する方法は、このジオフェンス領域に入るか、この領域からアンドロイドで終了します。Androidジオフェンシング(ポリゴン)
複数の地理的位置(長い緯度値)からポリゴンジオフェンスを作成する方法。また、ユーザーを追跡する方法は、このジオフェンス領域に入るか、この領域からアンドロイドで終了します。Androidジオフェンシング(ポリゴン)
ジオフェンスは単なるポリゴンを構成する緯度/経度点の配列です。緯度/経度のリストを取得したら、点内ポリゴンチェックを使用して、その位置がポリゴン内にあるかどうかを調べることができます。
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);
}
}
プログラムフローの面では、あなたがバックグラウンドをお勧めします:
この
は、私は非常に大きな凹ポリゴンのポイント・イン・ポリゴンのチェックを実行するために私自身のプロジェクトで使用しているコード(20K +頂点)でありますサービスを使用して場所の更新を行い、緯度/経度のポリゴンデータに対してこのチェックを実行して、場所が内部にあるかどうかを確認します。
ジオフェンスは、凹型のハルでもあります。私はgeofence PHPクラスを書いています。 – Bytemain
ああ、私は間違ったものを書いたのですか?それを強調していただきありがとうございます。 – matthewrdev
これは純金のIMHOです。実用上の限界、欠点、または不正確さはありますか?また、このアルゴリズムは名前を持っていますか? – LucasM