การแปลง lat / หมุนที่หมุนด้วยตนเองเป็น lat / lon ปกติหรือไม่


23

ก่อนอื่นฉันควรชี้แจงว่าฉันไม่เคยมีประสบการณ์มาก่อนในสาขานี้ดังนั้นฉันจึงไม่ทราบคำศัพท์ทางเทคนิค คำถามของฉันมีดังนี้:

ฉันมีชุดข้อมูลสภาพอากาศสองชุด:

  • คนแรกมีระบบพิกัดปกติ (ฉันไม่รู้ว่ามันมีชื่อเฉพาะ) ตั้งแต่ -90 ถึง 90 และ -180 ถึง 180 และเสาอยู่ที่ละติจูด -90 และ 90

  • ในครั้งที่สองแม้ว่ามันควรจะตรงกับภูมิภาคเดียวกันฉันสังเกตเห็นบางสิ่งที่แตกต่าง: ละติจูดและลองจิจูดไม่เหมือนกันเนื่องจากมีจุดอ้างอิงอื่น(ในคำอธิบายเรียกว่ากริดหมุน ) พร้อมกับคู่ lat / lon มาข้อมูลต่อไปนี้: lat ขั้วโลกใต้: -35.00, lon pole ใต้: -15.00, มุม: 0.0

ฉันต้องเปลี่ยนคู่ที่สองของ lon / lat เป็นคู่แรก มันอาจจะง่ายเหมือนการบวก 35 กับละติจูดและ 15 กับลองจิจูดเนื่องจากมุมเป็น 0 และดูเหมือนว่าจะเปลี่ยนได้ง่าย แต่ฉันไม่แน่ใจ

แก้ไข: ข้อมูลที่ฉันมีเกี่ยวกับพิกัดมีดังต่อไปนี้

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

เห็นได้ชัดว่าระบบพิกัดที่สองถูกกำหนดโดยการหมุนทั่วไปของทรงกลม

"ทางเลือกหนึ่งสำหรับพารามิเตอร์เหล่านี้คือ:

  • ละติจูดทางภูมิศาสตร์เป็นองศาของขั้วใต้ของระบบพิกัดเช่นแตะ;

  • ลองจิจูดทางภูมิศาสตร์เป็นองศาของขั้วใต้ของระบบพิกัดตัวอย่างเช่น lambdap

  • มุมของการหมุนเป็นองศาเกี่ยวกับแกนขั้วโลกใหม่ (วัดตามเข็มนาฬิกาเมื่อมองจากทางใต้ไปยังขั้วโลกเหนือ) ของระบบพิกัดสมมติว่าแกนใหม่จะได้รับโดยการหมุนทรงกลมเป็นครั้งแรกผ่านองศา lambdap เกี่ยวกับแกนขั้วโลกทางภูมิศาสตร์ แล้วหมุนผ่าน (90 + thetap) องศาเพื่อให้ขั้วใต้เคลื่อนที่ไปตามเส้นแวงที่ Greenwich (ก่อนหน้านี้หมุน)

แต่ถึงกระนั้นฉันก็ไม่รู้วิธีแปลงมันเป็นอันแรก


2
ดังนั้นข้อมูลGRIBนี้หรือไม่ ถ้าเป็นเช่นนั้นบางทีเราต้องมีแท็ก grib
Kirk Kuykendall

@skd ลิงก์ ECMWF ดูเหมือนจะไม่ถูกต้อง คุณสามารถแก้ไขได้ไหม
gansub

@gansub ฉันได้แก้ไขลิงก์แล้ว ฉันไม่รู้ว่าข้อมูลเหมือนเดิมหรือไม่เพราะมันใช้เวลานาน แต่ฉันเชื่อว่าลิงก์ใหม่สามารถให้บริบทสำหรับการอ้างอิงในอนาคต
skd

@skd เมื่อคุณพูดangle=0.0คุณหมายถึงแบริ่ง ? ฉันมีไฟล์ netcdf ที่มีพิกัดขั้วหมุน แต่ไม่มีการเอ่ยถึงมุมใด ๆ
FaCoffee

@ CF84 ฉันไม่แน่ใจ ฉันเดาว่าถ้าไม่มีการเอ่ยถึงมุมมันก็จะเหมือนกับ angle = 0
skd

คำตอบ:


24

การหมุนกลับด้วยตนเองควรทำการหลอก ควรมีสูตรสำหรับการหมุนระบบพิกัดทรงกลมบางแห่ง แต่เนื่องจากฉันไม่สามารถหามันได้นี่คือผลสืบเนื่อง ( 'ทำเครื่องหมายระบบพิกัดที่หมุนแล้ว; พิกัดทางภูมิศาสตร์ปกติใช้สัญลักษณ์ธรรมดา):

ก่อนอื่นแปลงข้อมูลในชุดข้อมูลที่สองจากทรงกลม (lon ', lat') เป็น (x ', y', z ') โดยใช้:

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

จากนั้นใช้เมทริกซ์การหมุนสองตัวเพื่อหมุนระบบพิกัดที่สองเพื่อให้สอดคล้องกับระบบ 'ปกติ' ตัวแรก เราจะหมุนแกนพิกัดเพื่อให้เราสามารถใช้การฝึกอบรมแกนหมุน เราจำเป็นต้องกลับเครื่องหมายในเมทริกซ์ ϑ เพื่อให้ตรงกับความรู้สึกการหมุนที่ใช้ในการกำหนด ECMWF ซึ่งดูเหมือนจะแตกต่างจากทิศทางบวกมาตรฐาน

เนื่องจากเรายกเลิกการหมุนตามที่อธิบายไว้ในคำจำกัดความของระบบพิกัดเราหมุนครั้งแรกโดย ϑ = - (90 + lat0) = -55 องศารอบแกน y '(ตามแนวกรีนนิชของกรีนนิช) แล้วตามด้วยφ = - lon0 = +15 องศารอบแกน 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')

ขยายตัวสิ่งนี้กลายเป็น:

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

จากนั้นแปลงกลับเป็น 'ปกติ' (lat, lon) โดยใช้

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

หากคุณไม่มี atan2 คุณสามารถใช้มันด้วยตนเองโดยใช้ atan (y / x) และตรวจสอบสัญญาณของ x และ y

ตรวจสอบให้แน่ใจว่าคุณแปลงทุกมุมเป็นเรเดียนก่อนใช้ฟังก์ชันตรีโกณมิติหรือคุณจะได้ผลลัพธ์ที่แปลก แปลงกลับเป็นองศาในที่สุดถ้านั่นคือสิ่งที่คุณต้องการ ...

ตัวอย่าง (พิกัดทรงกลมแบบหมุน ==> พิกัดทางภูมิศาสตร์มาตรฐาน):

  • ขั้วโลกใต้ของ CS ที่หมุนแล้วคือ (lat0, lon0)

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

  • Prime meridian ของ CS ที่หมุนแล้วคือ -15 ° Meridian ในพื้นที่ทางภูมิศาสตร์ (หมุน 55 °ไปทางทิศเหนือ)

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

  • สมมาตรต้องการให้ทั้งสองเส้นศูนย์สูตรตัดกันที่ 90 ° / -90 °ใน CS ใหม่หรือ 75 ° / -105 °ในพิกัดทางภูมิศาสตร์

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

แก้ไข:เขียนคำตอบใหม่ขอบคุณความคิดเห็นที่สร้างสรรค์มากโดย whuber: การฝึกอบรมและการขยายตัวในขณะนี้มีการซิงค์โดยใช้สัญญาณที่เหมาะสมสำหรับพารามิเตอร์การหมุน; เพิ่มการอ้างอิงถึงคำจำกัดความของเมทริกซ์ เอา atan (y / x) ออกจากคำตอบ; เพิ่มตัวอย่างของการแปลง

แก้ไข 2:มันเป็นไปได้ที่จะได้รับการแสดงออกสำหรับผลลัพธ์เดียวกันโดยไม่ต้องเปลี่ยนรูปแบบที่ชัดเจนในพื้นที่คาร์ทีเซียน x, y, zในผลที่สามารถทดแทนกับการแสดงออกที่สอดคล้องกันของพวกเขาและเดียวกันสามารถทำซ้ำสำหรับx', และy' z'หลังจากใช้อัตลักษณ์ตรีโกณมิติแล้วนิพจน์ขั้นตอนเดียวต่อไปนี้จะปรากฏขึ้น:

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

1
ความคิดนั้นดี แต่รายละเอียดบางอย่างจำเป็นต้องแก้ไข lon0 = -15 ไม่ใช่ +15 ทั้งสามบรรทัดในการขยายตัวของผลิตภัณฑ์เมทริกซ์ไม่ถูกต้อง ATAN2 (หรือเทียบเท่า) จะต้องนำมาใช้แก้ไขเพื่อกลับเส้นแวงที่เหมาะสมใด ๆ เมื่อ x y = = 0 โปรดทราบว่าเนื่องจาก x ^ 2 + y ^ 2 + z ^ 2 = 1 ในตอนท้ายคุณจะได้รับ lat = Arcsin (z)
whuber

1
ขอบคุณ ฉันแก้ไขคำตอบอย่างน้อยก็ทำให้คณิตศาสตร์ถูกต้อง การหมุนควรตรงกับคำอธิบายในคำจำกัดความของ CS แต่มันยากที่จะแน่ใจเกี่ยวกับเครื่องหมายของพวกเขาโดยไม่มีตัวอย่าง (นอกเหนือจากตำแหน่งของขั้วโลกใต้)
mkadunc

ทำได้ดี! ฉันประหลาดใจที่คำตอบนี้ไม่ได้รับการโหวตมากขึ้นเพราะมันให้เนื้อหาที่มีประโยชน์และหายาก
whuber

นี่เป็นเรื่องยากมากที่จะหาเนื้อหาขอบคุณมากสำหรับคำตอบ ฉันใช้ซอฟต์แวร์นี้code.zmaw.de/projects/cdoเพื่อแปลงจากกริดหมุนไปเป็นกริดปกติ ฉันเดาว่ามันจะแปลงพิกัดเป็นครั้งแรกในคำตอบนี้แล้ว interpolates พวกเขาเพื่อให้ผลลัพธ์ที่จุดของตารางสี่เหลี่ยม ถึงแม้ว่าจะสายไปหน่อย
skd

1
@alfe ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับทรงกลมของ Bloch แต่หลักการดูคล้ายกับสิ่งที่ฉันทำ แต่แทนที่จะเปลี่ยนเป็นพื้นที่คาร์ทีเซียนที่มี 3 พิกัดจริงคำใบ้แนะนำให้เปลี่ยนเป็นพื้นที่ที่มี 2 พิกัดจินตนาการ (ซึ่งหมายถึง 4 องค์ประกอบจริง) และดำเนินการหมุนที่นั่น ถูกกระตุ้นด้วยความคิดเห็นของคุณฉันได้รวมการแสดงออกทั้งหมดและเพิ่มผลลัพธ์ซึ่งขั้นตอนคาร์ทีเซียนกลางไม่ชัดเจนอีกต่อไป
mkadunc

6

ในกรณีที่ใครสนใจฉันได้แบ่งปันสคริปต์ MATLAB ในการแลกเปลี่ยนไฟล์การแปลง lat / lon ปกติเป็น lat / lon แบบหมุนและในทางกลับกัน: การแปลงตารางแบบหมุน

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

ในกรณีที่การเชื่อมโยงไปคุณสามารถกรุณาใส่รหัสสำหรับผู้อ่านในอนาคต ขอบคุณ
Michael Stimson

1
แน่นอนว่า - ใส่รหัสแล้ว
simondk

2

การแปลงนี้ยังสามารถคำนวณด้วยซอฟต์แวร์proj (โดยใช้บรรทัดคำสั่งหรือโปรแกรม) โดยใช้สิ่งที่ proj เรียกว่าการแปลเฉียง ( ob_tran) นำไปใช้กับการแปลง latlon พารามิเตอร์การฉายที่จะตั้งค่าคือ:

  • o_lat_p = ละติจูดขั้วโลกเหนือ => 35 °ในตัวอย่าง
  • lon_0 = ลองจิจูดขั้วโลกใต้ => -15 °ในตัวอย่าง
  • o_lon_p = 0

นอกจากนี้-m 57.2957795130823จำเป็นต้องใช้ (180 / pi) เพื่อพิจารณาค่าที่คาดการณ์เป็นองศา

ทำซ้ำตัวอย่างที่เสนอโดย mkadunc ให้ผลเหมือนกัน (สังเกตว่าคำสั่งที่นี่lon latไม่ใช่(lat,lon), coodinates พิมพ์ในอินพุตมาตรฐาน, เอาท์พุทถูกทำเครื่องหมายด้วย=>):

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

invprojคำสั่งจะใช้สำหรับการแปลงจากพิกัด "ฉาย" (เช่นหมุน) เป็นทางภูมิศาสตร์ในขณะที่projสำหรับการทำตรงข้าม


1

ฉันได้พัฒนาเพจ asp.net สำหรับการแปลงพิกัดจากการหมุนเป็นแบบไม่หมุนตามโดเมน CORDEX

มันขึ้นอยู่กับวิธีการดังกล่าว คุณสามารถใช้งานได้อย่างอิสระในลิงค์นี้:

การแปลง lat / lated ที่หมุนด้วยตนเองเป็น lat / lon ปกติ


Cordex Data Extractor เป็นซอฟต์แวร์เดสก์ท็อป windows สำหรับการดึงข้อมูลจากไฟล์ CORDEX NetCDF Cordex Data Extractor ไม่ต้องการไฟล์ช่วยเหลือเนื่องจากกระบวนการทั้งหมดได้ทำไว้ในโค้ดด้านหลังและผู้ใช้เพียงแค่ป้อนวันที่พิกัดและชื่อตัวแปร กรุณาดูวิดีโอนี้: 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

คุณใช้ซอฟต์แวร์ตัวไหน ซอฟต์แวร์ GIS ทุกตัวจะมีระบบอำนวยความสะดวกในการแสดงข้อมูลระบบ / การฉายภาพปัจจุบัน ซึ่งสามารถช่วยคุณในการรับชื่อของระบบพิกัดปัจจุบันของคุณ

นอกจากนี้หากคุณใช้ ArcGIS คุณสามารถใช้เครื่องมือProjectเพื่อฉายชุดข้อมูลที่สองอีกครั้งโดยนำเข้าการตั้งค่าจากชุดแรก


2
น่าเสียดายที่ฉันไม่ได้ใช้ซอฟต์แวร์ใด ๆ ชุดข้อมูลเหล่านี้เป็นเพียงกริดชุดข้อมูลและมาพร้อมกับข้อมูลต่อไปนี้: - สำหรับชุดแรก: ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/… - สำหรับชุดที่สอง: ecmwf.int/publications/ คู่มือ / d / gribapi / fm92 / grib1 / detail / …
skd

ตั้งแต่มุมของการหมุนเป็น 0 ผมคิดว่าการแปลง่าย ๆ ควรจัดชุดที่สองที่จะเป็นคนแรกเช่นเดียวกับที่คุณกล่าวว่าการเพิ่ม 15 X และ Y 35
ujjwalesri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.