Yanıtlar:
Eğer google maps veya sanal dünyaya bindirmeyi planladığınız ve bir döşeme şeması oluşturmayı planladığınız bir harita tasarlıyorsanız, aradığınızı her zoom seviyesi için ölçekler olduğunu düşünüyorum.
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
Kaynak: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Bu yanıtı buldum - bir Google çalışanı tarafından yazıldı - bu muhtemelen en doğru olanı olurdu:
Bu doğru olmaz, çünkü mercator projeksiyonu ile bir haritanın çözünürlüğü (Google maps gibi) enlemlere bağlıdır.
Bu formülü kullanarak hesaplamak mümkündür:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Bu, dünyanın yarıçapının 6378137 m olduğu varsayımına dayanmaktadır. Kullandığımız değer hangisi :)
https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM adresinden alınmıştır.
BTW - Tahmin ediyorum ki:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Matematiği anlamanıza yardımcı olmak için (kesin bir hesaplama değil, sadece örnekleme içindir):
Diyelim ki bilgisayar monitörünüz inç başına 100 piksel (ÜFE) değerine sahip. Bu, 256 pikselin kabaca 6,5 cm uzunluğunda olduğu anlamına gelir. Ve bu 0,065 m .
ilgili zum düzeyinde 0 , boylam bütün 360 derece görebilir tek karoda . Bunu Google Haritalar’da gözlemleyemezsiniz, çünkü otomatik olarak 1 nolu zoom seviyesine hareket eder, ancak OpenStreetMap’in haritasında görebilirsiniz (aynı döşeme şemasını kullanır).
Ekvator'daki 360 derece, 40075160 m olan 40.075.16 km olan Dünya'nın çevresine eşittir.
bölmek 40075160 m ile 0.065 m ve alacağınız 616313361 yakınlaştırma düzeyinde 0 bir ölçek olduğunu 100 DPI bir bilgisayar monitörü için Ekvator üzerinde
Ayrıca kontrol edin: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
bu cevaba göre Seviye 0'dır. Ancak @CaptDragon'a göre Seviye 1'dir. Google Haritalar ile hesaplamak için 1. seviyeden başlamayı düşünmeliyim?
O kadar kolay değil. Yansıtma göz önüne alındığında, döşeme piksellerinin boyutu, ilgilendiğiniz alanın enlemesine bağlıdır. Ardından, döşeme pikselinin boyutunu ekran piksel boyutuna dönüştürmek açısından, ekrana ve verilerin görüntülendiği çözünürlüğe bağlıdır. dpi ekran kullanıyor.
Anlaşılır yetkili doğru cevap:
591657550.500000 / 2^(level-1)
Yakınlaştırma seviyesine girerek yukarıdaki tabloyu size verir.
Jsfiddle.net sitesinde canlı olarak deneyin
Soru sadece Google MAPS için olduğu için, EARTH için değil, OP 3B geometriyi önemsemiyor. Google haritaları ALREADY düzleştirilmiştir, bu nedenle 1 piksel her zaman aynı uzaklıktadır (DEGREES'te, google haritasına ilişkin olan), burada ve ekvatorda olduğu gibi.
Bu arada, bir dünya haritasının ilk piksel sırasının içinde bir yerde, ölçeğin 1: 1 olduğunu fark ettiniz mi?
Microsoft'tan Virtal Toprak Kiremit Sistemi belgelerinde böyle bir tablo var . Ancak GuillaumeC tarafından söylendiği gibi, değerler enlem ve ekran çözünürlüğüne bağlıdır. Tablo, Ekvator'da ve 96 dpi ekran çözünürlüğünde ölçülen değerleri verir.
Not: Bundan emin değilim, ancak Microsoft’un yakınlaştırma düzeyleri, Google’ın yakınlaştırma düzeyleriyle karşılaştırıldığında 1 puan arasında değişebilir. Fakat aynı projeksiyonu kesinlikle kullanıyorlar, böylece değerler Google için doğru kalıyor.
Yarıçap @ Equator 6,378,137 metre kesin (WGS-84)
Ekvator'daki çevre = 40,075,017 metre (2πr)
Yakınlaştırma seviyesi 24, çevre üzerinde 2 ila 32 güç (4,294,967,296) piksel kullanır.
Ekvator Çevresi / 2 32 = .009330692 piksel başına piksel
Enlemdeki Birim = (Enlem Kosinüsü) X (Ekvatordaki Birim)
Yakınlaştırma seviyesi her artışı iki katına çıkarır.
1 ayak (Uluslararası) = 0.3048 metre
Düzenle
Peki, başlamak için gerçekten meşru bir soru değil. Ölçek oranları, bilgisayar ekranları yerine basılı belgelere göredir. Bu görüntülerin herhangi bir doğrulukla kullanılması için ihtiyacınız olan, her pikselin boyutunu bilmek ve görüntüyü bindirdiğiniz yere göre ölçeklendirmektir.
Böylece 15-20 yıl önce birileri temel verileri WGS-84'ü aldı. (önceki bir yazıda, biri 40,075,160 değerini kullandıgını not edin Vikipedi'de bunu birkaç yerde gördüm ve yanlış. Doğru değeri 40.075.017
Daha sonra bunu aldı ve tam bir 32 bit tam sayı ile böldüler. Bu, havadan görüntüler için bol olan yaklaşık bir santimetreye kadar küresel doğruluk sağladığı için mantıklı bir seçimdir. 32 bit tam sayılar da depolamak ve işlemek için verimlidir.
Bu seviye 24'ün neden seçildiğini bilmiyorum ancak burada başka biri 0 çalıştığında, sizi dünya için 256 piksel karodan aşağıya indirir.
Şimdi yukarıdaki verilerin nasıl kullanılacağına dair bir örnek için. Diyelim ki zoom seviyesi 20'de bir görüntüm var (şu anda çekebildiğiniz kadar zoomlu): 0.009330692 (ekvatorda Zoom 24) çekimi zoom 23 için iki kat, zoom 22 için tekrar 21 ve zoom 20 için son bir kez Şimdi 0.149231071'e sahip olmalısınız.
Şimdi resmimizin enlem 45 olduğunu söyleyelim. Bunun Kosinüsünü alın (0.707106781) ve onu 0.149231071 ile çarpın, size 0.105564729 metre verecektir. Bu, bir pikselden enlemesine (45) yakınlaştırma düzeyindeki (20) bir görüntüden bir pikselin uzunluğu ve yüksekliğidir. Ayakları istiyorsanız, bu 0,3048 bölmek
Kaynaklara gelince, ben esansiyel olarak mühendisimi yaklaşık 5 yıl önce Google ve MS haritalama destek siteleri de dahil olmak üzere web üzerinde bulduğum çeşitli bilgi ve dokümantasyonlardan tersine çevirdim.
Bu yüzlerce kez kullandım ve onu gerçekten saha araştırması verileriyle örtüştüm ve her zaman doğru oldu. Burada yayınlanan tabloların herhangi birine karşı kontrol edin, sayılar eşleşecektir.
Sadece bazı hesaplamalar yaptım ve aşağıdaki sonuçları aldım:
Google Haritalar, zoom seviyesi 13'te, uzunluğu 90 piksel olan 1km'lik bir cetvel (haritanın sol altında) gösterir.
Ekran çözünürlüğünün 96 dpi veya 36 dpcm olduğunu varsayarsak, 13 yakınlaştırma düzeyinde 1 cm'de 0,4km (36/90 arasında) var; bu da 96 dpi ekran için 1: 40,000 harita ölçeğini veriyor.
Ekrandaki çeşitli işlemler için en iyisi temel olarak 90 piksel almaktır, çünkü tüm sayılar tüm yakınlaştırma düzeylerinde yuvarlak olacaktır, yani
ve bunun gibi.
Bunun, büyüklerden ziyade küçük ölçeklerde aşağı yukarı iyi çalışması gereken bir yaklaşım olduğunu unutmayın.
(Ve Google sonunda tur sayılarını sever ...)
Sağlanan tüm bilgilere dayanarak, görüntülenen Haritanın N% 'sini temsil eden yatay bir çizgiye sahip olmak istediğinizde bir haritaya uygulanan en iyi z'yi veren bir işlev oluşturdum.
Görüntülenen Harita kendi piksel genişliğiyle tanımlanır.
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);
}
Henüz bir yorum ekleyemiyorum, ancak bu yukarıdaki Pete'in cevabının olası bir kaynağıdır: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] Her artan zum seviyesinin hem x hem de y yönlerinde iki kat daha büyük olduğuna dikkat edin. Bu nedenle, her bir yüksek zoom seviyesi bir önceki seviyeye göre dört kat daha fazla çözünürlük içeriyor. Örneğin, yakınlaştırma düzeyinde 1, harita 4 256x256 piksel döşemelerden oluşur ve 512x512 piksel alanıyla sonuçlanır. Yakınlaştırma düzeyinde 19, haritadaki her x ve y pikseline 0 ile 256 * 2 arasındaki bir değer kullanılarak referans verilebilir. 19
Dört zoom seviyesi için terazileri hesapladım:
Yakınlaştırma seviyesi | Ölçek 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Zum seviyesi bir adım arttıkça ölçeğin iki katına çıktığı görülüyor. Bu yüzden, 16 nolu zum seviyesi ölçeğinin 1: 8000 ve daha fazla olacağını umuyorum.
Merhaba, 1 pixel = 11.627km'yi düz çizgide hesapladığımı düşünüyorum; yerin yarıçapını dikkate almamak. İşte nasıl açıklayan videonun bağlantısı: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Umarım aklını temizler.
Zoom level set meters: ${meters}
) işlevi ; var yakınlaştırma faktörü = 1; eğer (metre <1128) {yakınlaştırma faktörü = 15; } başka eğer ((metre> 1128) && (metre <2256)) {zoomfactor = 14; } başka eğer ((metre> 2256) && (metre <4513)) {zoomfactor = 13; } aksi takdirde ((metre> 4513) && (metre <9027)) {zoomfactor = 12; } aksi takdirde ((metre> 9027) && (metre <18055)) {zoomfactor = 11; } başka eğer ((metre> 18055) && (metre <36111)) {zoomfactor = 10; } else eğer ((metre> 36111) && (metre <72