Android Google Map how to check if the gps location is inside the circle

后端 未结 4 1021
小蘑菇
小蘑菇 2020-12-12 17:49

I\'m trying to detect if a user is in the radius of a Marker , using the users gps location. I have the marker\'s coordinates, but I don\'t know how to calculate whether the

4条回答
  •  猫巷女王i
    2020-12-12 18:23

    I just ran the updated code and figured out what the main problem is.

    You should be using the Location passed into the onMyLocationChange() callback, so that it uses your current location to tell if the device is within the circle or not:

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

    Here is the full working example that I ran, it's a pared down version of your original code:

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

    Results of Inside the circle:

    Inside

    Results of outside the circle:

    Outside

提交回复
热议问题