Döndürülmüş lat / lonu manuel olarak normal lat / lon'a dönüştürmek?


24

Öncelikle bu alanda daha önce deneyimim olmadığını ve bu yüzden teknik terminolojiyi bilmediğimi netleştirmeliyim. Sorum şu:

İki tane hava durumu veri setim var:

  • İlki , -90 ile 90 ve -180 ile 180 arasında değişen (belirli bir isme sahip olup olmadığını bilmiyorum) normal koordinat sistemine sahiptir ve kutuplar -90 ve 90 enlemlerindedir.

  • İkincisinde, aynı bölgeye karşılık gelmesine rağmen, farklı bir şey fark ettim: Enlem ve boylamlar, başka bir referans noktasına sahip oldukları için aynı değildi (açıklamada döndürülmüş ızgara olarak adlandırılır ). Lat / lon çiftleri ile birlikte, aşağıdaki bilgiler gelir: güney kutbu lat: -35.00, güney kutbu lonu: -15.00, açı: 0.0.

İkinci lon / lat çiftini birincisine dönüştürmem gerekiyor. Açı 0 olduğundan ve basit bir kayma gibi göründüğü için enlemelere 35, boylamlara 15 eklemek kadar basit olabilir, ama emin değilim.

Düzenleme: Koordinatlar hakkında sahip olduğum bilgiler aşağıdaki gibidir.

http://rda.ucar.edu/docs/formats/grib/gribdoc/llgrid.html

Görünüşe göre, ikinci koordinat sistemi kürenin genel bir dönüşü ile tanımlanmaktadır.

"Bu parametreler için bir seçenek:

  • Örneğin koordinat sisteminin güney kutbunun derece cinsinden coğrafi enlemi;

  • Koordinat sisteminin güney kutbunun derece cinsinden coğrafi boylamı, örneğin lambdap;

  • Yeni eksenin ilk önce coğrafi kutup ekseni etrafında lambdap dereceleri boyunca döndürülmesiyle elde edildiğini varsayarsak, koordinat sisteminin (güneyden kuzeyine bakarken saat yönünde ölçülen) yeni kutup ekseni etrafındaki derece cinsinden dönme açısı ve daha sonra (90 + tetap) derece döndürerek güney kutbunun (daha önce döndürülmüş) Greenwich meridyeni boyunca ilerleyeceğini söyledi.

ama yine de bunu birinciye nasıl dönüştüreceğimi bilmiyorum.


2
Peki bu GRIB verileri mi? Eğer öyleyse, belki bir rüşvet etiketi gerekir.
Kirk Kuykendall

@ skd ECMWF bağlantıları geçerli görünmüyor. Düzenler misiniz
gansub

@gansub Bağlantıları değiştirdim. Bilginin uzun zamandan beri tamamen aynı olup olmadığını bilmiyorum, ancak yeni bağlantının ileride referans olması için bir bağlam sağlayabileceğini düşünüyorum.
skd

@ skd derken yatağıangle=0.0kastediyorsun ? Döndürülmüş kutup koordinatlarına sahip bir netcdf dosyam var ancak herhangi bir açıdan bahsetmiyorum.
FaCoffee

@ CF84 Aslında emin değilim. Ben açısı hiç söz varsa o zaman açı = 0 ile aynı olduğunu tahmin
SKD

Yanıtlar:


24

Döndürmeyi elle ters çevirerek hile yapmalı; bir yerde küresel koordinat sistemlerini döndürmek için bir formül olmalıdır, ancak bulamadığım için türev ( ' döndürülmüş koordinat sistemini işaretler; normal coğrafi koordinatlar düz semboller kullanır):

İlk önce, ikinci veri kümesindeki verileri küresel kullanarak (lon ', lat') - (x ', y', z ')' e dönüştürün:

x' = cos(lon')*cos(lat')
y' = sin(lon')*cos(lat')
z' = sin(lat')

Ardından, ikinci koordinat sistemini, ilk 'normal' olanla çakışacak şekilde döndürmek için iki döndürme matrisi kullanın. Koordinat eksenlerini döndüreceğiz, böylece eksen dönüş matrislerini kullanabiliriz . ECMWF tanımında kullanılan, standart pozitif yönden farklı gibi görünen dönüş hissine uyması için rix matris içindeki işareti tersine çevirmeliyiz.

Koordinat sisteminin tanımında açıklanan dönüşü geri aldığımız için, önce '= - (90 + lat0) = y55 ekseni etrafında -55 derece (döndürülen Greenwich meridyeni boyunca) ve sonra φ = - lon0 = z ekseni etrafında +15 derece):

x   ( cos(φ), sin(φ), 0) (  cos(ϑ), 0, sin(ϑ)) (x')
y = (-sin(φ), cos(φ), 0).(  0     , 1, 0     ).(y')
z   ( 0     , 0     , 1) ( -sin(ϑ), 0, cos(ϑ)) (z')

Genişletilmiş, bu olur:

x = cos(ϑ) cos(φ) x' + sin(φ) y' + sin(ϑ) cos(φ) z'
y = -cos(ϑ) sin(φ) x' + cos(φ) y' - sin(ϑ) sin(φ) z'
z = -sin(ϑ) x' + cos(ϑ) z'

Sonra tekrar kullanarak 'normal' (enlem, boylam) dönüşümü yapın

lat = arcsin(z)
lon = atan2(y, x)

Eğer atanmamışsanız2, atan (y / x) kullanarak ve x ve y işaretlerini inceleyerek kendiniz uygulayabilirsiniz.

Trigonometrik işlevleri kullanmadan önce tüm açıları radyanlara dönüştürdüğünüzden emin olun; aksi takdirde tuhaf sonuçlar elde edersiniz; Eğer istediğin buysa, sonunda derecelere dön.

Örnek (döndürülmüş küre koordinatları ==> standart coğrafi koordinatlar):

  • Döndürülen CS'nin güney kutbu (lat0, lon0)

    (-90 °, *) ==> (-35 °, -15 °)

  • Döndürülen CS'nin ana meridyeni coğrafi olarak -15 ° meridyendir (kuzeye doğru 55 ° döndürülmüş)

    (0 °, 0 °) ==> (55 °, -15 °)

  • simetri, her iki ekvatorun yeni CS'de 90 ° / -90 ° 'de veya coğrafi koordinatlarda 75 ° / -105 °' de kesişmesini gerektirir.

    (0 °, 90 °) ==> (0 °, 75 °)
    (0 °, -90 °) ==> (0 °, -105 °)

EDIT: Whuber'ın çok yapıcı yorumu sayesinde cevabı tekrar yazdım: matrisler ve genişleme şimdi rotasyon parametreleri için uygun işaretleri kullanarak senkronize edildi; matrislerin tanımına referans eklendi; cevaptan atanmış (y / x); dönüşüm örnekleri eklendi.

2 EDIT: Aynı sonuç için ifadeleri kartezyen uzaya açıkça tranformasyon olmadan türetmek mümkündür. x, y, zSonuç olarak, karşılık gelen ifadeler ile sübstitüe edilmiş olabilir, ve aynı tekrar edilebilir x', y've z'. Bazı trigonometrik kimlikleri uyguladıktan sonra, aşağıdaki tek adımlı ifadeler ortaya çıkar:

lat = arcsin(cos(ϑ) sin(lat') - cos(lon') sin(ϑ) cos(lat'))
lon = atan2(sin(lon'), tan(lat') sin(ϑ) + cos(lon') cos(ϑ)) - φ

1
Fikir güzel, ancak bazı detayların düzeltilmesi gerekiyor. 10 = -15, +15 değil. Matris ürününün genişlemesindeki üç satırın tümü yanlış. ATAN2 (ya da eşdeğeri) gereken herhangi bir makul boylam geri gönderecek şekilde değişiklik kullanılabilir x = y = 0. X ^ 2 + y ^ 2 + z ^ 2 = 1 olduğundan, sonunda sadece lat = Arcsin (z) elde edersiniz.
whuber

1
Teşekkürler. En azından matematiği düzeltmek için cevabı düzelttim. Rotasyonlar şimdi CS tanımındaki tanımla eşleşmelidir, ancak örnek olmadan işaretlerinden emin olmak zordur (güney kutbunun konumu dışında).
mkadunc

Aferin! Bu cevabın daha fazla oy almamasına şaşırdım, çünkü yararlı ve bulması zor bir materyal sunuyor.
whuber

Bu gerçekten malzeme bulmak çok zor, cevap için çok teşekkür ederim. Döndürülmüş bir ızgaradan normal bir ızgaraya dönüştürmek için code.zmaw.de/projects/cdo yazılımını kullandım . Benim tahminim, önce bu cevaptaki gibi koordinatları dönüştürdüğü ve daha sonra sonuçları dikdörtgen bir ızgara noktasında vermek için enterpolasyon yaptığıdır. Biraz geç olmasına rağmen, onu ileride referans almak üzere bırakıyorum.
skd

1
@alfe Bloch alanlarında uzman değilim, ancak ilke yaptığım şeye çok benziyor, ancak 3 gerçek koordinatla kartezyen boşluğa dönüştürme yerine, ipucu 2 hayali koordinatla (yani 4 gerçek bileşen) ve orada rotasyonu gerçekleştirme. Yorumunuz tarafından tetiklendiğinde, tüm ifadeleri bir araya getirdim ve ara kartezyen adımının artık belirgin olmadığı bir sonuç ekledim.
mkadunc

6

Herhangi birinin ilgisini çekmesi durumunda, normal lat / lon'u döndürülmüş lat / lon'a çeviren ve bunda tam tersi bir dosya dönüştüren MATLAB betiğini paylaştım: Döndürülmüş ızgara dönüşümü

function [grid_out] = rotated_grid_transform(grid_in, option, SP_coor)

lon = grid_in(:,1);
lat = grid_in(:,2);

lon = (lon*pi)/180; % Convert degrees to radians
lat = (lat*pi)/180;

SP_lon = SP_coor(1);
SP_lat = SP_coor(2);

theta = 90+SP_lat; % Rotation around y-axis
phi = SP_lon; % Rotation around z-axis

phi = (phi*pi)/180; % Convert degrees to radians
theta = (theta*pi)/180;

x = cos(lon).*cos(lat); % Convert from spherical to cartesian coordinates
y = sin(lon).*cos(lat);
z = sin(lat);

if option == 1 % Regular -> Rotated

    x_new = cos(theta).*cos(phi).*x + cos(theta).*sin(phi).*y + sin(theta).*z;
    y_new = -sin(phi).*x + cos(phi).*y;
    z_new = -sin(theta).*cos(phi).*x - sin(theta).*sin(phi).*y + cos(theta).*z;

elseif option == 2 % Rotated -> Regular

    phi = -phi;
    theta = -theta;

    x_new = cos(theta).*cos(phi).*x + sin(phi).*y + sin(theta).*cos(phi).*z;
    y_new = -cos(theta).*sin(phi).*x + cos(phi).*y - sin(theta).*sin(phi).*z;
    z_new = -sin(theta).*x + cos(theta).*z;

end

lon_new = atan2(y_new,x_new); % Convert cartesian back to spherical coordinates
lat_new = asin(z_new);

lon_new = (lon_new*180)/pi; % Convert radians back to degrees
lat_new = (lat_new*180)/pi;

grid_out = [lon_new lat_new];

Bağlantının kesilmesi durumunda, lütfen gelecekteki okuyucular için kodu ekleyebilir misiniz? Teşekkürler.
Michael Stimson

1
Elbette - kod girildi.
simondk

2

Bu dönüşüm ile hesaplanabilir proj proj eğik bir çeviri (adlandırdığı kullanılarak (ya program komut hattı kullanılarak) yazılımı ob_tran, bir LatLon dönüşüm uygulanır). Ayarlanacak projeksiyon parametreleri şunlardır:

  • o_lat_p = örnekte kuzey kutbu enlemi => 35 °
  • lon_0 = örnekte güney kutbu boylamı => -15 °
  • o_lon_p = 0

Ek olarak, -m 57.2957795130823yansıtılan değerleri derece olarak değerlendirmek için (180 / pi) gereklidir.

Mkadunc tarafından önerilen örneklerin kopyalanması aynı sonucu verir (burada siparişte lon latolmadığına (lat,lon), koordinatların standart girdiye yazıldığına, çıktının işaretlendiğine dikkat edin =>):

invproj -f "=> %.6f" -m 57.2957795130823 +proj=ob_tran +o_proj=latlon +o_lon_p=0 +o_lat_p=35 +lon_0=-15
0 -90
=> -15.000000   => -35.000000
40 -90
=> -15.000000   => -35.000000
0 0
=> -15.000000   => 55.000000
90 0
=> 75.000000    => -0.000000
-90 0
=> -105.000000  => -0.000000

invprojKomutu "öngörülen" (yani döndürülmüş) koordinatlardan coğrafi bölgeye dönüştürmek için kullanılırken, projbunun tersini yaparsınız.


1

CORDEX alanlarına göre koordinatın döndürülmüşten döndürülmemişe dönüştürülmesi için bir asp.net sayfası geliştirdim.

Yukarıdaki yöntemlere dayanmaktadır. Bu bağlantıda özgürce kullanabilirsiniz:

Döndürülmüş lat / lonu manuel olarak normal lat / lona dönüştürme


Cordex Data Extractor, CORDEX NetCDF dosyasından veri çıkarmak için kullanılan bir Windows masaüstü yazılımıdır. Cordex Data Extractor, tüm işlemlerin arkasındaki kodlarda yapılması nedeniyle yardım dosyasına ihtiyaç duymaz ve kullanıcı sadece tarih, koordinat ve değişken adı girer. Bu videoyu izlemek edin: youtu.be/RmpZblZPXjI agrimetsoft.com/cordexDataExtractor.aspx
Sohrab kolsoomi Ayask

1

https://www.mathworks.com/matlabcentral/fileexchange/43435-rotated-grid-transform

PYTHON:

from math import *

def rotated_grid_transform(grid_in, option, SP_coor):
    lon = grid_in[0]
    lat = grid_in[1];

    lon = (lon*pi)/180; # Convert degrees to radians
    lat = (lat*pi)/180;

    SP_lon = SP_coor[0];
    SP_lat = SP_coor[1];

    theta = 90+SP_lat; # Rotation around y-axis
    phi = SP_lon; # Rotation around z-axis

    theta = (theta*pi)/180;
    phi = (phi*pi)/180; # Convert degrees to radians

    x = cos(lon)*cos(lat); # Convert from spherical to cartesian coordinates
    y = sin(lon)*cos(lat);
    z = sin(lat);

    if option == 1: # Regular -> Rotated

        x_new = cos(theta)*cos(phi)*x + cos(theta)*sin(phi)*y + sin(theta)*z;
        y_new = -sin(phi)*x + cos(phi)*y;
        z_new = -sin(theta)*cos(phi)*x - sin(theta)*sin(phi)*y + cos(theta)*z;

    else:  # Rotated -> Regular

        phi = -phi;
        theta = -theta;

        x_new = cos(theta)*cos(phi)*x + sin(phi)*y + sin(theta)*cos(phi)*z;
        y_new = -cos(theta)*sin(phi)*x + cos(phi)*y - sin(theta)*sin(phi)*z;
        z_new = -sin(theta)*x + cos(theta)*z;



    lon_new = atan2(y_new,x_new); # Convert cartesian back to spherical coordinates
    lat_new = asin(z_new);

    lon_new = (lon_new*180)/pi; # Convert radians back to degrees
    lat_new = (lat_new*180)/pi;

    print lon_new,lat_new;

rotated_grid_transform((0,0), 1, (0,30))

0

Hangi yazılımı kullanıyorsunuz? Her GIS yazılımı size mevcut koordinat sistemini / projeksiyon bilgisini gösterme olanağına sahip olacaktır. Mevcut koordinat sisteminizin ismini almanıza yardımcı olabilir.

Ayrıca, ArcGIS kullanıyorsanız , ikinci veri setini yeniden yansıtmak için Proje aracını kullanarak ayarları birinciden içe aktarabilirsiniz .


2
Ne yazık ki herhangi bir yazılım kullanmıyorum. Bunlar sadece ızgara veri kümeleridir ve şu bilgilerle gelirler: - İlki için : ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/… - İkincisi için: ecmwf.int/publications/ kılavuzları / d / gribapi / fm92 / grib1 / detay / ...
SKD

Dönme açısı 0 olduğu için, basit bir çevirinin ikinci veri setini birincisine hizalaması gerektiğini düşünüyorum, sizin de 15 ila X ve 35’in Y’ye eklendiğini söylediğiniz gibi
ujjwalesri

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.