Android Google Maps: Как получить область, которая в данный момент отображается на экране устройства?

Есть ли способ получить координаты текущей области, которая отображается на устройстве?

Фон, мы хотим показать "близлежащие" места, которые хранятся в нашей собственной базе данных. Допустим, пользователь смотрит на следующий клип карты:

Как мы можем получить долготу / широту экрана (или точку в середине экрана и радиус, который охватывает все?). Пожалуйста, имейте в виду, что центр карты обычно не является текущей позицией, поскольку пользователь может перемещать центр карты!

3 ответа

Решение

Использование map.getProjection().getVisibleRegion(), От VisibleRegion ты можешь получить LatLngBounds, с которым легко работать. Вы также можете попробовать напрямую с регионом, который может быть трапециевидным.

Я нашел решение для Google Map API v2 из нескольких ответов:

stackru #1 и stackru#2

Итак, нужно реализовать 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 ;
}
Другие вопросы по тегам