Подтвердить что ты не робот

Как преобразовать LatLng и радиус в LatLngBounds в Android API Google Maps v2?

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

Можно вызвать CameraUpdateFactory # newLatLngBounds (bounds, padding), где "bounds" - это LatLngBounds, а "padding" - расстояние в пикселях. Проблема в том, что нет возможности создать LatLng и радиус в LatLngBounds.

Конструктор для LatLngBounds принимает только 2 экземпляра LatLng и создает прямоугольник, где это углы NW и SE.

4b9b3361

Ответ 1

Как и упоминал Рисадинья, вы можете легко достичь этого с помощью android-maps-utils. Просто добавьте:

compile 'com.google.maps.android:android-maps-utils:0.4.4'

в зависимости от gradle, используйте следующий код:

public LatLngBounds toBounds(LatLng center, double radiusInMeters) {
    double distanceFromCenterToCorner = radiusInMeters * Math.sqrt(2.0);
    LatLng southwestCorner =
                SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 225.0);
    LatLng northeastCorner = 
                SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 45.0);
    return new LatLngBounds(southwestCorner, northeastCorner);
}

EDIT:

Наша цель - вычислить две точки (LatLngs):

  • southwestCorner

и

  • northeastCorner

Из Javadoc SphericalUtil вы можете прочитать, что 225 и 45 являются значениями heading, а distanceFromCenterToCorner является distance. Дальнейшее объяснение значений на картинке ниже:

visual explanation

Ответ 2

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

centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001);
circle = new google.maps.Circle({radius: 5000, center: centerSfo});
bounds = circle.getBounds();

Вы можете сделать то же самое с помощью android api.

Ответ 3

Это полностью выполнимо.

LatLng является центром вашего круга правильно? То, что вы хотите сделать, это вписать свой круг внутри LatLngBounds (Круг внутри квадратной проблемы), поэтому вся информация будет отображаться на карте.

Если вы нарисуете это на бумаге, вы увидите, что у вас есть все необходимое для расчета LatLngBounds.

Помните, как найти длины сторон правого треугольника?

a² + b² = c²

Если вы нарисуете линию от центра вашего круга до угла NW (верхний левый), а другой прямо к западной стене (прямая линия от центра, влево) квадрата, у вас есть треугольник. Теперь вы можете использовать приведенное выше уравнение для решения для c, так как вы знаете длину других сторон треугольника (радиус окружности).

Итак, теперь ваше уравнение становится

r² + r² = c²

которая сводится к

2r² = c²

которая далее сводится к

c = squareRoot (2) * r

Теперь у вас есть расстояние. Это, конечно, упрощение, потому что Земля не плоская. Если расстояния не огромны, вы можете использовать одно и то же уравнение выше, но изменить для проецирования сферической земли на плоскость:

http://en.wikipedia.org/wiki/Geographical_distance#Flat-surface_formulae

Обратите внимание, что это также использует теорему Пифагора, как и мы выше.

Затем вам нужно будет вычислить конечные точки (NW и углы SE) из вашей центральной точки с учетом подшипника и расстояние, которое вы обнаружили выше.

enter image description here

Это сообщение может помочь: Рассчитать конечную точку, заданную расстояние, несущую, начальную точку

Не забудьте преобразовать градусы в радианы при использовании уравнения из поста, связанного выше! (Умножить градусы на pi/180)

Ответ 5

В то время как ответ Bartek Lipinski является правильным, если ваши LatLngBounds определяют квадрат, большинство LatLngBounds определяют прямоangularьники, и, таким образом, ориентиры северо-восточной и юго-западной точек от центра не всегда будут равны 45 и 255 градусов.

Поэтому, если вы хотите получить LatLngBounds радиуса от центра для любого четырехangularьника, используйте координаты ваших начальных bounds.northeast и bounds.southwest следующим образом (используя SphericalUtils):

LatLng northEast = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), SphericalUtil.computeHeading(center, bounds.northeast));
LatLng southWest = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), (180 + (180 + SphericalUtil.computeHeading(center, bounds.southwest))));

(180 + (180 + x)) вычисляет направление юго-западной точки от центра по часовой стрелке.