私の要件に従って、私は下の画像に示されているグーグルマップ上にポリゴンを描いています。(マップv2を使用)
次に、ユーザーがその特定のポリゴンを入力したときにアラートを表示する必要があります。
現在の場所がポリゴン内にあるかどうかを識別する方法。 (バッテリーを消耗せずに最適化された方法が必要)
前もって感謝します。
ポリゴン内のポイントを識別するレイキャスティングアルゴリズムを試してみました。これは完璧に機能します。
Ray-Castingの論文については、 http://en.wikipedia.org/wiki/Point_in_polygon を参照してください。
private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) {
int intersectCount = 0;
for (int j = 0; j < vertices.size() - 1; j++) {
if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) {
intersectCount++;
}
}
return ((intersectCount % 2) == 1); // odd = inside, even = outside;
}
private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {
double aY = vertA.latitude;
double bY = vertB.latitude;
double aX = vertA.longitude;
double bX = vertB.longitude;
double pY = tap.latitude;
double pX = tap.longitude;
if ((aY > pY && bY > pY) || (aY < pY && bY < pY)
|| (aX < pX && bX < pX)) {
return false; // a and b can't both be above or below pt.y, and a or
// b must be east of pt.x
}
double m = (aY - bY) / (aX - bX); // Rise over run
double bee = (-aX) * m + aY; // y = mx + b
double x = (pY - bee) / m; // algebra is neat!
return x > pX;
}
レイキャスティングの方法は信頼できないと思いましたが、結局グーグルマップのPolyUtil
を使用しました。
依存関係が必要ですcompile 'com.google.maps.Android:android-maps-utils:0.5'
そして、メソッドは次のようになります
PolyUtil.containsLocation(userLocation, polyPointsList, false);
編集
これは、ソースコードにあるこのメソッドの説明です
指定されたポイントが指定されたポリゴンの内側にあるかどうかを計算します。最後のポイントが最初のポイントと等しいかどうかに関係なく、ポリゴンは常に閉じていると見なされます。内部は南極点を含まないと定義されています-南極点は常に外側にあります。ポリゴンは、測地線が真の場合は大円セグメントで形成され、そうでない場合は等角航路(等角航路)セグメントで形成されます。
このリンクを参照してください
そのRayCastingアルゴリズム、それはあなたを助けるかもしれません:)
アルゴリズムについての簡単な説明:
水平線はポイントから右に描画されます。奇数回でポリゴンの側面と交差する場合、ポイントはポリゴンの内側にあり、それ以外の場合は外側にあります:)
これらのウィキリンクはあなたに完全なアイデアを与えるでしょう: