2010-02-15 31 views
35

Có tự động đặt mức thu phóng dựa trên kích thước của quốc gia mà bản đồ đã được căn giữa không?Cách nhận API Google Maps để đặt mức thu phóng chính xác cho một quốc gia?

maps.google.com thực hiện chính xác những gì tôi cần, ví dụ: nếu tôi tìm kiếm Nga, tôi nhận được mức thu phóng sao cho Nga vừa vừa trên màn hình và khi tôi tìm kiếm Cuba, tôi có mức thu phóng cao hơn để Cuba phù hợp.

Có cách nào đó để cung cấp cho Maps Api một vị trí quốc gia và nhận được mức thu phóng thích hợp hay không.

Nếu không, tôi đoán rằng tôi sẽ phải tự tay (ugh!) Tạo bảng của riêng tôi cho thông tin này. Hay thông tin này có sẵn tự do ở đâu đó không?

Trả lời

45

Đối với API v3, hãy kiểm tra câu trả lời bên dưới.

Bạn có thể sử dụng Google Maps Client-side Geocoder để có được những khung giới hạn của đất nước, như trong ví dụ sau:

// API version 2 
var geocoder = new GClientGeocoder(); 

geocoder.getLocations("Russia", function (locations) { 

    var north = locations.Placemark[0].ExtendedData.LatLonBox.north; 
    var south = locations.Placemark[0].ExtendedData.LatLonBox.south; 
    var east = locations.Placemark[0].ExtendedData.LatLonBox.east; 
    var west = locations.Placemark[0].ExtendedData.LatLonBox.west; 

    var bounds = new GLatLngBounds(new GLatLng(south, west), 
            new GLatLng(north, east)); 

    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); 
}); 

// API version 3 
// ... set north, south, east and west ... 
var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(south, west), 
              new google.maps.LatLng(north, east)); 
map.fitBounds(bounds); 

Các ảnh chụp màn hình dưới đây cho thấy các kết quả của các kỹ thuật nói trên khi tìm kiếm Nga và Cuba:

Zoom on Russia and Cuba

+2

Tuyệt vời, đó là hoàn hảo nhờ. Tôi đang làm việc trong GWT và nó chưa thể truy cập ExtendedData, vì vậy tôi đã phải tạo một số phương thức JSNI để làm điều đó. Một điều khiến tôi mất một lúc: đảm bảo rằng bản đồ hiển thị khi gọi getBoundsZoomLevel, nếu không nó sẽ trả về mức thu phóng bằng không. – krishnaz

+0

@krishnaz: Tốt lắm. Cảm ơn bạn đã chia sẻ mẹo 'getBoundsZoomLevel()'. –

+2

+1 Chúng ta sống ở độ tuổi nào ........ –

3

Nếu bạn không sử dụng bản đồ google api và chỉ sử dụng mã hóa địa lý của họ, bạn có thể sử dụng công thức này:

var url = 'http://maps.google.com/maps/geo?q=YOUR_QUERY&output=json&oe=utf8&sensor=false&key=YOUR_KEYback=geoCodeDone'; 
jQuery.getScript(url); 


function geoCodeDone(data) 
{ 
    if (data.Status.code == 200) 
    { 
     lng = data.Placemark[0].Point.coordinates[0]; 
     lat = data.Placemark[0].Point.coordinates[1]; 

     var east = data.Placemark[0].ExtendedData.LatLonBox.east; 
     var west = data.Placemark[0].ExtendedData.LatLonBox.west; 

     var zoom = 11 - Math.round(Math.log(Math.abs(west-east))/Math.log(2)); 
    } 
} 
49

Đối V3 mã này làm việc cho tôi:

var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     map.setCenter(results[0].geometry.location); 
     map.fitBounds(results[0].geometry.viewport); 
     } 
    }); 
+2

Hoạt động hoàn hảo. Cảm ơn bạn đã thêm phiên bản cập nhật cho V3. Nhiều đánh giá cao. –

+2

Tuyệt vời. Làm việc với bất kỳ nơi nào. Thành phố, tỉnh, quốc gia, v.v. – Phius

+0

Đối số có phải là 'setCenter' và' fitBounds' không? Tôi không thể có vẻ để có được điều này làm việc, có một lỗi JS nói "quá nhiều đệ quy" - 'map.setCenter (lat, lon);' hoạt động. –

1

Nếu bạn không muốn sử dụng máy khách geocoder từ google, vì những hạn chế việc sử dụng bạn có thể sử dụng danh sách của riêng bạn. Bạn có thể lấy một cái từ số github repo này.

Dưới đây là một ví dụ mã sử dụng chức năng getJSON jQuery và bản đồ google API v3:

function initialize() { 
     // read the list of countries 
    $.getJSON('countries.json', function (countries) { 

     // will use the country with index 40 (Cyprus) 
     var index_country = 40; 
     var myOptions = { 
      center: new google.maps.LatLng(
       countries[index_country].center_lat, 
       countries[index_country].center_lng), 
     } 
     var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

     // set the bounds of the map 
     var bounds = new google.maps.LatLngBounds(
      new google.maps.LatLng(countries[index_country].sw_lat, countries[index_country].sw_lng), 
      new google.maps.LatLng(countries[index_country].ne_lat, countries[index_country].ne_lng)); 

     map.fitBounds(bounds); 
    }); 
} 
Các vấn đề liên quan