Konversi garis bujur / lintang ke piksel pada peta

10

Saya punya peta dari sini . Saya ingin dapat dengan mudah mengkonversi pasangan lon / lat sewenang-wenang ke piksel pada peta (juga kemampuan untuk melakukan konversi balik). Peta datang dengan file .tfw dan info proyeksi, ini dia:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

dan info proyeksi:

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

Saya benar-benar baru dalam hal-hal yang berkaitan dengan kartografi, dan sejauh yang saya tahu saya harus terlebih dahulu melakukan transformasi dari WGS84 (pasangan lon / lat) ke proyeksi Geografis (bukankah sama?). Sepertinya saya sama, sebenarnya, tetapi radius sphere dalam info proyeksi di atas adalah 6370997 dan berbeda dari halaman spatialreference.com yang saya temukan untuk proyeksi Plate Carree. Lagi pula, saya menemukan perpustakaan DotSpatial.Projections dapat melakukan ini untuk saya, dengan kode berikut:

    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);

Dan kemudian saya harus menerjemahkan koordinat yang dihasilkan ke piksel pada peta menggunakan file dunia. Saya mengetahui rumus berikut:

gambar wikipedia

Tetapi tampaknya ada derajat bukan meter dalam arsip dunia dan saya tidak tahu apa yang harus dilakukan dengan mereka. Secara umum, apakah saya melakukan hal yang benar? Atau ada cara yang lebih mudah, mengingat data saya?

Dmitry Marchuk
sumber
1
Berdasarkan file dunia, raster menggunakan lintang-bujur dan derajat sebagai unit. Ukuran sel adalah 0,0222 derajat. Ini kadang-kadang dikenal sebagai Carree pseudo-Plate. Lempeng Carree akan menskala dan mengubah nilai menjadi meter. Ada juga campuran datum yang disebut WGS84, tetapi bola dengan jari-jari = 6370997 disebutkan. Mencoba menggunakan WKID: 4326.
mkennedy
@kenkeny Saya pikir rumus di atas yang diterapkan pada file dunia tidak akan menghasilkan sesuatu yang berarti karena dirancang untuk meter? Saya juga tidak tahu dan googled tanpa hasil apa arti WKID: 4326.
Dmitry Marchuk

Jawaban:

6

Tidak ada transformasi antara koordinat tetapi ke / dari posisi piksel, seperti ini: kami menganggap px, py adalah posisi piksel di peta Anda, sementara geox dan geoy adalah koordinat dunia nyata. Kami juga memiliki xOff, yOff diambil dari tfw, dengan -180, 90 plus xsize dan ysize, dengan 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

dua fungsi pseudo di atas memberi tahu kami geolokasi (geox, geoy) untuk posisi piksel yang diberikan, dan, saya pikir itulah yang Anda minta, posisi piksel untuk geolokasi yang diberikan. Ini hanya mungkin, karena "plat carree" memperlakukan derajat geografis dengan garis bujur dan garis lintang sebagai koordinat metrik pada bidang (dalam sistem koordinat persegi panjang). Jika Anda akan menggambar graticule bumi, Anda akan mendapatkan kotak berukuran sama (dan seperti itulah gambar peta Anda suka). Setelah mengedit kesalahan saya, sekarang saya dapatkan dengan lon / lat (50.4546600, 30.5238000) saya dapatkan (10370.459803704598, 2676.42902676429). Keluarkan ke integer, jika Anda membutuhkan piksel.

Andreas Müller
sumber
px = (geox + xOff) / xsize, untuk contoh Anda akan (50.4546600 + (-180)) / 0.02222222222222yang negatif dan kira-kira sama 5830. Yang mana tidak 2113.3936363636362. Tolong, jelaskan lebih lanjut, atau koreksi jawabannya.
Dmitry Marchuk
Kode asli dalam javascript dengan beberapa dependensi, saya akan memeriksa ...
Andreas Müller
Saya mengubah kode dan Teks di atas, karena saya mengalami kesalahan saat menyalinnya dari JavaScript.
Andreas Müller