Chuyển đổi thủ công xoay lat / lon thành lat / lon thông thường?


23

Trước tiên tôi nên làm rõ tôi không có kinh nghiệm trước đây với lĩnh vực này, vì vậy tôi không biết thuật ngữ kỹ thuật. Câu hỏi của tôi như sau:

Tôi có hai bộ dữ liệu thời tiết:

  • Cái đầu tiên có hệ tọa độ thông thường (tôi không biết nó có tên cụ thể không), từ -90 đến 90 và -180 đến 180, và các cực nằm ở vĩ độ -90 và 90.

  • Trong phần thứ hai, mặc dù nó phải tương ứng với cùng một khu vực, tôi nhận thấy một điều khác biệt: vĩ độ và kinh độ không giống nhau, vì chúng có một điểm tham chiếu khác (trong mô tả được gọi là lưới xoay ). Cùng với các cặp lat / lon, xuất hiện các thông tin sau: cực nam lat: -35,00, cực nam lon: -15,00, góc: 0,0.

Tôi cần phải chuyển đổi cặp lon / lat thứ hai thành cặp thứ nhất. Nó có thể đơn giản như thêm 35 vào vĩ độ và 15 cho kinh độ, vì góc là 0 và có vẻ như là một sự dịch chuyển đơn giản, nhưng tôi không chắc chắn.

Chỉnh sửa: Thông tin tôi có về tọa độ như sau

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

Rõ ràng, hệ tọa độ thứ hai được xác định bởi một vòng quay chung của quả cầu

"Một lựa chọn cho các tham số này là:

  • Vĩ độ địa lý tính theo độ của cực nam của hệ tọa độ, ví dụ như thetap;

  • Kinh độ địa lý tính theo độ của cực nam của hệ tọa độ, ví dụ lambdap;

  • Góc quay theo độ về trục cực mới (được đo theo chiều kim đồng hồ khi nhìn từ cực nam đến cực bắc) của hệ tọa độ, giả sử trục mới đã đạt được bằng cách quay quả cầu đầu tiên qua độ lambdap về trục cực địa lý , và sau đó xoay qua (90 + thetap) độ để cực nam di chuyển dọc theo kinh tuyến Greenwich (đã quay trước đó). "

nhưng tôi vẫn không biết làm thế nào để chuyển đổi cái này thành cái đầu tiên.


2
Vậy đây là dữ liệu GRIB ? Nếu vậy, có lẽ chúng ta cần một thẻ grib.
Kirk Kuykendall

@skd các liên kết ECMWF dường như không hợp lệ. Bạn có thể chỉnh sửa?
gansub

@gansub Tôi đã chỉnh sửa các liên kết. Tôi không biết thông tin có giống hệt nhau không vì nó đã có từ lâu, nhưng tôi tin rằng liên kết mới có thể cung cấp một số bối cảnh để tham khảo trong tương lai.
skd

@skd khi bạn nói angle=0.0, bạn có nghĩa là mang ? Tôi có một tệp netcdf với tọa độ cực xoay, nhưng không đề cập đến bất kỳ góc nào.
FaCoffee

@ CF84 Tôi thực sự không chắc chắn. Tôi đoán nếu không có đề cập đến góc thì nó cũng giống như angle = 0
skd

Câu trả lời:


24

Tự tay đảo ngược vòng quay nên làm thủ thuật; cần có một công thức để quay các hệ tọa độ hình cầu ở đâu đó, nhưng vì tôi không thể tìm thấy nó, đây là đạo hàm ( ' đánh dấu hệ tọa độ xoay; tọa độ địa lý thông thường sử dụng các ký hiệu đơn giản):

Đầu tiên chuyển đổi dữ liệu trong tập dữ liệu thứ hai từ hình cầu (lon ', lat') sang (x ', y', z ') bằng cách sử dụng:

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

Sau đó sử dụng hai ma trận xoay để xoay hệ tọa độ thứ hai sao cho nó trùng khớp với ma trận 'bình thường' thứ nhất. Chúng ta sẽ xoay trục tọa độ, vì vậy chúng ta có thể sử dụng ma trận xoay trục . Chúng ta cần đảo ngược dấu hiệu trong ma trận match để khớp với cảm giác xoay được sử dụng trong định nghĩa ECMWF, dường như khác với hướng tích cực tiêu chuẩn.

Vì chúng tôi đang hoàn tác xoay được mô tả trong định nghĩa của hệ tọa độ, trước tiên chúng tôi xoay theo = - (90 + lat0) = -55 độ quanh trục y '(dọc theo kinh tuyến Greenwich đã xoay) và sau đó bằng = - lon0 = +15 độ quanh trục z):

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

Mở rộng, điều này trở thành:

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

Sau đó chuyển đổi trở lại 'bình thường' (lat, lon) bằng cách sử dụng

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

Nếu bạn không có atan2, bạn có thể tự thực hiện bằng cách sử dụng atan (y / x) và kiểm tra các dấu hiệu của x và y

Đảm bảo rằng bạn chuyển đổi tất cả các góc thành radian trước khi sử dụng các hàm lượng giác, hoặc bạn sẽ nhận được kết quả kỳ lạ; chuyển đổi trở lại độ cuối cùng nếu đó là những gì bạn thích ...

Ví dụ (tọa độ hình cầu xoay ==> tọa độ địa lý tiêu chuẩn):

  • cực nam của CS quay là (lat0, lon0)

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

  • kinh tuyến gốc của CS được quay là kinh tuyến -15 ° theo địa lý (xoay 55 ° về phía bắc)

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

  • tính đối xứng yêu cầu cả hai đường xích đạo giao nhau ở 90 ° / -90 ° trong CS mới, hoặc 75 ° / -105 ° trong tọa độ địa lý

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

EDIT: Viết lại câu trả lời nhờ nhận xét rất xây dựng của whuber: ma trận và mở rộng hiện đang đồng bộ, sử dụng các dấu hiệu thích hợp cho các tham số xoay; thêm tham chiếu đến định nghĩa của ma trận; loại bỏ atan (y / x) khỏi câu trả lời; thêm ví dụ về chuyển đổi.

EDIT 2: Có thể rút ra các biểu thức cho cùng một kết quả mà không cần thông báo rõ ràng vào không gian cartesian. Các x, y, ztrong kết quả có thể được thay thế bằng biểu thức tương ứng của họ, và tương tự có thể được lặp đi lặp lại cho x', y'z'. Sau khi áp dụng một số định danh lượng giác, các biểu thức một bước sau đây xuất hiện:

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

1
Ý tưởng là tốt, nhưng một số chi tiết cần sửa chữa. lon0 = -15, không +15. Tất cả ba dòng trong việc mở rộng sản phẩm ma trận đều không chính xác. ATan2 (hoặc tương đương) phải được sử dụng, sửa đổi để trả về bất kỳ kinh độ hợp lý nào khi x = y = 0. Lưu ý rằng vì x ^ 2 + y ^ 2 + z ^ 2 = 1, cuối cùng bạn chỉ nhận được lat = Arcsin (z).
whuber

1
Cảm ơn. Tôi đã sửa câu trả lời ít nhất là làm cho toán đúng. Các phép quay bây giờ phải khớp với mô tả trong định nghĩa CS, nhưng thật khó để chắc chắn về dấu hiệu của chúng mà không có ví dụ (trừ vị trí của cực nam).
mkadunc

Làm tốt! Tôi ngạc nhiên khi câu trả lời này không nhận được nhiều phiếu bầu hơn, bởi vì nó cung cấp tài liệu hữu ích và khó tìm.
whuber

Điều này thực sự rất khó để tìm tài liệu, cảm ơn bạn rất nhiều vì câu trả lời. Tôi đã kết thúc bằng cách sử dụng mã phần mềm này.zmaw.de/projects/cdo để chuyển đổi từ lưới xoay sang lưới thông thường. Tôi đoán là trước tiên nó biến đổi tọa độ như trong câu trả lời này và sau đó nội suy chúng để đưa ra kết quả tại các điểm của lưới hình chữ nhật. Mặc dù hơi muộn, tôi để cô ấy tham khảo trong tương lai.
skd

1
@alfe Tôi không phải là chuyên gia về hình cầu Bloch, nhưng nguyên tắc này trông rất giống với những gì tôi đã làm, nhưng thay vì chuyển đổi sang không gian cartesian với 3 tọa độ thực, gợi ý gợi ý chuyển đổi sang không gian có 2 tọa độ tưởng tượng (có nghĩa là 4 thành phần thực) và thực hiện xoay vòng ở đó. Kích hoạt bởi nhận xét của bạn, tôi đặt tất cả các biểu thức lại với nhau và thêm một kết quả trong đó bước cartesian trung gian không còn rõ ràng nữa.
mkadunc

6

Trong trường hợp bất cứ ai quan tâm, tôi đã chia sẻ tập lệnh MATLAB trên trao đổi tệp chuyển đổi lat / lon thông thường thành lat / lon xoay và ngược lại: Biến đổi lưới xoay

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

Chỉ trong trường hợp liên kết bị chết, bạn có thể vui lòng chèn mã cho người đọc trong tương lai. Cảm ơn.
Michael Promotionson

1
Chắc chắn - mã được chèn.
simondk

2

Chuyển đổi này cũng có thể được tính toán với phần mềm proj (sử dụng dòng lệnh hoặc lập trình) bằng cách sử dụng cái mà proj gọi là bản dịch xiên ( ob_tran) được áp dụng cho chuyển đổi latlon. Các tham số chiếu được đặt là:

  • o_lat_p = vĩ độ cực bắc => 35 ° trong ví dụ
  • lon_0 = kinh độ cực nam => -15 ° trong ví dụ
  • o_lon_p = 0

ngoài ra, -m 57.2957795130823(180 / pi) là bắt buộc để xem xét các giá trị được chiếu theo độ.

Sao chép các ví dụ được đề xuất bởi mkadunc cho kết quả tương tự (lưu ý rằng ở đây lon latkhông có thứ tự (lat,lon), các điều phối được nhập vào đầu vào tiêu chuẩn, đầu ra được đánh dấu bởi =>):

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

invprojlệnh được sử dụng để chuyển đổi từ tọa độ "chiếu" (tức là xoay) sang địa lý, trong khi projđể làm ngược lại.


1

Tôi đã phát triển một trang asp.net để chuyển đổi tọa độ từ xoay sang không xoay dựa trên các miền CORDEX.

Nó dựa trên các phương pháp trên. Bạn có thể sử dụng nó một cách tự do trong liên kết này:

Chuyển đổi thủ công xoay lat / lon thành lat / lon thông thường


Cordex Data Extractor là một phần mềm máy tính để bàn windows để trích xuất dữ liệu từ tệp CORDEX NetCDF. Cordex Data Extractor không cần tệp trợ giúp vì tất cả các quy trình đã được thực hiện ở phía sau mã và người dùng chỉ cần nhập ngày, tọa độ và tên biến. Vui lòng xem video này: 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

Bạn đang sử dụng phần mềm nào? Mỗi phần mềm GIS sẽ có cơ sở để hiển thị cho bạn thông tin hệ thống / trình chiếu hiện tại. , có thể giúp bạn có được tên của hệ tọa độ hiện tại của bạn.

Ngoài ra, nếu bạn đang sử dụng ArcGIS, bạn có thể sử dụng công cụ Project để chiếu lại tập dữ liệu thứ hai, nhập cài đặt từ tập đầu tiên.


2
Đáng tiếc là tôi không sử dụng bất kỳ phần mềm nào. Đó chỉ là các bộ dữ liệu lưới và chúng đi kèm với các thông tin sau: - Đối với thông tin đầu tiên: ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/ trộm - Dành cho người thứ hai: ecmwf.int/publications/ hướng dẫn sử dụng / d / gribapi / fm92 / grib1 / chi tiết / khác
skd

Vì góc quay là 0, tôi nghĩ rằng một bản dịch đơn giản sẽ căn chỉnh tập dữ liệu thứ hai thành tập đầu tiên, như bạn đã nói thêm 15 đến X và 35 cho Y
ujjwalesri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.