ขอบคุณ Giles Gardam สำหรับคำตอบของเขา แต่มันเน้นเฉพาะลองจิจูดและไม่ใช่ละติจูด โซลูชันที่สมบูรณ์ควรคำนวณระดับการซูมที่จำเป็นสำหรับละติจูดและระดับการซูมที่จำเป็นสำหรับลองจิจูดจากนั้นจึงใช้ขนาดเล็กลง
นี่คือฟังก์ชั่นที่ใช้ทั้งละติจูดและลองจิจูด:
function getBoundsZoomLevel(bounds, mapDim) {
var WORLD_DIM = { height: 256, width: 256 };
var ZOOM_MAX = 21;
function latRad(lat) {
var sin = Math.sin(lat * Math.PI / 180);
var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
function zoom(mapPx, worldPx, fraction) {
return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
}
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;
var lngDiff = ne.lng() - sw.lng();
var lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);
var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);
return Math.min(latZoom, lngZoom, ZOOM_MAX);
}
Demo on jsfiddle
พารามิเตอร์:
ค่าพารามิเตอร์ "ขอบเขต" ควรเป็นgoogle.maps.LatLngBounds
วัตถุ
ค่าพารามิเตอร์ "mapDim" ควรเป็นวัตถุที่มีคุณสมบัติ "height" และ "width" ที่แสดงถึงความสูงและความกว้างขององค์ประกอบ DOM ที่แสดงแผนที่ คุณอาจต้องการลดค่าเหล่านี้หากคุณต้องการมั่นใจในการเติมเต็ม นั่นคือคุณอาจไม่ต้องการให้ตัวทำเครื่องหมายแผนที่อยู่ภายในขอบเขตใกล้กับขอบของแผนที่มากเกินไป
หากคุณกำลังใช้ไลบรารี jQuery คุณmapDim
สามารถรับค่าได้ดังนี้:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
หากคุณกำลังใช้ไลบรารี Prototype คุณสามารถรับค่า mapDim ได้ดังนี้:
var mapDim = $('mapElementId').getDimensions();
มูลค่าส่งคืน:
ค่าตอบแทนคือระดับการซูมสูงสุดที่จะยังคงแสดงขอบเขตทั้งหมด ค่านี้จะอยู่ระหว่าง0
ถึงระดับการซูมสูงสุดรวม
ระดับการซูมสูงสุดคือ 21 (ฉันเชื่อว่าเป็นเพียง 19 สำหรับ Google Maps API v2)
คำอธิบาย:
Google Maps ใช้เส้นโครงแผนที่ Mercator ในการฉายแบบ Mercator เส้นของลองจิจูดนั้นมีระยะห่างเท่า ๆ กัน แต่เส้นละติจูดนั้นไม่ใช่ ระยะห่างระหว่างเส้นรุ้งเพิ่มขึ้นเมื่อพวกเขาไปจากเส้นศูนย์สูตรถึงขั้ว อันที่จริงแล้วระยะทางมีแนวโน้มที่จะไม่มีที่สิ้นสุดเมื่อถึงเสา อย่างไรก็ตามแผนที่ Google Maps จะไม่แสดงละติจูดที่สูงกว่าประมาณ 85 องศาเหนือหรือต่ำกว่าประมาณ -85 องศาใต้ ( อ้างอิง ) (ฉันคำนวณค่า cutoff จริงที่ +/- 85.05112877980658 องศา)
ทำให้การคำนวณเศษส่วนสำหรับขอบเขตนั้นซับซ้อนกว่าสำหรับละติจูดมากกว่าสำหรับลองจิจูด ฉันใช้สูตรจาก Wikipediaเพื่อคำนวณเศษส่วนละติจูด ฉันถือว่าสิ่งนี้ตรงกับเส้นโครงที่ Google แผนที่ใช้ ท้ายที่สุดแล้วหน้าเอกสารของ Google Maps ที่ฉันลิงค์ด้านบนมีลิงค์ไปยังหน้า Wikipedia เดียวกัน
หมายเหตุอื่น ๆ :
- ระดับการซูมมีตั้งแต่ 0 ถึงระดับการซูมสูงสุด ระดับการซูม 0 เป็นแผนที่ที่ขยายออกจนสุด ระดับที่สูงขึ้นซูมแผนที่เพิ่มเติม ( อ้างอิง )
- ที่ระดับการซูม 0 ทั้งโลกสามารถแสดงในพื้นที่ที่เป็น 256 x 256 พิกเซล ( อ้างอิง )
- สำหรับระดับการซูมที่สูงขึ้นแต่ละจำนวนพิกเซลที่จำเป็นในการแสดงพื้นที่เดียวกันจะเพิ่มขึ้นเป็นสองเท่าทั้งความกว้างและความสูง ( อ้างอิง )
- แผนที่ห่อในทิศทางตามยาว แต่ไม่อยู่ในทิศทางละติจูด