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

Радиус "видимого" региона в google maps v3

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

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

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

4b9b3361

Ответ 1

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

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 "имеет некоторое дополнение.

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

Ответ 2

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

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

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

Возможно, это поможет: http://code.google.com/apis/maps/articles/mvcfun.html

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

Ответ 4

Я также реорганизовал ответ Эрика, мой - как автономная функция, и я возвращаю результат в метрах (по необходимости Поиск 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
}