2010-08-19 5 views
29

Ich muss wissen, wie Sie den Radius der sichtbaren Zoomstufe in Google Maps API v3 abrufen.Radius der "sichtbaren" Region in Google Maps v3

Zum Beispiel, wenn ich auf Zoomstufe 3 bin, und abhängig von der Bildschirmgröße des Benutzers (sagen wir mal 400x400 sichtbare Region) wie bekomme ich den "Radius" -Kreis des sichtbaren Bereichs.

Alternativ verwende ich zur Zeit map.fitBounds() für alle Punkte, die ich der Karte hinzugefügt habe, also wirklich alle ich NEED ist der Radius aller Grenzen. Was ich möchte, ist etwas wie "20 Meilen", die ich in meine Datenbank-App einspeisen kann.

Antwort

72

der Radius der Abstand von der Mitte der Grenzen gleich eins wäre die Ecken der Grenze . Mit Hilfe der Großkreisentfernung Formel von the calculations from this page, kam ich mit der Follow-up:

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)); 

Nach dem Spielen etwas mehr mit diesem, ich habe bemerkt, dass map.getBounds() das vollständige Karte Ansichtsfenster enthalten. Aber wenn Ihr LatLngBounds durch Erweiterung um LatLng Punkte erstellt wird, und Sie dann eine map.fitBounds(bounds) ausgeben, erhöht die API das Ansichtsfenster der Karte ein wenig, so dass die bounds "Box" einige Polsterung hat.

Wenn Sie das aktuelle Ansichtsfenster der Karte verwenden, ist der Radius von der Mitte zur Ecke des Ansichtsfensters möglicherweise länger als gewünscht. Vielleicht die Entfernung von der Mitte des Ansichtsfensters zur Mitte der äußersten Viewport-Kante. (Wenn die Karte kein perfektes Quadrat ist)

+1

Awesomesauce, was nur ich brauchte. Danke! –

+0

Um dieses Beispiel zu bekommen arbeiten, sollten die ersten drei Zeilen 'var Grenzen = map.getBounds() sein; var center = bounds.getCenter(); var ne = bounds.getNorthEast();!' –

21

Überarbeitete Version von Eric's answer oben mit google.maps.geometry.spherical Namespace (stellen Sie sicher, dass Sie Geometry library geladen, diese Arbeit zu machen).

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); 
} 
+1

Perfekt Hilft mir eine Menge, um die Anfragen niedrig zu halten Quote zu schnell erreichen. – kosemuckel

2

ich Refactoring auch die Antwort von Eric, Mine als eigenständige Funktion ist, und das Ergebnis in Metern kehrte zurück (wie von den Places API search benötigt.

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 
}