Android Google Karte, wie um zu prüfen, ob die gps-Position innerhalb des Kreises
Ich versuche zu erkennen, ob sich ein Benutzer im radius von einem Marker , mit dem die Nutzer die gps-Position. Ich habe die marker-Koordinaten, aber ich weiß nicht, wie zu berechnen, ob der Benutzer in der Gegend. Ich habe versucht, verwenden Sie die folgenden, aber auch, wenn die aktuelle Position innerhalb des Kreises liegt, dass ich immer "außerhalb" angezeigt.
public class MapaEscola extends FragmentActivity {
private GoogleMap googleMap;
private Serializable escolas;
private ProgressDialog dialog;
private Circle mCircle;
private Marker mMarker;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
setContentView(R.layout.maps);
//Loading map
initilizeMap();
//Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
//Showing /hiding your current location
googleMap.setMyLocationEnabled(true);
//Enable /Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(true);
//Enable /Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
//Enable /Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
//Enable /Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
//Enable /Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);
Bundle extra = getIntent().getBundleExtra("extra");
ArrayList<Escolas> objects = (ArrayList<Escolas>) extra.getSerializable("array");
try {
for(int i = 0; i < objects.size(); i ++) {
System.out.println(" escolas " + objects.get(i).getLatitude() + " " + objects.get(i).getLongitude());
float latitude = objects.get(i).getLatitude();
float longitude = objects.get(i).getLongitude();
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-23.316281, -51.155528), 15));
MarkerOptions options = new MarkerOptions();
//Setting the position of the marker
options.position(new LatLng(latitude, longitude));
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
LatLng latLng = new LatLng(latitude, longitude);
drawMarkerWithCircle(latLng);
googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
float[] distance = new float[2];
Location.distanceBetween( mMarker.getPosition().latitude, mMarker.getPosition().longitude,
mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance);
if( distance[0] > (mCircle.getRadius() / 2) ){
Toast.makeText(getBaseContext(), "Outside", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getBaseContext(), "Inside", Toast.LENGTH_LONG).show();
}
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void drawMarkerWithCircle(LatLng position){
double radiusInMeters = 500.0;
int strokeColor = 0xffff0000; //red outline
int shadeColor = 0x44ff0000; //opaque red fill
CircleOptions circleOptions = new CircleOptions().center(position).radius(radiusInMeters).fillColor(shadeColor).strokeColor(strokeColor).strokeWidth(8);
mCircle = googleMap.addCircle(circleOptions);
MarkerOptions markerOptions = new MarkerOptions().position(position);
mMarker = googleMap.addMarker(markerOptions);
}
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.map)).getMap();
//check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Não foi possível carregar o mapa", Toast.LENGTH_SHORT)
.show();
}
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
finish();
return true;
}
return true;
}
@Override
protected void onResume() {
super.onResume();
initilizeMap();
}
}
InformationsquelleAutor AND4011002849 | 2015-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief nur den aktualisierten code und herausgefunden, was das Hauptproblem ist.
Sollten Sie mit Hilfe der
Location
ging in dieonMyLocationChange()
Rückruf, so dass Sie verwendet Ihre aktuelle Position zu sagen, wenn sich das Gerät im Kreis, oder nicht:Hier ist das komplette Beispiel, dass ich lief, es ist eine abgespeckte version Ihrer ursprünglichen code:
Ergebnisse Innerhalb des Kreises:
Ergebnisse von außerhalb des Kreises:
Werfen Sie einen Blick auf die aktualisierte Antwort. Sie hatte auch eine un-nötig Aufruf
getMap()
dort, werfen Sie einen Blick auf den vollständigen code.Es funktioniert nun, ich danke Ihnen so sehr!
Toll, bin froh, dass es funktioniert für Sie jetzt!
InformationsquelleAutor Daniel Nugent
@Daniel Nugent:
imho
getRadius()
zurückkehren wird, der radius und nicht der Durchmesser, so dass die "/2
" ist falsch@WARpoluido:
Ich kann nicht sehen, dass die
mMarker
variable wird aktualisiert, wenn sich die Lage ändert. Warum spielst du nicht den Stellenwert, denonMyLocationChange()
?Ich habe gerade von Ihnen positiv bewertet werden Ihre Antwort, weil Sie eine Würdigung verdienen. Vielen Dank für die Korrektur des radius - /Durchmesser-Fehler aus meiner ersten Antwort!
InformationsquelleAutor casiosmu
Hallo ich habe mir richtig funktioniert mit diesem code
Innerhalb des Kreises
Außerhalb des Kreises
InformationsquelleAutor matthewoak
Akzeptierten Lösung Daniel Nugent nicht mehr so gut, weil
setOnMyLocationChangeListener
ist veraltet jetzt.Hier ist die aktuelle Art und Weise, wie es in fragment - ändern
getActivity()
mitthis
Aktivität:InformationsquelleAutor nasko700