Konvertieren Sie Längen- / Breitengrad in Pixel auf der Karte

10

Ich habe eine Karte von hier . Ich möchte in der Lage sein, einfach ein beliebiges Lon / Lat-Paar in Pixel auf der Karte zu konvertieren (auch die Möglichkeit, eine umgekehrte Konvertierung durchzuführen). Die Karten werden mit .tfw-Datei- und Projektionsinformationen geliefert. Hier ist es:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

und Projektionsinfo:

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

Ich bin völlig neu in kartografischem Material, und soweit ich herausgefunden habe, sollte ich zuerst die Transformation von WGS84 (Lon / Lat-Paar) zu geografischer Projektion durchführen (sind sie nicht gleich?). Es scheint mir, dass sie tatsächlich gleich sind, aber der Kugelradius in den obigen Projektionsinformationen beträgt 6370997 und unterscheidet sich von der Seite "räumlich referenz.com", die ich für die Plate Carree-Projektion gefunden habe. Wie auch immer, ich habe festgestellt, dass die DotSpatial.Projections-Bibliothek dies für mich mit dem folgenden Code tun kann:

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

Und dann muss ich die resultierenden Koordinaten mithilfe der Weltdatei in Pixel auf der Karte übersetzen. Mir ist folgende Formel bekannt:

Wikipedia-Bild

Aber es scheint, dass es Grade nicht Meter in der Weltdatei gibt und ich weiß nicht, was ich damit machen soll. Mache ich im Allgemeinen die richtigen Dinge? Oder gibt es angesichts meiner Daten einen einfacheren Weg?

Dmitry Marchuk
quelle
1
Basierend auf der Weltdatei verwendet das Raster Breite-Länge und Grad als Einheiten. Die Zellengröße beträgt 0,0222 Grad. Dies wird manchmal als Pseudo-Plate Carree bezeichnet. Plate Carree skaliert und konvertiert die Werte in Meter. Es gibt auch eine Datumsmischung namens WGS84, aber eine Kugel mit dem Radius = 6370997 wird erwähnt. Versuch mit WKID: 4326.
mkennedy
@mkennedy Ich denke, dass die obige Formel, die auf die Weltdatei angewendet wird, nichts Sinnvolles ergeben würde, weil sie für Zähler ausgelegt ist? Ich weiß auch nicht und habe ohne Ergebnis gegoogelt, was WKID: 4326 bedeutet.
Dmitry Marchuk

Antworten:

6

Es gibt keine Transformation zwischen Koordinaten, sondern zu / von Pixelpositionen wie folgt: Wir gehen davon aus, dass px, py eine Pixelposition in Ihrer Karte ist, während Geox und Geoy Koordinaten der realen Welt sind. Wir haben auch xOff, yOff aus dem tfw mit -180, 90 plus xsize und ysize mit 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

Die obigen zwei Pseudofunktionen geben uns die Geolokalisierung (Geox, Geoy) für eine bestimmte Pixelposition und, glaube ich, die Pixelposition für eine bestimmte Geolokalisierung an. Dies ist nur möglich, weil der "Plate Carree" geografische Grade mit Längen- und Breitengrad als metrische Koordinaten in einer Ebene (innerhalb eines rechteckigen Koordinatensystems) behandelt. Wenn Sie das Raster der Erde zeichnen würden, würden Sie gleich große Quadrate erhalten (und so sieht Ihr Kartenbild aus). Nachdem ich meine Fehler bearbeitet habe, erhalte ich jetzt mit lon / lat (50.4546600, 30.5238000) (10370.459803704598, 2676.42902676429). Wandeln Sie es in eine Ganzzahl um, wenn Sie Pixelindizes benötigen.

Andreas Müller
quelle
px = (geox + xOff) / xsize, für Ihr Beispiel wäre (50.4546600 + (-180)) / 0.02222222222222das negativ und ungefähr gleich 5830. Welches ist nicht 2113.3936363636362. Bitte erläutern Sie weiter oder korrigieren Sie die Antwort.
Dmitry Marchuk
Originalcode war in Javascript mit einigen Abhängigkeiten, ich werde überprüfen ...
Andreas Müller
Ich habe oben Code und Text geändert, weil beim Kopieren aus einem JavaScript ein Fehler aufgetreten ist.
Andreas Müller