Nivel de zoom 贸ptimo en mapas de Google

Me gustar铆a presentar una funci贸n en coffeescript para calcular el nivel de zoom 贸ptimo para los mapas de Google. Utiliza la f贸rmula de Haversine.

Primero, necesitamos definir algunas constantes

@MEAN_RADIUS_EARTH_IN_KM = 6371
@DEG_TO_RAD_DIVISOR = 57.2957795
@ZOOM_FACTOR = 1.6446

Necesitamos una funci贸n para convertir grados a radianes

toRadians = (degrees) ->
degrees
/ DEG_TO_RAD_DIVISOR

Entonces necesitamos la f贸rmula de Haversine

# Haversine formula to calculate the great-circle distance between two points, i.e. the shortest distance over the earths surface
haversine
= (maxLat, minLat, maxLng, minLng) ->
dLat
= maxLat - minLat
dLng
= maxLng - minLng
a
= Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(minLat) * Math.cos(maxLat) * Math.sin(dLng/2) * Math.sin(dLng/2)
c
= 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
MEAN_RADIUS_EARTH_IN_KM
* c

Por 煤ltimo, pero no menos importante, necesitamos una funci贸n para calcular el nivel de zoom 贸ptimo para los mapas de Google.

optimalZoomLevel = (maxLat, minLat, maxLng, minLng) ->
# min of height and width of element which contains the map
minMapDimension
= Math.min.apply @, [window.mapCanvas.width(),window.mapCanvas.height()]

[maxLat, minLat, maxLng, minLng] = [maxLat, minLat, maxLng, minLng].map (l) -> toRadians(l)
greatCircleDistance
= haversine(maxLat, minLat, maxLng, minLng)
Math.floor(8 - Math.log(ZOOM_FACTOR * greatCircleDistance / Math.sqrt(2 * (minMapDimension * minMapDimension))) / Math.log (2))

Aqu铆 la funci贸n de inicializaci贸n del mapa.

initializeMap = (lat, lng, zoomLevel) ->
mapOptions
=
zoom
: zoomLevel
center
: new google.maps.LatLng(lat, lng)
mapTypeId
: google.maps.MapTypeId.ROADMAP
disableDefaultUI
: true

window
.map = new google.maps.Map(window.mapCanvas[0], mapOptions)

Crea una referencia a tu lienzo de mapa

window.mapCanvas = $('#map_canvas')

Calcular el nivel de zoom

#generate optimal zoom level for Mediterranean area
zoomLevel
= optimalZoomLevel(44.4, 35.0, 32.4, -2.5)

E inicializar el mapa

initializeMap(41.0, 11.0, zoomLevel)