まず、現在のユーザーの場所が必要です。 hereの手順に従って、入手することができます。 locationManagerはonLocationChanged(Location loc)メソッドを提供します。このメソッドは、ロケーションが変更されたときに自動的にトリガーされます。ここであなたの "行動"を実装することができます。私がユーザーの場所の指定が引き金を引かなければならないものを理解しているかどうかはわかりません。 特定の「アクション」をトリガーする場合は、onMapClickListenerをマップに設定してonMapClicked(Location loc)メソッドを実装できます。
「事前定義された場所」の構築方法によって、さまざまな可能性があります。
1)これらの場所はポイントですか? - >あなたは真円(または球)距離を計算することができ、その距離に関連して、何かをトリガーするかどうかを決定します。
2)は、2dの長方形の場所ですか? - > LatLngBoundsとそのcontains(LatLng点)メソッドを使用して、ユーザーの場所またはユーザー指定の場所が内部にあるかどうかを判断します。
3)はどのポリゴンですか? hereはそのような場所を作成する方法の良い例です。 contains()メソッドもあります。
4)あなたの場所はあらかじめ定義されていませんか?この場合、あなたが何をしたいのかについてもっと多くの情報が必要です。ウルコメントに基づいて
編集: ので、あなたのアプリがすべき2つのことがあります: 1)は、ユーザが「場所」を入力するか、来ているとき、ちょうどメッセージをポップアップのようないくつかのアクションを()行います「場所」の近く 2)ユーザーにそのような場所を自分で作成する可能性を与えます。
セカンダリは、マップにonMapClickListenerを追加することで実行できます。
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
// latLng is the lcoation, tapped by the user on the map. lets save it
chosen_location = new LatLng(latLng.latitude, latLng.longitude);
}
});
}
これは、単一のポイントを保存し、ユーザーが地図上にタブで表示します。後でポリゴンを追加する場合は、このポイントをポイントのArrayListに追加することができます。しかし、おそらくユーザーは、そのポイントについての詳細情報を追加したいと思うでしょう。 EditTextを利用して、ユーザーに、その点(またはそれ以降のポリゴン)の説明を入力し、最後に「入力した場所を保存する」ボタンをクリックすると、ArrayListに追加できます。また、どこからでも複数の人が作成した場所のリストを更新したり取得したりするために、サーバーバックエンドを使用することもできます。
今のところ、ユーザーはnearToに、このような点に来たか、そのような多角形を入力した場合は上に行くとチェックすることができます:
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// the users location changed (e.g. he moved some meters)
current_location = new LatLng(location.getLatitude(), location.getLongitude());
// somehow get all the places (i guess a server backend is recommended)
// for now, lets say all the places are already obtained into an Arraylist called places:
ArrayList<LatLng> places = new ArrayList<LatLng>;
// Go check for each of the places, if the users current location is near to such a point
for (LatLng place : places) {
if (distance(place,current_location)<100) {
LatLng near_place = place;
// here we are! near_place is near the users current location, lets do some action
Log.d("app","Users location (" + current_location.latitude +","+current_location.longitude+") is near to a place with coordinates "+near_place.latitude+","+near_place.longitude+").");
}
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
});
}
、ここでは緯度経度の間メートルで(球状の)距離を計算する方法でありますオブジェクト:
/**
* method calculate distance between two LatLng points in meter
*/
public float distance(double lat_a, double lng_a, double lat_b, double lng_b) {
double earthRadius = 3958.75;
double latDiff = Math.toRadians(lat_b - lat_a);
double lngDiff = Math.toRadians(lng_b - lng_a);
double a = Math.sin(latDiff/2) * Math.sin(latDiff/2) +
Math.cos(Math.toRadians(lat_a)) * Math.cos(Math.toRadians(lat_b)) *
Math.sin(lngDiff/2) * Math.sin(lngDiff/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double distance = earthRadius * c;
int meterConversion = 1609;
return new Double(distance * meterConversion).floatValue();
}
私が探しているのは、LocationManagerと連携して使用されると思われるジオフェンシングです。あなたがまだ助けてくれると思うなら、大いに感謝します。私はその間にもっと多くを探しています。 – Taquitoburrito