Ответы:
Если вы проектируете карту, которую планируете наложить на карты 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 пикселей на дюйм (PPI). Это означает, что 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. Я должен рассмотреть вопрос о том, чтобы начать с уровня 1 для расчета с помощью Google Maps?
Не так просто. Учитывая проекцию, размер пикселей мозаичного изображения зависит от широты области, которая вас интересует. Затем с точки зрения преобразования размера пикселя мозаичного изображения в размер пикселя экрана, это зависит от экрана и разрешения, при котором отображаются данные, точек на дюйм ваш экран использует.
Прямой авторитетный правильный ответ:
591657550.500000 / 2^(level-1)
это дает вам таблицу выше, ввод уровня масштабирования.
Попробуйте вживую на jsfiddle.net
Поскольку вопрос касается только Google MAPS, а не EARTH, OP не заботится о трехмерной геометрии. Карты Google УЖЕ выровнены, поэтому 1 пиксель всегда на одном и том же расстоянии (в градусах, что относится к карте Google), здесь и в экваторе, как на полюсах.
Кстати, вы поняли, что где-то внутри первого ряда пикселей карты мира масштаб составляет 1: 1?
Такая таблица есть в документации по системе листов Virtal Earth от Microsoft . Но, как сказал GuillaumeC, значения зависят от широты и разрешения экрана. В таблице приведены значения, измеренные на экваторе и с разрешением экрана 96 точек на дюйм.
PS: Не уверен в этом, но уровни масштабирования от Microsoft могут быть смещены на 1 по сравнению с уровнями масштабирования от Google. Но они определенно используют одну и ту же проекцию, поэтому значения остаются правильными для Google.
Радиус @ Экватор 6 378 137 метра (WGS-84)
Oкружность экватора = 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) Я видел это в Википедии в нескольких местах, и это неверно. Правильное значение - 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. Если вы снимаете с экрана изображение этой области размером 1000 x 1000 пикселей, его размер составляет 105,56 квадратных метра. Если вы хотите, чтобы ноги разделили это 0,3048
Что касается источников, то я, по сути, 5 лет назад обратил внимание на различную информацию и документацию, которые я нашел в Интернете, включая сайты поддержки картографов Google и MS.
Я использовал эту сотню времени и наложил ее на данные полевых исследований, и это всегда было правильно. Сравните это с любыми таблицами, размещенными здесь, и числа будут совпадать.
Просто сделал несколько расчетов и получил следующие результаты:
На Картах Google показана линейка длиной 1 км (слева внизу от карты), длина которой составляет 90 пикселей при уровне масштабирования 13. Это означает следующее:
Предполагая, что разрешение экрана составляет 96 точек на дюйм или 36 точек на дюйм, при уровне масштабирования 13 мы имеем 0,4 км (от 36/90) на 1 см, что дает масштаб карты 1: 40000 для экрана с разрешением 96 точек на дюйм.
Для различных операций на экране лучше всего взять 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);
}
Я еще не могу добавить комментарий, но это возможный источник ответа Пита выше: 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 и так далее.
Привет, я думаю, что я рассчитал, что 1 пиксель = 11.627 км по прямой; без учета радиуса земли. Вот ссылка на видео, объясняющая как: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Надеюсь, что очистить ваш разум.
Zoom level set meters: ${meters}
); var zoomfactor = 1; if (метров <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