Boylamı / enlemi haritadaki piksellere dönüştürme


11

Buradan bir haritam var . Sadece rastgele lon / lat çifti harita üzerinde piksel dönüştürmek istiyorum (ayrıca ters dönüşüm yapmak için yeteneği). Haritalar .tfw dosyası ve projeksiyon bilgisi ile birlikte gelir, işte burada:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

ve projeksiyon bilgisi:

Projection: Plate Carree aka Geographic or "LatLong"
Earth ellipsoid: Sphere, radius 6370997 m
Datum: WGS84
Extent: 180 West to 180 East, 90 North to 90 South
Size: 16,200 height samples wide x 8,100 high
Resolution: 2.47 km/pixel

Haritacılıkla ilgili şeylerde tamamen yeniyim ve anladığım kadarıyla, önce WGS84'den (lon / lat çifti) Coğrafi projeksiyona (aynı değil mi?) Dönüşümü yapmalıyım. Bana öyle geliyor ki, aslında yukarıdaki projeksiyon bilgisinde küre yarıçapı 6370997 ve Plate Carree projeksiyonu için bulduğum spatialreference.com sayfasından farklı. Her neyse, DotSpatial.Projections kütüphanesinin aşağıdaki kodla benim için yapabileceğini buldum:

    var kievCoordinates = new[] { 50.4546600, 30.5238000 };
    var z = new[] { 1.0 };

    var wgs84 = KnownCoordinateSystems.Geographic.World.WGS1984;
    var dest = new ProjectionInfo();
    dest.ParseEsriString(
        "PROJCS[\"WGS 84 / Plate Carree (deprecated)\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Equidistant_Cylindrical\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");

    Reproject.ReprojectPoints(kievCoordinates, z, wgs84, dest, 0, 1);

Ve sonra ortaya çıkan koordinatları dünya dosyasını kullanarak haritadaki piksele çevirmeliyim. Aşağıdaki formülün farkındayım:

wikipedia resmi

Ama öyle görünüyor ki dünya dosyasında metre olmayan dereceler var ve onlarla ne yapacağımı bilmiyorum. Genel olarak doğru şeyleri mi yapıyorum? Yoksa verilerim göz önüne alındığında daha kolay bir yol var mı?


1
Dünya dosyasına dayalı olarak, raster birimler olarak enlem-boylam ve dereceleri kullanıyor. Hücre boyutu 0.0222 derecedir. Bu bazen yalancı Plaka Carree olarak bilinir. Carree Plakası, değerleri ölçeklendirir ve metreye dönüştürür. Ayrıca bir veri karışımı WGS84 olarak adlandırılır, ancak yarıçapı = 6370997 olan bir küreden bahsedilir. WKID kullanmayı denemek: 4326.
mkennedy

@mkennedy Bence yukarıdaki formüle dünya dosyasına uygulanan formül için tasarlanmış çünkü anlamlı bir şey ile sonuçlanmayacak? Ayrıca WKID: 4326'nın ne anlama geldiğini bilmiyorum ve googled.
Dmitry Marchuk

Yanıtlar:


6

Koordinatlar arasında bir dönüşüm yoktur, ancak piksel konumlarına / piksel konumlarından / dönüşümlerinden böyle bir şey yoktur: piksel olduğunu varsayıyoruz, py haritanızda bir piksel konumu, geox ve geoy ise gerçek dünya koordinatlarıdır. Ayrıca xOff, yOff, tfw'den -180, 90 artı xsize ve ysize ile 0,02222222222222, -0.02222222222222

pix2coord(px,py)
    geox = xOff + (px * xsize)
    geoy = yOff + (py * ysize)

coord2pix(geox, geoy)
    px = (geox - xOff) / xsize 
    py = (geoy - yOff) / ysize

yukarıdaki iki sözde işlev bize belirli bir piksel konumu için coğrafi konum (geox, geoy) ve belirli bir coğrafi konum için piksel konumu istediğini düşünüyorum. Bu sadece mümkündür, çünkü "plaka carree" coğrafi dereceleri boylam ve enlem ile bir düzlemdeki metrik koordinatlar olarak (dikdörtgen koordinat sistemi içinde) ele alır. Eğer dünyanın varoluşunu çizseydiniz, eşit büyüklükte kareler elde edersiniz (Ve harita resminiz böyle görünüyor). Hatalarımı düzenledikten sonra artık lon / lat (50.4546600, 30.5238000) ile alıyorum (10370.459803704598, 2676.42902676429). Piksel indekslerine ihtiyacınız varsa tamsayıya yayınlayın.


px = (geox + xOff) / xsize, örneğin (50.4546600 + (-180)) / 0.02222222222222, negatif ve kabaca eşit olacaktır 5830. Hangisi değil 2113.3936363636362. Lütfen daha fazla açıklayın veya cevabı düzeltin.
Dmitry Marchuk

Orijinal kod bazı bağımlılıklar ile javascript oldu, ben kontrol edeceğim ...
Andreas Müller

Yukarıdaki kodu ve Metni değiştirdim, çünkü bir JavaScript'ten kopyalarken hata oluştu.
Andreas Müller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.