2010-07-23 34 views
20

Tôi có lớp phủ được tạo động từ dữ liệu người dùng, vì vậy tôi cần biết cách tìm trung tâm của lớp phủ đó.API Google Maps: Tính toán Trung tâm/Thu phóng của Polyline

Hiện tại, tôi chỉ đang sử dụng tọa độ đầu tiên từ lớp phủ, nhưng điều đó thực sự không đại diện cho trung tâm của lớp phủ. Do đó khi tôi tải bản đồ, nó không được căn giữa trên lớp phủ.

Có ai có phương pháp hay để căn giữa bản đồ trên lớp phủ hay không, bằng cách tính toán trung tâm, không khó mã hóa nó?

var latlng = new google.maps.LatLng(38.269239, -122.276010); 
    var myOptions = { 
     zoom: 15,//Calculate this somehow? 
     center: latlng,// Calculate value from array of coordinates? 
     mapTypeId: google.maps.MapTypeId.HYBRID 
    }; 

Trả lời

78

Nếu bạn có danh sách toạ độ, bạn có thể lặp lại chúng và thêm chúng vào đối tượng LatLngBounds. Dưới đây là một ví dụ cho các API V3, nhưng khái niệm này trong V2 cũng tương tự như:

var bounds = new google.maps.LatLngBounds(); 
for (var i = 0; i < coordinates.length; i++) { 
    bounds.extend(coordinates[i]); 
} 

Sau đó, bạn có thể nhận được trung tâm với:

bounds.getCenter(); 

Hoặc cách khác, bạn có thể gọi map.fitBounds() trực tiếp, sẽ căn giữa bản đồ quanh tâm giới hạn và điều chỉnh zoom, sao cho toàn bộ giới hạn sẽ khớp chính xác vào cổng xem.

map.fitBounds(bounds); 
+0

Bạn đang tuyệt vời! Cảm ơn bạn, điều này đã làm việc như thế nào tôi cần! –

+0

Có thể sử dụng cùng phương pháp này để tính tỷ lệ thu phóng không? –

+0

Chỉ cần sử dụng bất kỳ vị trí và mức thu phóng nào bạn muốn trong quá trình khởi tạo và gọi 'map.fitBounds (bounds);' sau đó như được mô tả. Nếu bạn muốn thực thi một số mức thu phóng tối đa, bạn sẽ cần phải tạm thời đăng ký một 'zoomChangeBoundsListener'. Cho tôi biết nếu bạn cần một ví dụ cho điều đó. – tux21b

2

Chức năng getCenter của LatLngBounds không phải lúc nào cũng cung cấp điểm WITHIN polyline. Dường như thuật toán được sử dụng là đơn giản. Tôi đang cố gắng để tìm một giải pháp và sẽ xuất bản nó ở đây nếu một trong những tìm thấy.

10

Dựa trên @ tux21b,

 var bounds = new google.maps.LatLngBounds(); 
     polyline.getPath().forEach(function(e){//can't do polyline.getPath()[i] because it's a MVCArray 
      bounds.extend(e); 
     })   
     _map.fitBounds(bounds); 
Các vấn đề liên quan