Android Google Map, wie man überprüft, ob die GPS-Position innerhalb des Kreises ist

Ich versuche zu erkennen, ob ein Benutzer im Radius eines Markers ist, mit dem Benutzer gps location. Ich habe die Koordinaten des Markers, aber ich weiß nicht, wie man berechnet, ob der Benutzer im Bereich ist. Ich habe versucht, das folgende zu benutzen, aber selbst wenn der aktuelle Standort innerhalb des Kreises ist, bekomme ich immer die "äußere" Nachricht.

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(); } } 

  • Drehen eines ImageViews wie ein Kompass (mit dem "Nordpol" anderswo)
  • Wie kann ich das GPS programmgesteuert auf Android aktivieren oder deaktivieren?
  • Wie bekomme ich Geschwindigkeit in Android App mit Location oder Beschleunigungsmesser oder auf andere Weise
  • Android - wie bekomme ich einen Freund?
  • LocationClient getLastLocation () return null
  • Wie bekomme ich gps location einmal für 5 mins android?
  • Android Location.getAccuracy () gibt 1 zurück
  • Algorithmus / Theorie für GPS-Position Jitter Entfernung
  • 3 Solutions collect form web for “Android Google Map, wie man überprüft, ob die GPS-Position innerhalb des Kreises ist”

    Ich habe gerade den aktualisierten Code und herausgefunden, was das Hauptproblem ist.

    Sie sollten den in den onMyLocationChange() Rückruf übergebenen Ort verwenden, damit er Ihren aktuellen Standort verwendet, um zu ermitteln, ob das Gerät innerhalb des Kreises ist oder nicht:

     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); */ Location.distanceBetween( location.getLatitude(), location.getLongitude(), mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance); if( distance[0] > mCircle.getRadius() ){ Toast.makeText(getBaseContext(), "Outside, distance from center: " + distance[0] + " radius: " + mCircle.getRadius(), Toast.LENGTH_LONG).show(); } else { Toast.makeText(getBaseContext(), "Inside, distance from center: " + distance[0] + " radius: " + mCircle.getRadius() , Toast.LENGTH_LONG).show(); } } }); 

    Hier ist das volle Arbeitsbeispiel, dass ich lief, es ist eine abgespeckte Version deines ursprünglichen Codes:

     public class MainActivity extends ActionBarActivity { 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); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); setContentView(R.layout.activity_main); // 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 { //test outside double mLatitude = 37.77657; double mLongitude = -122.417506; //test inside //double mLatitude = 37.7795516; //double mLongitude = -122.39292; googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLatitude, mLongitude), 15)); MarkerOptions options = new MarkerOptions(); // Setting the position of the marker options.position(new LatLng(mLatitude, mLongitude)); //googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); LatLng latLng = new LatLng(mLatitude, mLongitude); 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); */ Location.distanceBetween( location.getLatitude(), location.getLongitude(), mCircle.getCenter().latitude, mCircle.getCenter().longitude, distance); if( distance[0] > mCircle.getRadius() ){ Toast.makeText(getBaseContext(), "Outside, distance from center: " + distance[0] + " radius: " + mCircle.getRadius(), Toast.LENGTH_LONG).show(); } else { Toast.makeText(getBaseContext(), "Inside, distance from center: " + distance[0] + " radius: " + mCircle.getRadius() , 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 = ((SupportMapFragment) getSupportFragmentManager().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(); } } 

    Ergebnisse von Innerhalb des Kreises:

    innen

    Ergebnisse von außerhalb des Kreises:

    Draußen

    @Daniel Nugent: Imho getRadius() wird den Radius zurückgeben und nicht den Durchmesser, so dass die " /2 " falsch ist

    @WARpoluido: Ich kann nicht sehen, dass die mMarker Variable aktualisiert wird, wenn sich der Standort ändert. Warum nimmst du nicht den Wert auf onMyLocationChange() ?

     Location.distanceBetween( mCircle.getCenter().latitude, mCircle.getCenter().longitude, location.getLatitude(), location.getLongitude(), distance); if( distance[0] > mCircle.getRadius() ){ ... 

    Hallo ich habe meine Arbeit richtig mit diesem Code

     //Getting current location private void getCurrentLocation() { mMap.clear(); //Creating a location object Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); if (location != null) { //Getting longitude and latitude longitude = location.getLongitude(); latitude = location.getLatitude(); //moving the map to location moveMap(); } Circle circle = mMap.addCircle(new CircleOptions() .center(new LatLng(54.773097, -6.557841)) .radius(55) .strokeColor(Color.RED) ); pLong = location.getLongitude(); pLat = location.getLatitude(); float[] distance = new float[2]; Location.distanceBetween(pLat, pLong, circle.getCenter().latitude, circle.getCenter().longitude, distance); if( distance[0] > circle.getRadius() ){ Toast.makeText(getBaseContext(), "You are not in a bunker", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getBaseContext(), "You are inside a bunker", Toast.LENGTH_LONG).show(); } } 

    Innerhalb des Kreises

    Außerhalb des Kreises

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.