Odpowiedzi:
Jeśli projektujesz mapę, którą planujesz nałożyć na mapy Google lub wirtualną ziemię i tworzysz schemat kafelkowania, to myślę, że szukasz skal dla każdego poziomu powiększenia, użyj tych:
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
Źródło: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Znalazłem tę odpowiedź - napisaną przez pracownika Google - prawdopodobnie byłaby najdokładniejsza:
Nie będzie to dokładne, ponieważ rozdzielczość mapy z rzutowaniem mercatora (jak mapy Google) zależy od szerokości geograficznej.
Można obliczyć za pomocą tego wzoru:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Jest to oparte na założeniu, że promień ziemi wynosi 6378137 m. Jakiej wartości używamy :)
pochodzi z: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW - Zgaduję, że:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Aby pomóc Ci zrozumieć matematykę (nie jest to dokładne obliczenie, to tylko dla ilustracji):
powiedzmy, że monitor komputera ma 100 pikseli na cal (PPI). Oznacza to, że 256 pikseli ma około 6,5 cm długości. A to 0,065 m .
na poziomie powiększenia 0 całe 360 stopni długości geograficznej jest widoczne w jednym kafelku . Nie można tego zaobserwować w Mapach Google, ponieważ automatycznie przechodzi ono do poziomu powiększenia 1, ale można to zobaczyć na mapie OpenStreetMap (używa tego samego schematu kafelkowania).
360 stopni na równiku jest równych obwodowi Ziemi, 40 075,16 km, czyli 40075160 m
podzielić 40075160 m do 0,065 m , a dostaniesz 616313361 , który jest skala poziomu powiększenia 0 na równiku na monitorze komputera przy 100 DPI
Sprawdź także: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
wynosi Poziom 0 zgodnie z tą odpowiedzią. Ale według @CaptDragon jest Poziom 1. Powinienem rozważyć rozpoczęcie od poziomu 1, aby obliczyć za pomocą Google Maps?
Nie tak łatwo. Biorąc pod uwagę rzut, rozmiar pikseli kafelka zależy od szerokości geograficznej interesującego cię obszaru. Następnie, jeśli chodzi o przekształcanie rozmiaru piksela kafelka w rozmiar piksela ekranu, zależy to od ekranu i rozdzielczości wyświetlanych danych, dpi używa twojego ekranu.
Prosta, wiarygodna poprawna odpowiedź:
591657550.500000 / 2^(level-1)
daje powyższą tabelę, wprowadzając poziom powiększenia.
Wypróbuj na żywo na jsfiddle.net
Ponieważ pytanie dotyczy tylko Google MAPS, a nie ZIEMI, OP nie dba o geometrię 3D. Mapy Google są JUŻ spłaszczone, więc 1 piksel jest zawsze tej samej odległości (w STOPNIACH, co dotyczy mapy google), tutaj iw ekwatorze, jak na biegunach.
Nawiasem mówiąc, czy zdałeś sobie sprawę, że gdzieś w pierwszym rzędzie pikseli mapy świata skala wynosi 1: 1?
Taka tabela znajduje się w dokumentacji systemu Virtal Earth Tile System firmy Microsoft . Ale jak powiedział GuillaumeC, wartości zależą od szerokości geograficznej i rozdzielczości ekranu. Tabela podaje wartości zmierzone na równiku i przy rozdzielczości ekranu 96 dpi.
PS: Nie jestem tego pewien, ale poziomy powiększenia przez Microsoft mogą być przesunięte o 1 w porównaniu do poziomów powiększenia przez Google. Ale ostatecznie używają tej samej projekcji, aby wartości pozostały prawidłowe dla Google.
Promień @ Equator Dokładnie 6,378,137 metrów (WGS-84)
Obwód równika = 40,075,017 metrów (2πr)
Poziom powiększenia 24 wykorzystuje 2 do 32 pikseli mocy (4 294 967 296) pikseli na obwodzie.
Obwód równikowy / 2 32 = .009330692 metrów na piksel
Jednostka na szerokości geograficznej = (cosinus szerokości geograficznej) X (jednostka na równiku)
Poziom powiększenia podwaja każdy przyrost.
1 stopa (międzynarodowa) = 0,3048 metra
Edytować
Cóż, to naprawdę nie jest uzasadnione pytanie na początek. Współczynniki skali odnoszą się do wydrukowanych dokumentów, a nie ekranów komputerowych. Aby obrazy te były używane z dowolną dokładnością, musisz znać wymiary każdego piksela, a następnie skalować obraz zgodnie z tym, na co go nakładasz.
15-20 lat temu ktoś wziął WGS-84 jako dane podstawowe. (uwaga w poprzednim poście ktoś użył wartości 40.075.160 Widziałem to w Wikipedii w kilku miejscach i jest to niepoprawne. Prawidłowa wartość to 40,075,017
Następnie wzięli to i podzielili przez pełną 32-bitową liczbę całkowitą. Jest to logiczny wybór, ponieważ zapewnia globalną dokładność do około jednego centymetra, co wystarcza na zdjęcia lotnicze. 32-bitowe liczby całkowite są również wydajne do przechowywania i przetwarzania.
Dlaczego wybrano poziom 24, nie wiem jednak, ponieważ ktoś tutaj tutaj opracował 0, prowadzi cię do jednego 256-pikselowego kafelka dla Ziemi.
Teraz na przykład, jak korzystać z powyższych danych. Powiedzmy, że mam obraz na poziomie powiększenia 20 (tak powiększonym, jak to obecnie pozwalają) Zrób 0,009330692 (Powiększ 24 na równiku) dwukrotnie dla powiększenia 23, ponownie dla powiększenia 22, ponownie dla powiększenia 21 i ostatni raz dla powiększenia 20 Powinieneś teraz mieć 0.149231071.
Powiedzmy teraz, że nasz obraz znajduje się na 45. szerokości geograficznej. Weź Cosinus tego (0,707106781) i pomnóż go przez 0,149231071, a da ci 0,0556564729 metrów. Jest to długość i wysokość jednego piksela od obrazu na 45 szerokości geograficznej przy poziomie powiększenia 20. Jeśli wykonasz zrzut ekranu o rozmiarze 1000 x 1000 pikseli tego obszaru, jego wymiary wynoszą 105,56 metra kwadratowego. Jeśli chcesz, stopy dzielą to 0,3048
Jeśli chodzi o źródła, około 5 lat temu byłem inżynierem inżynierii odwrotnej na podstawie różnych informacji i dokumentacji, które znalazłem w sieci, w tym stron wsparcia map Google i MS.
Wykorzystałem tę setkę czasu i nałożyłem ją na dane z badań terenowych i zawsze były one poprawne. Porównaj to z dowolną tabelą zamieszczoną tutaj, a liczby będą pasować.
Właśnie wykonałem kilka obliczeń i uzyskałem następujące wyniki:
Mapy Google pokazują linijkę 1 km (u dołu po lewej stronie mapy) o długości 90 pikseli na poziomie powiększenia 13. Co oznacza:
Zakładając, że rozdzielczość ekranu wynosi 96 dpi lub 36 dpcm, na poziomie powiększenia 13 mamy 0,4 km (od 36/90) na 1 cm, co daje skalę mapy 1: 40 000 dla ekranu 96dpi.
W przypadku różnych operacji na ekranie najlepiej jest przyjąć 90 pikseli jako podstawę, ponieważ wszystkie liczby będą okrągłe na wszystkich poziomach powiększenia, tj.
i tak dalej.
Zauważ, że jest to przybliżenie, które powinno działać mniej więcej dobrze na mniejszych skalach niż na dużych.
(A Google lubi okrągłe liczby na końcu ...)
Na podstawie wszystkich dostarczonych informacji zbudowałem funkcję, która daje najlepsze z zastosowane do mapy, gdy chcesz mieć poziomą linię reprezentującą N% wyświetlanej mapy.
Wyświetlana mapa charakteryzuje się własną szerokością pikseli.
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);
}
Nie mogę jeszcze dodać komentarza, ale jest to możliwe źródło powyższej odpowiedzi Pete'a: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] zauważ, że każdy rosnący poziom powiększenia jest dwa razy większy zarówno w kierunku x, jak i y. Dlatego każdy wyższy poziom powiększenia zawiera czterokrotnie większą rozdzielczość niż poziom poprzedni. Na przykład na poziomie powiększenia 1 mapa składa się z 4 kafelków 256 x 256 pikseli, co daje przestrzeń pikselową od 512 x 512. Na poziomie powiększenia 19 do każdego piksela xiy na mapie można odwoływać się przy użyciu wartości od 0 do 256 * 2 19
Obliczyłem skale dla czterech poziomów powiększenia:
Poziom powiększenia | Skala 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Wydaje się, że skala jest podwojona wraz ze wzrostem stopnia powiększenia o jeden krok. Mam więc nadzieję, że skala dla poziomu powiększenia 16 wyniesie 1: 8000 i tak dalej.
Cześć. Myślę, że obliczyłem, że 1 piksel = 11,627 km w linii prostej; nie biorąc pod uwagę promienia ziemi. Oto link wideo wyjaśniający, jak: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Mam nadzieję, że to oczyści twój umysł.
Zoom level set meters: ${meters}
); var zoomfactor = 1; if (metry <1128) {współczynnik powiększenia = 15; } else if ((metry> 1128) && (metry <2256)) {zoomfactor = 14; } else if ((metry> 2256) i& (metry <4513)) {zoomfactor = 13; } else if ((metry> 4513) i& (metry <9027)) {zoomfactor = 12; } else if ((metry> 9027) && (metry <18055)) {zoomfactor = 11; } else if ((metry> 18055) i& (metry <36111)) {zoomfactor = 10; } else if ((metry> 36111) i& (metry <72