Android Google Maps: Как получить область, которая в данный момент отображается на экране устройства?
Есть ли способ получить координаты текущей области, которая отображается на устройстве?
Фон, мы хотим показать "близлежащие" места, которые хранятся в нашей собственной базе данных. Допустим, пользователь смотрит на следующий клип карты:
Как мы можем получить долготу / широту экрана (или точку в середине экрана и радиус, который охватывает все?). Пожалуйста, имейте в виду, что центр карты обычно не является текущей позицией, поскольку пользователь может перемещать центр карты!
3 ответа
Использование map.getProjection().getVisibleRegion()
, От VisibleRegion
ты можешь получить LatLngBounds
, с которым легко работать. Вы также можете попробовать напрямую с регионом, который может быть трапециевидным.
Я нашел решение для Google Map API v2 из нескольких ответов:
Итак, нужно реализовать Activity из интерфейса GoogleMap.OnCameraChangeListener
приватный статический финал int REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR = -1; частный статический финал двойной EARTH_RADIOUS = 3958,75; // радиус Земли; приватный статический финал int METER_CONVERSION = 1609; частная GoogleMap mGoogleMap; @Override Защищенный void onCreate(BundlevedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout); int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); if (status!= ConnectionResult.SUCCESS) { Диалоговое окно диалога = GooglePlayServicesUtil.getErrorDialog(статус, активность, REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR); dialog.show(); mGoogleMap = null; } еще { mGoogleMap = ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.fragment_shops_layout_maps_fragment)) GetMap (). mGoogleMap.setOnCameraChangeListener(это); } }
Слушатель, который работает, когда карта масштабируется. Определите как LatLng положения нижней левой, нижней правой, верхней левой и верхней правой сторон карты, которые отображаются на экране. По наибольшей стороне экрана и двум точкам мы можем получить радиус от центра карты.
@Override public void onCameraChange (CameraPosition cameraPosition) { // слушатель масштабирования; float zoomLevel = cameraPosition.zoom; VisibleRegion visibleRegion = mGoogleMap.getProjection(). GetVisibleRegion(); LatLng nearLeft = visibleRegion.nearLeft; LatLng nearRight = visibleRegion.nearRight; LatLng farLeft = visibleRegion.farLeft; LatLng farRight = visibleRegion.farRight; double dist_w = distanceFrom(nearLeft.latitude, nearLeft.longitude, nearRight.latitude, nearRight.longitude); double dist_h = distanceFrom(farLeft.latitude, farLeft.longitude, farRight.latitude, farRight.longitude); Log.d("DISTANCE: ", "DISTANCE WIDTH: " + dist_w + " DISTANCE HEIGHT: " + dist_h); }
Возвращаемое расстояние между 2 точками, сохраняемое как 2 пары местоположения в метрах;
public double distanceFrom (двойной лат1, двойной lng1, двойной лат2, двойной lng2) { // Возвращаем расстояние между 2 точками, сохраняемое как 2 пары местоположений; double dLat = Math.toRadians(lat2 - lat1); double dLng = Math.toRadians(lng2 - lng1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double dist = EARTH_RADIOUS * c; вернуть новый Double(dist * METER_CONVERSION).floatValue(); }
Если вы хотите получить радиус области, отображаемой на экране, нужно просто разделить на 2.
Надеюсь будет полезным!
Это рассчитывает радио в км на основе ширины карты:
public double calculateVisibleRadius() {
float[] distanceWidth = new float[1];
VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
LatLng farRight = visibleRegion.farRight;
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
LatLng nearLeft = visibleRegion.nearLeft;
//calculate the distance between left <-> right of map on screen
Location.distanceBetween( (farLeft.latitude + nearLeft.latitude) / 2, farLeft.longitude, (farRight.latitude + nearRight.latitude) / 2, farRight.longitude, distanceWidth );
// visible radius is / 2 and /1000 in Km:
return distanceWidth[0] / 2 / 1000 ;
}