ทุกคนสามารถให้ลิงก์ (หรือรายละเอียดบางส่วน) ให้ฉันตามอัตราส่วนจริงกับตัวเลข "ระดับการซูม" สำหรับ Google แผนที่ได้หรือไม่
เช่นGoogle Maps ระดับ 13 = 1: 20000
ทุกคนสามารถให้ลิงก์ (หรือรายละเอียดบางส่วน) ให้ฉันตามอัตราส่วนจริงกับตัวเลข "ระดับการซูม" สำหรับ Google แผนที่ได้หรือไม่
เช่นGoogle Maps ระดับ 13 = 1: 20000
คำตอบ:
หากคุณกำลังออกแบบแผนที่คุณวางแผนที่จะวางทับแผนที่ google หรือโลกเสมือนและสร้างรูปแบบเรียงต่อกันฉันคิดว่าสิ่งที่คุณกำลังมองหาคือระดับของการซูมแต่ละระดับให้ใช้สิ่งเหล่านี้:
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
ที่มา: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
ฉันพบคำตอบนี้ - เขียนโดยพนักงานของ Google - นี่อาจเป็นคำตอบที่ถูกต้องที่สุด:
สิ่งนี้จะไม่ถูกต้องเนื่องจากความละเอียดของแผนที่ที่มีการฉาย Mercator (เช่น Google maps) ขึ้นอยู่กับละติจูด
เป็นไปได้ที่จะคำนวณโดยใช้สูตรนี้:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
สิ่งนี้ขึ้นอยู่กับสมมติฐานว่ารัศมีของโลกคือ 6378137m ค่าใดที่เราใช้ :)
นำมาจาก: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW - ฉันคาดเดาว่า:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
เพื่อช่วยให้คุณเข้าใจคณิตศาสตร์ (ไม่ใช่การคำนวณที่แม่นยำเป็นเพียงภาพประกอบ):
สมมติว่าจอภาพคอมพิวเตอร์ของคุณมี 100 พิกเซลต่อนิ้ว (PPI) นั่นหมายถึง 256 พิกเซลมีความยาวประมาณ 6.5 ซม. และที่0.065 เมตร
ในระดับการซูม 0 , ทั้ง 360 องศาของเส้นแวงที่มองเห็นได้ในกระเบื้องเดียว คุณไม่สามารถสังเกตสิ่งนี้ใน Google Maps ได้เนื่องจากมันจะเลื่อนไปที่ระดับการซูม 1 โดยอัตโนมัติ แต่คุณสามารถเห็นมันบนแผนที่ของ OpenStreetMap (มันใช้รูปแบบการเรียงต่อกันแบบเดียวกัน)
360 degress บนเส้นศูนย์สูตรเท่ากับรอบโลก 40,075.16 กม. ซึ่งคือ40075160 ม
หาร40075160 mด้วย0.065 mและคุณจะได้616313361ซึ่งเป็นระดับซูม 0 บน Equator สำหรับจอคอมพิวเตอร์ที่มี 100 DPI
591657550.500000
คือระดับ 0 ตามคำตอบนี้ แต่ตาม @CaptDragon คือระดับ 1 ฉันควรพิจารณาเริ่มต้นจากระดับ 1 เพื่อคำนวณด้วย Google Maps?
ไม่ใช่เรื่องง่าย ขนาดของไทล์พิกเซลจะขึ้นอยู่กับละติจูดของพื้นที่ที่คุณสนใจจากนั้นในแง่ของการเปลี่ยนขนาดพิกเซลของไทล์ในขนาดพิกเซลของหน้าจอมันขึ้นอยู่กับหน้าจอและความละเอียดของข้อมูลที่จะแสดง dpi หน้าจอของคุณกำลังใช้งาน
คำตอบที่ถูกต้องตรงไปตรงมามีสิทธิ์:
591657550.500000 / 2^(level-1)
มันให้ตารางด้านบนเข้าสู่ระดับการซูม
ลองใช้งานได้ที่jsfiddle.net
เนื่องจากคำถามนี้ใช้สำหรับ Google MAPS เท่านั้นไม่ใช่ EARTH OP ไม่สนใจเรขาคณิต 3 มิติ แผนที่ Google แบนแล้วดังนั้น 1 พิกเซลมักจะมีระยะห่างเท่ากันเสมอ (ใน DEGREES ซึ่งเป็นสิ่งที่เกี่ยวข้องกับแผนที่ของ Google) ที่นี่และในเอกวาดอร์เช่นเดียวกับในเสา
คุณรู้หรือไม่ว่าที่ไหนสักแห่งในแถวพิกเซลแรกของแผนที่โลกมาตราส่วนคือ 1: 1
เช่นมีตารางในเป็นเอกสารของระบบกระเบื้อง Virtal โลกจากไมโครซอฟท์ แต่ตามที่กล่าวไว้โดย GuillaumeC ค่าขึ้นอยู่กับละติจูดและความละเอียดหน้าจอ ตารางแสดงค่าที่วัดได้ที่ Equator และที่ความละเอียดหน้าจอ 96 dpi
PS: ไม่แน่ใจ แต่ระดับการซูมโดย Microsoft อาจเลื่อนไป 1 เมื่อเปรียบเทียบกับระดับการซูมโดย Google แต่พวกเขาใช้การประมาณการเดียวกันเพื่อให้ค่ายังคงถูกต้องสำหรับ Google
Radius @ Equator 6,378,137 เมตรที่แน่นอน (WGS-84)
เส้นรอบวงที่เส้นศูนย์สูตร = 40,075,017 เมตร (2πr)
ระดับการซูม 24 ใช้ 2 ถึง 32 พลังงาน (4,294,967,296) พิกเซลที่เส้นรอบวง
เส้นรอบวงเส้นศูนย์สูตร / 2 32 = .009330692 เมตรต่อพิกเซล
หน่วยที่ละติจูด = (โคไซน์ของละติจูด) X (หน่วยที่เส้นศูนย์สูตร)
ระดับการซูมจะเพิ่มขึ้นทีละสองเท่า
1 ฟุต (นานาชาติ) = 0.3048 เมตร
แก้ไข
มันไม่ใช่คำถามที่ถูกต้องที่จะเริ่มด้วย อัตราส่วนสเกลจะสัมพันธ์กับเอกสารที่พิมพ์ไม่ใช่หน้าจอคอมพิวเตอร์ สิ่งที่คุณต้องการสำหรับภาพเหล่านี้ที่จะใช้กับความแม่นยำใด ๆ คือการรู้ขนาดของแต่ละพิกเซลจากนั้นปรับขนาดภาพตามสิ่งที่คุณซ้อนทับด้วย
ย้อนกลับไปเมื่อ 15-20 ปีก่อนมีคนใช้ WGS-84 เป็นข้อมูลพื้นฐาน (บันทึกในโพสต์ก่อนหน้านี้มีคนใช้ค่า 40,075,160 ฉันเคยเห็นใน Wikipedia มาแล้วไม่กี่แห่งและไม่ถูกต้องค่าที่ถูกต้องคือ 40,075,017
จากนั้นพวกเขาก็เอามันมาหารด้วย 32 บิตเต็ม นี่เป็นตัวเลือกที่สมเหตุสมผลเนื่องจากมีความแม่นยำระดับโลกประมาณหนึ่งเซนติเมตรซึ่งมีมากมายสำหรับภาพถ่ายทางอากาศ จำนวนเต็ม 32 บิตยังมีประสิทธิภาพในการจัดเก็บและประมวลผล
เหตุใดจึงเลือกระดับ 24 นี้ฉันไม่ทราบ แต่เนื่องจากมีคนอื่นที่ทำงานที่นี่ 0 ทำให้คุณมีไทล์ 256 พิกเซลสำหรับโลก
ตอนนี้เป็นตัวอย่างของวิธีการใช้ข้อมูลข้างต้น สมมติว่าฉันมีภาพที่ระดับการซูม 20 (เท่าที่ซูมเท่าที่พวกเขาให้คุณเอาไว้) ใช้ 0.009330692 (ซูม 24 ที่เส้นศูนย์สูตร) เพิ่มเป็นสองเท่าสำหรับการซูม 23 อีกครั้งสำหรับการซูม 22 อีกครั้งสำหรับการซูม 21 และครั้งสุดท้ายสำหรับการซูม 20 ตอนนี้คุณควรมี 0.149231071
ตอนนี้สมมติว่าภาพของเราอยู่ที่ละติจูด 45 ใช้โคไซน์ของนั้น (0.707106781) และคูณด้วย 0.149231071 ของเราและมันจะให้คุณ 0.105564729 เมตร นั่นคือความยาวและความสูงของหนึ่งพิกเซลจากภาพที่ละติจูด 45 ที่ระดับการซูม 20 หากหน้าจอของคุณจับภาพขนาด 1,000x1000 พิกเซลของพื้นที่นั้นมิติคือ 105.56 ตารางเมตร ถ้าคุณต้องการหารหารด้วย 0.3048
ในส่วนของแหล่งข้อมูลฉันได้วิศวกรย้อนกลับเมื่อประมาณ 5 ปีก่อนจากข้อมูลและเอกสารต่างๆที่ฉันพบบนเว็บรวมถึงเว็บไซต์สนับสนุนการทำแผนที่ของ Google และ MS
ฉันใช้เวลานับร้อยและวางซ้อนกับข้อมูลการสำรวจภาคสนามจริงและถูกต้องเสมอ ตรวจสอบกับตารางที่โพสต์ที่นี่และตัวเลขจะตรงกัน
เพิ่งทำการคำนวณและได้ผลลัพธ์ดังนี้
Google Maps แสดงไม้บรรทัด 1 กม. (ด้านล่างซ้ายของแผนที่) ซึ่งมีความยาว 90 พิกเซลที่ระดับการซูม 13 ซึ่งหมายถึงสิ่งต่อไปนี้:
สมมติว่าความละเอียดหน้าจอคือ 96 dpi หรือ 36 dpcm ที่ระดับการซูม 13 เรามี 0.4km (จาก 36/90) ใน 1 ซม. ซึ่งให้มาตราส่วนแผนที่ 1: 40,000 สำหรับหน้าจอ 96dpi
สำหรับการใช้งานบนหน้าจอที่หลากหลายวิธีที่ดีที่สุดคือใช้ 90px เป็นพื้นฐานเนื่องจากตัวเลขทั้งหมดจะถูกปัดเศษในทุกระดับการซูมเช่น
และอื่น ๆ
โปรดทราบว่านี่คือการประมาณที่ควรจะทำงานได้ดีขึ้นหรือน้อยลงในเครื่องชั่งขนาดเล็กมากกว่าเครื่องที่มีขนาดใหญ่
(และ Google ชอบตัวเลขรอบในที่สุด ... )
จากข้อมูลทั้งหมดที่มีให้ฉันได้สร้างฟังก์ชั่นที่ให้ z ที่ดีที่สุดกับแผนที่เมื่อคุณต้องการให้มีเส้นแนวนอนที่แสดงถึง N% ของแผนที่ที่แสดง
แผนที่ที่แสดงนั้นมีความกว้างของพิกเซลเป็นของตัวเอง
function calculateZoom(WidthPixel,Ratio,Lat,Length){
// from a segment Length (km),
// with size ratio of the segment expected on a map (70%),
// with a map WidthPixel width in pixels (100px),
// and a latitude (45°) we can get the best Zoom
// assume earth is a perfect ball with radius : 6,378,137m and
// circumference at the equator = 40,075,016.7 m
// The full world on google map is available in tiles of 256 px;
// it has a ratio of 156543.03392 (px/m).
// For Z = 0;
// pixel scale at the Lat_level is ( 156543,03392 * cos ( PI * (Lat/180) ))
// The map scale increases at the rate of square root of Z.
//
Length = Length *1000; //Length is in Km
var k = WidthPixel * 156543.03392 * Math.cos(Lat * Math.PI / 180); //k = circumference of the world at the Lat_level, for Z=0
var myZoom = Math.round( Math.log( (Ratio * k)/(Length*100) )/Math.LN2 );
myZoom = myZoom -1; // Z starts from 0 instead of 1
//console.log("calculateZoom: width "+WidthPixel+" Ratio "+Ratio+" Lat "+Lat+" length "+Length+" (m) calculated zoom "+ myZoom);
// not used but it could be useful for some: Part of the world size at the Lat
MapDim = k /Math.pow(2,myZoom);
//console.log("calculateZoom: size of the map at the Lat: "+MapDim + " meters.");
//console.log("calculateZoom: world circumference at the Lat: " +k+ " meters.");
return(myZoom);
}
ฉันยังไม่สามารถเพิ่มความคิดเห็นได้ แต่นี่อาจเป็นแหล่งที่มาของคำตอบของ Pete ด้านบน: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[... ] โปรดทราบว่าระดับการซูมที่เพิ่มขึ้นแต่ละครั้งจะมีขนาดใหญ่เป็นสองเท่าในทิศทาง x และ y ดังนั้นระดับการซูมที่สูงขึ้นแต่ละครั้งจะมีความละเอียดมากกว่าระดับก่อนหน้าถึงสี่เท่า ตัวอย่างเช่นที่ระดับการซูม 1 แผนที่จะประกอบด้วยไทล์ 4 256x256 พิกเซลทำให้เกิดพื้นที่พิกเซลจาก 512x512 ที่ระดับการซูม 19 แต่ละค่า x และ y พิกเซลบนแผนที่สามารถอ้างอิงได้โดยใช้ค่าระหว่าง 0 ถึง 256 * 2 19
ฉันคำนวณเครื่องชั่งสำหรับสี่ระดับการซูม:
ระดับการซูม มาตราส่วน 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
ดูเหมือนว่าสเกลจะเพิ่มเป็นสองเท่าเมื่อระดับการซูมเพิ่มขึ้นหนึ่งขั้น ดังนั้นฉันหวังว่าสเกลสำหรับระดับการซูม 16 จะเป็น 1: 8000 และต่อไป
สวัสดีฉันคิดว่าฉันได้คำนวณว่า 1pixel = 11.627km เป็นเส้นตรง ไม่คำนึงถึงรัศมีของโลก นี่คือการเชื่อมโยงของวิดีโอที่อธิบายวิธี: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be หวังว่าจะล้างใจของคุณ
Zoom level set meters: ${meters}
); var zoomfactor = 1; ถ้า (เมตร <1128) {zoomfactor = 15; } อื่นถ้า ((เมตร> 1128) && (เมตร <2256)) {zoomfactor = 14; } อื่นถ้า ((เมตร> 2256) && (เมตร <4513)) {zoomfactor = 13; } อื่นถ้า ((เมตร> 4513) && (เมตร <9027)) {zoomfactor = 12; } อื่นถ้า ((เมตร> 9027) && (เมตร <18055)) {zoomfactor = 11; } อื่นถ้า ((เมตร> 18055) && (เมตร <36111)) {zoomfactor = 10; } อื่นถ้า ((เมตร> 36111) && (เมตร <72