我正在尝试使用用户gps位置来检测用户是否位于标记的半径.我有标记的坐标,但我不知道如何计算用户是否在该区域.我试图使用以下内容,但即使当前位置在圈子内,我仍然会收到“外部”消息.
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(); } }
解决方法
我刚刚运行更新的代码,并找出主要问题是什么.
您应该使用传入onMyLocationChange()回调的位置,以便它使用您当前的位置来判断设备是否在圆圈内:
googleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { @Override public void onMyLocationChange(Location location) { float[] distance = new float[2]; /* Location.distanceBetween( mMarker.getPosition().latitude,distance); */ Location.distanceBetween( location.getLatitude(),location.getLongitude(),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,Toast.LENGTH_LONG).show(); } } });
以下是我运行的全部工作示例,它是您的原始代码的缩减版本:
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,distance); */ Location.distanceBetween( location.getLatitude(),distance); if( distance[0] > mCircle.getRadius() ){ Toast.makeText(getBaseContext(),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(),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(); } }
圈内结果:
圆圈外的结果: