Intereting Posts
Как применить эффект к изображению в андроиде, например, исказить, прожектор, экспозицию и многое другое Активность просочилась в окно com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0 Как отключить отображение пейзажа / портрета в мобильном веб-приложении (Android Browser / iOS-Mobile Safari) Импортировать проект тестирования Android в Eclipse из системы управления версиями Не переносите текст в Android TextView в аббревиатуре периода Как удалить панель кнопок на нижнем экране Как читать данные акселерометра в службе с Android Как найти, какие приложения разрешены в разделе «Приоритетные уведомления приложений» в настройках «Не беспокоить»? Android: Где сохранен звуковой файл temp Recognition? Как создать раскрывающееся меню, например «Календарь Google» с помощью панели инструментов? Площадь галереи в начале и конце Измените язык во время выполнения? Ошибка компилятора JACK для Android после обновления до последней библиотеки поддержки Вызов функции startActivity () извне контекста активности требует FLAG_ACTIVITY_NEW_TASK Пользовательский SeekBar Drawable Android

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

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

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

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

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

Как упоминал Ризадинья , вы можете легко достичь этого с помощью 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); } 

РЕДАКТИРОВАТЬ:

Наша цель – рассчитать две точки ( LatLngs ): southwestCorner и northeastCorner . Из javadoc SphericalUtil вы можете прочитать, что 225 и 45 являются значениями heading , а distanceFromCenterToCorner – это distance . Дальнейшее объяснение значений на рисунке ниже:

Визуальное объяснение

Это вполне выполнимо.

LatLng – это центр вашего круга? То, что вы хотите сделать, это вписать свой круг внутри задачи LatLngBounds (Circle inside a Square), так что все это будет отображаться на карте.

Если вы нарисуете это на бумаге, вы увидите, что у вас есть все необходимое для расчета 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 углы) из вашей центральной точки с учетом подшипника и расстояния, которое вы обнаружили выше.

Введите описание изображения здесь

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

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

Для Google есть служебная библиотека Google:

http://googlemaps.github.io/android-maps-utils/

Рекомендуем Google для этой задачи и пример кода: http://code.google.com/p/gmaps-api-issues/issues/detail?id=5704

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

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

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

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

Поэтому, если вы хотите получить LatLngBounds радиуса от центра для любого четырехугольника, используйте координаты ваших начальных bounds.northeast bounds.southwest 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) рассчитывает опору юго-западной точки от центра по часовой стрелке.