Converti longitudine / latitudine in pixel sulla mappa


10

Ho una mappa da qui . Voglio essere in grado di convertire semplicemente coppie lon / lat arbitrarie in pixel sulla mappa (anche la possibilità di fare la conversione inversa). Le mappe vengono fornite con il file .tfw e le informazioni di proiezione, eccole:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

e informazioni sulla proiezione:

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

Sono completamente nuovo alle cose relative alla cartografia e, per quanto ho capito, dovrei prima fare la trasformazione da WGS84 (coppia lon / lat) a proiezione geografica (non sono gli stessi?). Mi sembra che siano gli stessi, in realtà, ma il raggio della sfera nelle informazioni di proiezione sopra è 6370997 ed è diverso dalla pagina spatialreference.com che ho trovato per la proiezione di Plate Carree. Comunque, ho trovato la libreria DotSpatial.Projections in grado di fare questo per me, con il seguente codice:

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

E poi devo tradurre le coordinate risultanti in pixel sulla mappa usando il file world. Sono a conoscenza della seguente formula:

immagine di Wikipedia

Ma sembra che ci siano gradi non metri nel file mondiale e non so cosa farne. In generale, sto facendo le cose giuste? O c'è un modo più semplice, dati i miei dati?


1
Basato sul file mondiale, il raster sta usando latitudine-longitudine e gradi come unità. La dimensione della cella è di 0,0222 gradi. Questo a volte è noto come pseudo-Plate Carree. Plate Carree si ridimensionerebbe e convertirà i valori in metri. C'è anche un mix di datum chiamato WGS84, ma viene menzionata una sfera con raggio = 6370997. Prova usando WKID: 4326.
mkennedy,

@mkennedy Penso che la formula sopra applicata al file mondiale non darebbe nulla di significativo perché è stata progettata per i contatori? Inoltre, non so e ho cercato su Google senza alcun risultato cosa significhi WKID: 4326.
Dmitry Marchuk,

Risposte:


6

Non vi è alcuna trasformazione tra coordinate ma a / da posizioni di pixel, in questo modo: supponiamo che px, py sia una posizione di pixel nella tua mappa, mentre geox e geoy sono coordinate del mondo reale. Abbiamo anche xOff, yOff preso dal tfw, con -180, 90 più xsize e ysize, con 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

le due pseudo funzioni di cui sopra ci dicono la geolocalizzazione (geox, geoy) per una data posizione pixel e, penso che sia quello che hai chiesto, la posizione pixel per una data geolocalizzazione. Questo è possibile solo perché il "piatto carree" tratta i gradi geografici con longitudine e latitudine come coordinate metriche su un piano (all'interno di un sistema di coordinate rettangolare). Se disegnassi il reticolo della terra, otterresti quadrati di dimensioni uguali (Ed è così che sembra l'immagine della tua mappa). Dopo aver modificato i miei errori, ora ottengo con lon / lat (50.4546600, 30.5238000) che ottengo (10370.459803704598, 2676.42902676429). Trasmettilo a numero intero, se hai bisogno di pixel indize.


px = (geox + xOff) / xsize, per il tuo esempio sarebbe (50.4546600 + (-180)) / 0.02222222222222che è negativo e all'incirca uguale 5830. Che non lo è 2113.3936363636362. Per favore, spiega ulteriormente o correggi la risposta.
Dmitry Marchuk,

Il codice originale era in javascript con alcune dipendenze, controllerò ...
Andreas Müller,

Ho modificato il codice e il testo sopra, perché si è verificato un errore durante la copia da un JavaScript.
Andreas Müller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.