Kan noen gi meg en lenke (eller noen detaljer) om det faktiske forholdet til «zoomnivå» -tallene for Google Maps?
f.eks Google Maps nivå 13 = 1: 20000
Kommentarer
- Basert på den første informasjonen jeg laget denne funksjonen, kan noen kanskje bruke den! funksjonssettZoomLevel (meter) {//console.log(
Zoom level set meters: ${meters}
); var zoomfaktor = 1; hvis (meter < 1128) {zoomfactor = 15; } annet hvis ((meter > 1128) & & (meter < 2256)) {zoomfactor = 14; } annet hvis ((meter > 2256) & & (meter < 4513)) {zoomfactor = 13; } annet hvis ((meter > 4513) & & (meter < 9027)) {zoomfactor = 12; } annet hvis ((meter > 9027) & & (meter < 18055)) {zoomfactor = 11; } annet hvis ((meter > 18055) & & (meter < 36111)) {zoomfactor = 10; } annet hvis ((meter > 36111) & & (meter < 72
Svar
Hvis du designer et kart, planlegger du å legge det over over google maps eller virtual earth og lage et teglskjema, så tror jeg det du leter etter er skalaene for hvert zoomnivå, bruk disse:
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
Kilde : http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Kommentarer
- @capdragon Takk. Det ‘ er en kjent kilde (ESRI), men det etterlater oss fortsatt å lure på hvordan de kom opp med disse skalaene.
- Rasjonelt er kritisk for hvem? Jeg ser ikke ‘ ikke omtale av rasjonell i spørsmålet. Jeg tror han vil ha et rett frem svar på sitt rette spørsmål.
- @ cap Uten grunn er det ‘ vanskelig eller umulig å skille et riktig svar fra en feil. Uten grunn er man igjen å måtte stole på autoriteten til svareren. Jeg ‘ er ganske sikker på at grunnen til at de andre svarene i denne tråden blir stemt opp og din ikke er ‘ t har lite å gjøre med korrekthet eller rettferdighet – din er den mest autoritative og greie av gjengen – men har heller alt å gjøre med resonnementet fra de andre. BTW Jeg har ikke ‘ t nedstemt din.
- Takk: +1. Dere er sannsynligvis geografer eller fjernmåler-guruer. Jeg ‘ er bare en GIS-utvikler som vil hjelpe fyren med å nå svaret. En kollega av meg (PHD-type, dobbel MIT-dur) går inn i en times forelesning hver gang jeg stiller ham et enkelt spørsmål og mister meg underveis. Jeg stiller ikke ‘ spørsmål lenger (jeg har en mastergrad i vitenskap). Jeg forstår at andre mennesker liker å komme inn i kjøttet av rasjonelle og så videre, men mange av oss er for uvitende til å vite hva de snakker om. IMHO de var forvirrende svar som ikke ‘ t svarte på spørsmålet hans.
- Vektene ble valgt slik at de kan deles jevnt med rasterfliser som er i base 2 , (f.eks. 128, 512 …). Bing gjør det på samme måte msdn.microsoft.com/en-us/library/bb259689.aspx
Svar
Jeg fant dette svaret – skrevet av en Google-ansatt – dette ville trolig være den mest nøyaktige:
Dette vil ikke være nøyaktig, fordi oppløsningen til et kart med mercatorprojeksjonen (som Google maps) er avhengig av breddegraden.
Det er mulig å beregne ved hjelp av denne formelen:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Dette er basert på antagelsen om at jordens radius er 6378137m. Hvilken er verdien vi bruker 🙂
hentet fra: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW – Jeg gjetter at:
"latLng.lat()" = map.getCenter().lat() "zoom" = map.getZoom()
Kommentarer
- HVA tilsvarer formelen din? Gjør det for lat = 2.92 og zoom 13 fikk jeg 19.08. Hva er 19.08 hva?
- @Rodrigo meter per piksel
- Jeg kan vitne om at dette svaret fremdeles er riktig og veldig nøyaktig tre år senere. Dette bør være det aksepterte svaret.
- Gjelder dette bare x eller også y ? Bruker Google Maps via Javascript API samme skala for begge akser?
- @ OldGeezer Ja, det fungerer i alle retninger. Lineær forvrengning til enhver tid i Mercator er lik i alle retninger. At ‘ er en av grunnene til at den blir brukt til glatte kart. Når du zoomer inn får du et rimelig lite forvrengningskart. når du kompenserer for skala, er det dette svaret gjør.
Svar
For å hjelpe deg med å forstå matematikken (ikke en nøyaktig beregning, det er bare for illustrasjon):
- Googles nettkartflis har 256 piksler med bredde
-
la oss si din dataskjerm har 100 piksler per tomme (PPI). Det betyr at 256 piksler er omtrent 6,5 cm lange. Og at «s 0,065 m .
-
på zoomnivå 0 , hele 360 grader av lengdegrad er synlige i en enkelt flis . Du kan ikke observere dette på Google Maps, siden det automatisk flyttes til zoomnivå 1, men du kan se det på OpenStreetMap «kart (det bruker samme fliseskjema
-
360 nedgang på ekvator er lik jordens omkrets, 40.075,16 km, som er 40075160 m
-
del 40075160 m med 0,065 m og du får 616313361 , som er en skala for zoomnivå 0 på ekvator for en dataskjerm med 100 DPI
- så poenget er at skalaen avhenger av skjermens PPI og av breddegraden (på grunn av Mercator-projeksjonen)
- for zoomnivå 1, skalaen er halvparten av zoomnivået 0
- …
- for zoomnivå N, skalaen er en hal f av zoomnivået N-1
Sjekk også ut: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
Kommentarer
- Skalaen er faktisk avhengig av DPI for de genererte kartbildene. De to mest brukte oppløsningene er 96DPI (at ‘ er hva Google-kartfliser er) og 72DPI.
- Med 96DPI er skalaen
591657550.500000
er nivå 0 i henhold til dette svaret. Men ifølge @CaptDragon er nivå 1. Jeg bør vurdere å starte fra nivå 1 for å beregne med Google Maps?
Svar
Ikke så lett. Gitt projeksjonen, avhenger størrelsen på flisepikslene av breddegraden til området du er interessert i. Når det gjelder å transformere flisepikselstørrelse i skjermpikselstørrelse, avhenger det av skjermen og oppløsningen dataene vises, dpi skjermen bruker.
Kommentarer
- Det er riktig, sfærisk mercator (google projeksjon) ‘ t bevare like stor skala når du beveger deg bort fra ekvator. For noen gode referanser: Mapnik ‘ s Skala- og skaleringsnevnere artikkel: trac.mapnik.org/wiki/ScaleAndPpi og OSM ‘ s FAQ: wiki.openstreetmap.org/ wiki / …
Svar
Enkelt autoritativt riktig svar:
591657550.500000 / 2^(level-1)
det gir deg tabellen ovenfor, angir zoomnivået.
Prøv det live på jsfiddle.net
Fordi spørsmålet bare er for Google MAPS, ikke EARTH, bryr OP seg ikke om 3D-geometri. Google maps er allerede flatt, så 1 piksel er alltid den samme avstanden (i DEGREES, som er det som gjelder et google-kart), her og i ekuatoren som i polene.
Forresten, gjorde du innser at et sted innenfor den første pikselraden på et verdenskart, er skalaen 1: 1?
Kommentarer
- Hva betyr tallet 591657550.500000 representere?
- @Sergio hvorfor ikke bare 591657550.5?
- » Tallet kommer fra at flisoppløsningen er satt til et multiplum på 256 piksler, og fra skjermoppløsningen (96dpi) » gis.stackexchange.com/a/111589/ 92997
- Fungerer ikke – det avhenger av Latitude, men formelen din er ikke
Svar
Det er en slik tabell i dokumentasjonen til Virtal Earth Tile System fra Microsoft . Men som sagt av GuillaumeC, avhenger verdiene av breddegrad og videre skjermoppløsningen. Tabellen gir verdier målt ved ekvator og med en skjermoppløsning på 96 dpi.
PS: Ikke sikker på det, men zoomnivåene fra Microsoft kan være forskjøvet med 1 sammenlignet med zoomnivåene ved Google.Men de bruker definitivt den samme projeksjonen slik at verdiene forblir riktige for Google.
Svar
Radius @ Equator 6.378.137 meter nøyaktig ( WGS-84)
Omkrets ved ekvator = 40.075.017 meter (2πr)
Zoomnivå 24 bruker 2 til 32 kraft (4.294.967.296) piksler ved omkrets.
Ekvatorial omkrets / 2 32 = .009330692 meter per piksel
Enhet i breddegrad = (Cosine of Latitude) X (Enhet ved ekvator)
Zoomnivå dobler hvert trinn.
1 fot (internasjonal) = 0,3048 meter
Rediger
Vel, det er egentlig ikke et legitimt spørsmål til å begynne med. Skaleforhold er relativt til trykte dokumenter, ikke dataskjermer. Det du trenger for at disse bildene skal brukes med en hvilken som helst nøyaktighet, er å vite dimensjonen til hver piksel og deretter skalere bildet i henhold til hva du legger på det.
Så for 15-20 år siden tok noen WGS- 84 som basisdata. (merknad i et tidligere innlegg brukte noen en verdi på 40.075.160 Jeg har sett dette på Wikipedia noen få steder, og det er feil. Den riktige verdien er 40,075,017
De tok det og delte det med en full 32-biters heltall. Dette er et logisk valg, da det gir global nøyaktighet til omtrent en centimeter, noe som er nok for luftbilder. 32-biters heltall er også effektive å lagre og behandle.
Hvorfor dette er nivå 24 ble valgt Jeg vet imidlertid ikke ettersom noen andre her trente 0 får deg ned til en 256 pixel flis for jorden.
Nå for et eksempel på hvordan du bruker dataene ovenfor. La oss si at jeg har et bilde på zoomnivå 20 (så zoomet som de for øyeblikket lar deg få) Ta 0.009330692 (Zoom 24 ved ekvator) doble den for zoom 23, igjen for zoom 22, igjen for zoom 21 og en siste gang for zoom 20. Du bør nå ha 0.149231071 .
La oss si at bildet vårt er på breddegrad 45. Ta Cosine av det (0,707106781) og multipliser det med vår 0,149231071, og det vil gi deg 0,105564729 meter s. Det er lengden og høyden på en piksel fra et bilde på breddegrad 45 på zoomnivå 20. Hvis du tar et 1000 x 1000 piksler bilde av dette området, er dimensjonen 105,56 meter kvadratisk. Hvis du vil ha føtter, del det 0,3048
Når det gjelder kilder, snudde jeg essensiell ingeniør for omtrent 5 år siden fra forskjellige informasjons- og dokumentasjonsmuligheter jeg fant på nettet, inkludert støttesider for Google og MS-kartlegging.
Jeg har brukt hundrevis av tid og lagt det med faktiske feltundersøkelsesdata, og det har alltid vært riktig. Sjekk det mot noen av tabellene som er lagt ut her, så vil tallene stemme overens.
Kommentarer
- I ‘ jeg er ikke sikker på hvordan dette svarer på spørsmålet.
- Jeg er enig med @Devdatta, kan du gi en kilde og litt sammenheng.
- Ikke sikker på om disse kommentarene var før eller etter rediger, men jeg brukte dette svaret, og det fungerer bra
Svar
Bare gjorde noen beregninger og fikk følgende resultater:
Google Maps viser en linjal på 1 km (nederst til venstre på kartet) som er 90 piksler i lengde, på zoomnivå 13. Hvilket betyr følgende:
Forutsatt skjermoppløsningen er 96 dpi eller 36 dpcm, på zoomnivå 13 har vi 0,4 km (fra 36/90) i 1 cm, noe som gir kartskala på 1: 40 000 for en 96 dpi skjerm.
For forskjellige operasjoner på skjermen det beste er å ta 90px som basis, da alle tallene vil være runde på alle zoomnivåer, dvs.
- Zoomnivå 12: 2km i 90px
- Zoomnivå l 11: 4km i 90px
- Zoomnivå 10: 8km i 90px
og så videre.
Merk at dette er en tilnærming som skal fungerer mer eller mindre fint på mindre skalaer i stedet for store.
(Og Google liker runde tall til slutt …)
Kommentarer
- Hvis du ser nøye etter, vil du ‘ oppdage at lengden på linjen endres avhengig av breddegraden til området du ‘ re viewing.
- Dette er bare gyldig på en bestemt breddegrad, som @rcoup nevnte. Ikke bare lengden på skalaen varierer, men også avstanden den representerer. For å fortsette dette eksemplet ved zoom 13 er avstanden representert ved skaleringslinjen 2 km i Nordkapp (71 ° breddegrad), 1 km rundt 45 ° breddegrad og 500 m ved ekvator.
Svar
Basert på all den oppgitte informasjonen , Jeg har bygget en funksjon som gir best z brukt på et kart når du vil ha en horisontal linje som representerer N% av det viste kartet.
Det viste kartet er preget av sin egen pikselbredde.
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); }
Svar
Jeg kan ikke legge til en kommentar ennå, men dette er en mulig kilde til Petes svar ovenfor: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[…] merk at hvert økende zoomnivå er dobbelt så stort i både x- og y-retningen. Derfor inneholder hvert høyere zoomnivå fire ganger så mye oppløsning som det foregående nivået. For eksempel, på zoomnivå 1, består kartet av 4 256×256 piksler, noe som resulterer i et pikselrom fra 512×512. På zoomnivå 19 kan det vises til hver x- og y-piksel på kartet ved hjelp av en verdi mellom 0 og 256 * 2 19
Svar
Jeg beregnet skalaene for fire zoomnivåer:
Zoomnivå | Skala 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Det ser ut til at skalaen er doblet ettersom zoomnivået økte med ett trinn. Så jeg håper skalaen for zoomnivå 16 blir 1: 8000 og så videre.
Kommentarer
- Velkommen til GIS.SE! Kan du oppgi en kilde, eller hvordan ble dette beregnet?
Svar
Hei, jeg tror jeg har beregnet det 1piksel = 11,627km i rett linje; ikke tar hensyn til jordens radius. Her lenken til videoen som forklarer hvordan: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Håper det gjør deg klar.
Kommentarer
- Det gjør det ikke. Verdien på en piksel avhenger av breddegrad.
- Åh, ikke så komplisert jeg gikk inn i.