Відповіді:
Якщо ви розробляєте карту, яку плануєте накладати на карти 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 - це, мабуть, було найточнішим:
Це не буде точно, оскільки роздільна здатність карти з проекцією Меркатора (як-от карти Google) залежить від широти.
Можна розрахувати за цією формулою:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Це ґрунтується на припущенні, що радіус Землі дорівнює 6378137м. Яке значення ми використовуємо :)
взято з: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
До речі, я здогадуюсь, що:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Щоб зрозуміти математику (не точний розрахунок, це лише для ілюстрації):
скажімо, монітор комп'ютера має 100 пікселів на дюйм (ІЦВ). Це означає, що 256 пікселів мають приблизно 6,5 см довжини. І це 0,065 м .
на рівні 0 масштабування в одній плитці видно цілі 360 градусів довготи . Ви не можете спостерігати це на Картах Google, оскільки він автоматично переміщується до рівня збільшення 1, але ви можете бачити його на карті OpenStreetMap (він використовує ту саму схему плитки).
360 спусків на екваторі дорівнюють окружності Землі 40,075,16 км, що становить 40075160 м
розділіть 40075160 м на 0,065 м, і ви отримаєте 616313361 , що є шкалою рівня 0 на Екваторі для монітора комп’ютера зі 100 DPI
Також перевірте: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
є рівень 0 відповідно до цієї відповіді. Але згідно з @CaptDragon це рівень 1. Я повинен розглянути, починаючи з першого рівня, щоб обчислити за допомогою Google Maps?
Не так просто. Враховуючи проекцію, розмір пікселів плитки залежить від широти області, яка вас цікавить. Тоді, з точки зору перетворення розміру пікселя плитки в розмір пікселя екрана, це залежить від екрану та роздільної здатності відображаються даних, dpi, який використовується на екрані.
Відверта авторитетна правильна відповідь:
591657550.500000 / 2^(level-1)
він дає вам таблицю вище, вводячи рівень збільшення.
Спробуйте в прямому ефірі на jsfiddle.net
Оскільки питання стосується лише Google MAPS, а не EARTH, ОП не хвилює 3D-геометрію. Карти Google ВИНАГО сплющені, тому 1 піксель - це завжди однакова відстань (у DEGREES, що стосується карти Google), тут і в екваторі, як і на полюсах.
До речі, ви зрозуміли, що десь усередині першого піксельного ряду карти світу масштаб становить 1: 1?
Є така таблиця в документації системи плитки Virtal Earth від Microsoft . Але, як сказав GuillaumeC, значення залежать від широти та роздільної здатності екрана. У таблиці наведені значення, виміряні в екваторі та з роздільною здатністю екрана 96 dpi.
PS: Не впевнений у цьому, але рівень масштабування від Microsoft може бути зміщений на 1 порівняно з рівнем масштабування від Google. Але вони однозначно використовують ту саму проекцію, щоб значення залишалися правильними для Google.
Радіус @ екватор 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 за базові дані. .
Потім вони взяли це і поділили його повним 32-бітовим цілим числом. Це логічний вибір, оскільки він дає глобальну точність приблизно до одного сантиметра, що є достатньою для повітряних знімків. 32-бітні цілі числа також ефективні для зберігання та обробки.
Чому був обраний такий рівень 24, я не знаю, однак, коли хтось тут працював 0, це зводить вас до однієї плитки на 256 пікселів для землі.
Тепер для прикладу використання вищезазначених даних. Скажімо, у мене є зображення на рівні 20 масштабування (настільки, наскільки воно наразі дозволяє вам отримати) Візьміть 0,009330692 (Масштаб 24 на екваторі) подвійно його для збільшення 23, знову для збільшення 22, знову для збільшення 21 і останній раз для збільшення 20 Тепер у вас повинно бути 0,149231071.
Тепер скажемо, що наше зображення знаходиться на широті 45. Візьміть косинус цього (0.707106781) і помножте його на наш 0.149231071, і він дасть вам 0.105564729 метрів. Це довжина і висота одного пікселя від зображення на широті 45 при рівні масштабу 20. Якщо ви знімаєте на екрані зображення 1000 x 1000 пікселів цієї області, розмір дорівнює 105,56 метрів квадратних. Якщо ви хочете, ноги розділіть, що 0,3048
Що стосується джерел, я, по суті, звернувся до інженера близько 5 років тому з різних інформаційних та документаційних даних, які я знайшов в Інтернеті, включаючи веб-сайти підтримки Google та MS для картографування.
Я використовував цю сотню часу і перекривав її фактично даними на місцях, і це завжди було правильним. Перевірте це проти будь-яких таблиць, розміщених тут, і цифри будуть відповідати.
Щойно зробили кілька розрахунків і отримали такі результати:
Google Maps показує лінійку розміром 1 км (внизу зліва від карти), довжиною якої є 90 пікселів, на рівні масштабу 13. Що означає наступне:
Якщо припустити, що роздільна здатність екрана становить 96 dpi або 36 dpcm, на рівні зуму 13 ми маємо 0,4 км (від 36/90) в 1 см, що дає масштаб карти 1: 40 000 для екрана 96 dpi.
Для різних операцій на екрані найкраще взяти за основу 90 пікселів, оскільки всі цифри будуть круглими на всіх рівнях збільшення, тобто
і так далі.
Зауважте, що це наближення, яке має працювати більш-менш добре на менших масштабах, а не на великих.
(І в кінцевому підсумку 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);
}
Я поки не можу додати коментар, але це можливе джерело відповіді Піта вище: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinate
[...] зауважте, що кожен збільшуючий рівень масштабування вдвічі більший у напрямку x і y. Тому кожен вищий рівень масштабування містить у чотири рази більше роздільну здатність, ніж попередній рівень. Наприклад, при рівні масштабу 1 карта складається з 4 плиток 256х256 пікселів, в результаті чого піксельний простір становить 512х512. При рівні масштабу 19 кожен піксель x і y на карті може бути посилається, використовуючи значення від 0 до 256 * 2 19
Я обчислив шкалу для чотирьох рівнів масштабування:
Рівень масштабу | Масштаб 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Здається, що масштаб подвоюється, коли рівень збільшення збільшується на один крок. Тож я сподіваюся, що масштаб для рівня 16 буде масштабуватись 1: 8000 тощо.
Привіт, я думаю, я підрахував, що 1піксель = 11,627км прямолінійно; не враховуючи радіус землі. Ось посилання відео, яке пояснює, як: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Сподіваюся, що прояснить ваш розум.
Zoom level set meters: ${meters}
); var zoomfactor = 1; якщо (метри <1128) {zoomfactor = 15; } else if ((метри> 1128) && (метри <2256)) {zoomfactor = 14; } else if ((метри> 2256) && (метри <4513)) {zoomfactor = 13; } else if ((метри> 4513) && (метри <9027)) {zoomfactor = 12; } else if ((метри> 9027) && (метри <18055)) {zoomfactor = 11; } else if ((метри> 18055) && (метри <36111)) {zoomfactor = 10; } else if ((метрів> 36111) && (метрів <72