Konwertuj długość / szerokość geograficzną na piksele na mapie


11

Mam stąd mapę . Chcę być w stanie po prostu przekonwertować dowolną parę lon / lat na piksele na mapie (także możliwość wykonania odwrotnej konwersji). Mapy zawierają plik .tfw i informacje o projekcji, oto:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

i informacje o projekcji:

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

Jestem całkowicie nowy w sprawach związanych z kartografią i, o ile się zorientowałem, powinienem najpierw dokonać transformacji z WGS84 (para lon / lat) do projekcji geograficznej (czyż nie są one takie same?). Wydaje mi się, że są one w rzeczywistości takie same, ale promień kuli w powyższych informacjach o projekcji wynosi 6370997 i różni się od strony spatialreference.com, którą znalazłem dla projekcji Plate Carree. W każdym razie znalazłem, że biblioteka DotSpatial.Projections może to dla mnie zrobić za pomocą następującego kodu:

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

A potem muszę przetłumaczyć wynikowe współrzędne na piksele na mapie za pomocą pliku świata. Mam świadomość następującej formuły:

obraz wikipedia

Ale wydaje się, że w pliku świata są stopnie, a nie metry i nie wiem, co z nimi zrobić. Czy ogólnie robię właściwe rzeczy? Czy istnieje łatwiejszy sposób, biorąc pod uwagę moje dane?


1
W oparciu o plik świata raster używa jednostek szerokości i długości geograficznej oraz stopni. Rozmiar komórki wynosi 0,0222 stopnia. Jest to czasami znane jako pseudo-płytka Carree. Plate Carree skaluje i konwertuje wartości na metry. Istnieje również mieszanka układu odniesienia o nazwie WGS84, ale wspomniana jest kula o promieniu = 6370997. Próbuję użyć WKID: 4326.
mkennedy

@mkennedy Myślę, że powyższa formuła zastosowana do pliku światowego nie przyniosłaby nic znaczącego, ponieważ została zaprojektowana dla liczników? Nie wiem też i przeszukałem bez wyniku, co oznacza WKID: 4326.
Dmitrij Marchuk

Odpowiedzi:


6

Nie ma transformacji między współrzędnymi, ale do / z pozycji pikseli, tak: zakładamy px, py jest pozycją piksela na twojej mapie, podczas gdy geox i geoy są współrzędnymi świata rzeczywistego. Mamy również xOff, yOff pobrane z TFW, z -180, 90 plus xsize i ysize, z 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

powyższe dwie pseudo-funkcje informują nas o geolokalizacji (geox, geoy) dla danej pozycji w pikselach i, myślę, że o to prosili, w pikselach dla danej geolokalizacji. Jest to możliwe tylko dlatego, że „carree płytowy” traktuje stopnie geograficzne o długości i szerokości geograficznej jako współrzędne metryczne na płaszczyźnie (w prostokątnym układzie współrzędnych). Jeśli narysujesz siatkę ziemi, dostaniesz kwadraty o równej wielkości (i tak właśnie wygląda twój obraz mapy). Po edycji moich błędów, teraz dostaję z lon / lat (50.4546600, 30.5238000) Dostaję (10370.459803704598, 2676.42902676429). Rzuć go na liczbę całkowitą, jeśli potrzebujesz indeksu pikseli.


px = (geox + xOff) / xsize, na przykład, który byłby (50.4546600 + (-180)) / 0.02222222222222ujemny i mniej więcej równy 5830. Który nie jest 2113.3936363636362. Proszę wyjaśnić dalej lub poprawić odpowiedź.
Dmitrij Marchuk

Oryginalny kod był w javascript z pewnymi zależnościami, sprawdzę ...
Andreas Müller

Zmieniłem kod i tekst powyżej, ponieważ miałem błąd podczas kopiowania go z JavaScript.
Andreas Müller,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.