Получите радиус видимой карты в Android

Есть ли какой-либо возможный способ нахождения радиуса видимой карты из средней точки?

Google Map

Я хочу получить близкие места к центральной точке карты из API, и для этого API требуется lat, lng и radius. Я могу получить lat и lng из центральной точки, но не смог найти способ получить радиус.

спасибо

Ответ 1

Для API Android Карт Google вы можете получить границы с помощью...

С помощью ссылки на карту введите Projection на getProjection(). И,

для перевода между расположением экрана и географическими координатами используется проекция.

Итак, из проекции мы можем использовать getVisibleRegion() и получить VisibleRegion карты, которая содержит LatLngBounds, который является классом, который содержит 2 LatLng переменные, один для северо-восточного угла границы и один для юго-западного угла.

Итак, код должен выглядеть примерно так:

        googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition position) {
                LatLngBounds bounds = googleMap.getProjection().getVisibleRegion().latLngBounds;
                LatLng northeast = bounds.northeast;
                LatLng southwest = bounds.southwest;

                Context context = getApplicationContext();
                CharSequence text = "ne:"+northeast+" sw:"+southwest;
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }
        });

= - = - = - = - = - = Редактирование:

Возможно, я был слишком наивен, учитывая, что только NE и SW могут решить эту проблему, но только в специальном случае, когда пользователь не поворачивал карту или не наклонялся для 3D-карты.

Поэтому вместо этого вы можете просто захватить VisibleRegion, который предоставил 4 переменные, farRight, farLeft, nearRight, nearLeft, каждый из которых представляет 4 соединения этой области.

Затем мы можем вычислить ширину и высоту области для этих 4 точек и выбрать меньшую (ну, иногда ширина может быть больше высоты, я думаю.)

И для вычисления мы можем просто использовать функцию Location.distanceBetween(x1,y1,x2,y2,result)...

который делает код похожим на следующее:

                VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();

                LatLng farRight = visibleRegion.farRight;
                LatLng farLeft = visibleRegion.farLeft;
                LatLng nearRight = visibleRegion.nearRight;
                LatLng nearLeft = visibleRegion.nearLeft;

                float[] distanceWidth = new float[2];
                Location.distanceBetween(
                        (farRight.latitude+nearRight.latitude)/2,
                        (farRight.longitude+nearRight.longitude)/2,
                        (farLeft.latitude+nearLeft.latitude)/2,
                        (farLeft.longitude+nearLeft.longitude)/2,
                        distanceWidth
                        );


                float[] distanceHeight = new float[2];
                Location.distanceBetween(
                        (farRight.latitude+nearRight.latitude)/2,
                        (farRight.longitude+nearRight.longitude)/2,
                        (farLeft.latitude+nearLeft.latitude)/2,
                        (farLeft.longitude+nearLeft.longitude)/2,
                        distanceHeight
                );

                float distance;

                if (distanceWidth[0]>distanceHeight[0]){
                    distance = distanceWidth[0];
                } else {
                    distance = distanceHeight[0];
                }

Ответ 2

Огромное спасибо за ваш ответ @kaho, он мне очень помог (даже вы рассчитали distanceWidth и distanceHeight одинаково).

Разъяснение:

  • farLeft LatLng объект, который определяет верхний левый угол камеры.

  • farRight LatLng объект, который определяет верхний правый угол камеры.

  • nearLeft LatLng объект, который определяет левый нижний угол камеры.

  • nearRight LatLng объект, который определяет нижний правый угол камеры.

РЕДАКТИРОВАНИЕ: Я не знаю, почему мы сделали простой расчет немного сложнее, видимый радиус - это просто ПОЛОВИНА ВИДИМОЙ ДИАГОНАЛЬНОЙ ЛИНИИ, вот и все!

enter image description here

private double getMapVisibleRadius() {
        VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();

        float[] diagonalDistance = new float[1];

        LatLng farLeft = visibleRegion.farLeft;
        LatLng nearRight = visibleRegion.nearRight;

        Location.distanceBetween(
                farLeft.latitude,
                farLeft.longitude,
                nearRight.latitude,
                nearRight.longitude,
                diagonalDistance
        );

        return diagonalDistance[0] / 2;
    }

Я также зарегистрировал свои результаты, чтобы сравнить с результатами @jossef-harush, и это примерно:

enter image description here

Ответ 3

Полная площадь, даже углы!

Я не вижу, чтобы другие ответы охватывали всю область карты;

см. изображение ниже, чтобы проверить его. Я нарисовал наложение круга, чтобы увидеть границы расчетного радиуса, он не охватывает всю площадь карты.

моя модификация довольно проста, я использовал теорему Пифагора, чтобы найти подходящий радиус, содержащий карту "прямоугольник".


enter image description here


private double getMapVisibleRadius() {
    VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();

    float[] distanceWidth = new float[1];
    float[] distanceHeight = new float[1];

    LatLng farRight = visibleRegion.farRight;
    LatLng farLeft = visibleRegion.farLeft;
    LatLng nearRight = visibleRegion.nearRight;
    LatLng nearLeft = visibleRegion.nearLeft;

    Location.distanceBetween(
            (farLeft.latitude + nearLeft.latitude) / 2,
            farLeft.longitude,
            (farRight.latitude + nearRight.latitude) / 2,
            farRight.longitude,
            distanceWidth
    );

    Location.distanceBetween(
            farRight.latitude,
            (farRight.longitude + farLeft.longitude) / 2,
            nearRight.latitude,
            (nearRight.longitude + nearLeft.longitude) / 2,
            distanceHeight
    );

    double radiusInMeters = Math.sqrt(Math.pow(distanceWidth[0], 2) + Math.pow(distanceHeight[0], 2)) / 2;
    return radiusInMeters;
}

Ответ 4

edit: Следующий ответ для Google Maps JavaScript API v3
= - = - = - = - = - = - =

Я думаю, что ответ будет: Да, вы можете.

В соответствии с documentation вы можете рассчитать расстояние между двумя точками: computeDistanceBetween(LatLngFrom, LatLngTo)

Также вы можете получить границу карты с помощью метода getBounds(), который находится в классе google.maps.Map.

Ответ 5

Для пользователей Kotlin, вызовите эту функцию из setOnCameraIdleListener

private fun getMapVisibleRadius(): Double {
    val visibleRegion: VisibleRegion? = mMap?.projection?.visibleRegion

    val distanceWidth = FloatArray(1)
    val distanceHeight = FloatArray(1)

    val farRight: LatLng? = visibleRegion?.farRight
    val farLeft: LatLng? = visibleRegion?.farLeft
    val nearRight: LatLng? = visibleRegion?.nearRight
    val nearLeft: LatLng? = visibleRegion?.nearLeft

    Location.distanceBetween((farLeft!!.latitude + nearLeft!!.latitude) / 2,
            farLeft.longitude,
            (farRight!!.latitude + nearRight!!.latitude) / 2,
            farRight.longitude, distanceWidth)

    Location.distanceBetween(farRight.latitude,
            (farRight.longitude + farLeft.longitude) / 2,
            nearRight.latitude,
            (nearRight.longitude + nearLeft.longitude) / 2,
            distanceHeight)

    return Math.sqrt((Math.pow(distanceWidth[0].toString().toDouble(), 2.0))
            + Math.pow(distanceHeight[0].toString().toDouble(), 2.0)) / 2
}