2010-08-19 50 views
29

Tôi cần biết cách lấy bán kính của mức thu phóng có thể xem trong google maps API v3.Bán kính của vùng "có thể xem" trong google maps v3

Ví dụ: nếu tôi ở mức thu phóng 3 và tùy thuộc vào kích thước màn hình của người dùng (chỉ cho phép khu vực có thể xem 400x400) làm cách nào để tôi nhận được vòng kết nối "bán kính" của khu vực có thể xem.

Hoặc tôi hiện đang sử dụng map.fitBounds() cho tất cả các điểm tôi đã thêm vào bản đồ để thực sự tất cả I NEED là bán kính của tất cả các giới hạn. Những gì tôi muốn là một cái gì đó giống như "20 dặm" ​​mà tôi có thể đưa vào ứng dụng cơ sở dữ liệu của tôi.

Trả lời

72

Bán kính sẽ bằng khoảng cách từ trung tâm của các giới hạn cho một trong các góc của các góc . Sử dụng công thức Great Circle Khoảng cách từ the calculations from this page, tôi đã đưa ra như sau:

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

Sau khi chơi một số chi tiết với điều này, tôi đã nhận thấy rằng map.getBounds() sẽ chứa các bản đồ khung nhìn đầy đủ. Nhưng nếu LatLngBounds của bạn được xây dựng bằng cách mở rộng để bao gồm LatLng điểm và sau đó bạn phát hành map.fitBounds(bounds), api tăng chế độ xem của bản đồ một chút sao cho hộp bounds "có một số đệm.

Nếu bạn sử dụng chế độ xem hiện tại của bản đồ, bán kính từ trung tâm đến góc của chế độ xem có thể là bán kính dài hơn bạn muốn. Có thể khoảng cách từ trung tâm khung nhìn đến giữa cạnh khung nhìn xa nhất. (Nếu bản đồ không phải là hình vuông hoàn hảo)

+1

Awesomesauce, chỉ là những gì tôi cần. Cảm ơn! –

+0

Để ví dụ này hoạt động, 3 dòng đầu tiên phải là 'var bounds = map.getBounds(); var center = bounds.getCenter(); var ne = bounds.getNorthEast();' –

2

Tôi tin Bounds có getNorthEast() và getSouthWest() phương pháp, nhưng điều này sẽ cung cấp cho bạn một hình chữ nhật (mà tiếp giáp thực sự là) và bạn có thể so với tính toán khoảng cách giữa hai vv Để tính toán vòng tròn ra của rectandle đó có thể là một chút công việc ...

có lẽ điều này sẽ giúp: http://code.google.com/apis/maps/articles/mvcfun.html

và ví dụ: http://code.google.com/apis/maps/articles/mvcfun/step6.html

21

Phiên bản được cấu trúc lại Eric's answer ở trên sử dụng google.maps.geometry.spherical không gian tên (đảm bảo bạn đã tải Geometry library để thực hiện công việc này).

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

Hoàn hảo! Giúp tôi rất nhiều để giữ cho các địa điểm yêu cầu thấp đến không đạt hạn ngạch quá nhanh. – kosemuckel

2

Tôi cũng refactored câu trả lời của Eric, tôi là như một chức năng độc lập, và đang trả lại kết quả tính bằng mét (khi cần thiết bởi Places API search.

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 
} 
Các vấn đề liên quan