Радиус «видимой» области в Google Maps v3 - PullRequest
37 голосов
/ 19 августа 2010

Мне нужно знать, как получить радиус видимого уровня масштабирования в API карт Google v3.

Например, если я нахожусь на уровне масштабирования 3 и зависит от размера экрана пользователя (давайте простоскажем, 400x400 видимой области) как получить круг "радиус" видимой области.

В качестве альтернативы я в настоящее время использую map.fitBounds () для всех точек, которые я добавил на карту, поэтому все I NEED - это радиус всех границ.То, что я хочу, это что-то вроде «20 миль», которое я могу вставить в свое приложение базы данных.

Ответы [ 4 ]

80 голосов
/ 20 августа 2010

Радиус будет равен расстоянию от центра границ до одного из углов. Используя формулу Великого окружного расстояния из расчетов по этой странице , я пришел к следующему:

var bounds = map.getBounds();

var center = bounds.getCenter();
var ne = bounds.getNorthEast();

// r = radius of the earth in statute miles
var r = 3963.0;  

// Convert lat or lng from decimal degrees into radians (divide by 57.2958)
var lat1 = center.lat() / 57.2958; 
var lon1 = center.lng() / 57.2958;
var lat2 = ne.lat() / 57.2958;
var lon2 = ne.lng() / 57.2958;

// distance = circle radius from center to Northeast corner of bounds
var dis = r * Math.acos(Math.sin(lat1) * Math.sin(lat2) + 
  Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));

Поиграв с этим еще раз, я заметил, что map.getBounds() будет содержать полную область просмотра карты. Но если ваша LatLngBounds построена путем расширения, включающего LatLng точек, а затем вы выдаете map.fitBounds(bounds), API немного увеличивает область просмотра карты, так что bounds "коробка" имеет некоторые отступы.

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

24 голосов
/ 15 февраля 2016

Рефакторированная версия Ответ Эрика выше с использованием google.maps.geometry.spherical пространства имен (убедитесь, что вы загрузили Библиотека геометрии всделать эту работу).

var bounds = map.getBounds();
var center = map.getCenter();
if (bounds && center) {
  var ne = bounds.getNorthEast();
  // Calculate radius (in meters).
  var radius = google.maps.geometry.spherical.computeDistanceBetween(center, ne);
}
3 голосов
/ 01 июня 2016

Я также реорганизовал ответ Эрика, мой - как отдельная функция, и я возвращаю результат в метрах (как требуется для поиска API Адресов .

function getBoundsRadius(bounds){
  // r = radius of the earth in km
  var r = 6378.8
  // degrees to radians (divide by 57.2958)
  var ne_lat = bounds.getNorthEast().lat() / 57.2958
  var ne_lng = bounds.getNorthEast().lng() / 57.2958
  var c_lat = bounds.getCenter().lat() / 57.2958
  var c_lng = bounds.getCenter().lng() / 57.2958
  // distance = circle radius from center to Northeast corner of bounds
  var r_km = r * Math.acos(
    Math.sin(c_lat) * Math.sin(ne_lat) + 
    Math.cos(c_lat) * Math.cos(ne_lat) * Math.cos(ne_lng - c_lng)
    )
  return r_km *1000 // radius in meters
}
1 голос
/ 20 августа 2010

Я считаю, Bounds имеют методы getNorthEast () и getSouthWest (), но это даст вам прямоугольник (который на самом деле является границей), и вы сможете вычислить расстояние между этими двумя и т. Д.вычислить круг из этого прямоугольника может быть немного работы ...

Может быть, это поможет: http://code.google.com/apis/maps/articles/mvcfun.html

и пример: http://code.google.com/apis/maps/articles/mvcfun/step6.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...