본문 바로가기

작은 공부방

Astropy.coordinates Library

반응형

  이론적으로 각 좌표계가 무엇을 의미하냐도 중요하지만, 이 좌표계들 사이에서 전환하여서 사용할 줄 아는 것이 그 다음으로 중요하다. 따라서 이를 변환하는 기능을 제공하는 라이브러리를 알아보고자 한다. Astropy.cordinates는 이러한 기능을 지원한다. 물론 다른 다양한 기능도 존재한다.

Astropy.coordinates

SkyCoord Initalization

  이를 이용하는데 있어서 중요한 것은 SkyCoord라는 객체이다. 이는 초기 세팅을 통해서 좌표계 사이의 전환 등을 지원한다. 처음에 선언할 때, Quantity 객체와 무슨 좌표계(frame)인지 전달함으로써 사용할 수 있다. 먼저 선언하는 예시는 다음과 같다.

SkyCoord(COORD, [FRAME], keyword_args ...)
SkyCoord(LON, LAT, [FRAME], keyword_args ...)
SkyCoord(LON, LAT, [DISTANCE], frame=FRAME, unit=UNIT, keyword_args ...)
SkyCoord([FRAME], <lon_attr>=LON, <lat_attr>=LAT, keyword_args ...)

  이런 식으로 선언할 수 있는데, 가장 첫 번째만 이용해서 진행하면 된다. COORD에는 해당 Frame에 사용되는 COORD를 넣어주면 된다. Frame에는 BaseCoordinateFrame을 넣어주면 되는데, 이를 직접 만들어줄 수도 있고 미리 해당 라이브러리에서 선언해놓은 Frame을 넣어도 된다. 

  우리가 관심이 있는 것은 ICRS(J2K), ITRS(ECEF), TEME이다. 해당 프레임은 다음과 같이 정의되어 있다. 따라서 이 프레임을 이용해서 진행하면 된다.

ITRS Earth Centered, Earth Fixed(ECEF)
ICRS Earth Centered Inertial(ECI)
TEME True Equator Mean Equinox frame (TEME).

  이러한 프레임마다 들어가야하는 내용이 다르다. 이는 다음과 같다.

ICRS, FK5, FK4, and FK4NoETerm ra(적경), dec(적위) 
Galactic l, b
With represenation_type x, y, z

  아래에는 위의 어법을 이용한 다양한 선언 방법이다. 또 좌표의 표현 방식 중 기본 방식이 spherical cordinates인데 이를 또 설정해줄 수 있다. representation_type을 통해서 점을 특정하면 이를 직교 좌표로 표현해준다. representation_type을 변경함으로써, spherical에서 cartesian으로 변경이 가능하며 이를 간단하게 진행할 수 있다.

>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> c = SkyCoord(10.625, 41.2, frame='icrs', unit='deg') #하나로 통일된 단위일 때 문법
>>> c = SkyCoord(ra=10.68458*u.degree, dec=41.26917*u.degree) #단위가 다를 때 문법
>>> c  
<SkyCoord (ICRS): (ra, dec) in deg
    (10.625, 41.2)>

>>> c = SkyCoord(ra=10.68458*u.degree, dec=41.26917*u.degree, distance=770*u.kpc)
>>> c.cartesian.x  
<Quantity 568.71286542 kpc>
>>> c.cartesian.y  
<Quantity 107.3008974 kpc>
>>> c.cartesian.z  
<Quantity 507.88994292 kpc>

>>> c = SkyCoord(x=1, y=2, z=3, unit='kpc', representation_type='cartesian')
>>> c  
<SkyCoord (ICRS): (x, y, z) in kpc
    (1., 2., 3.)>
>>> c.x, c.y, c.z  
(<Quantity 1. kpc>, <Quantity 2. kpc>, <Quantity 3. kpc>)

 

Coordinate Access

  SkyCoord 객체를 만든 후에는 객체가 가진 값에 접근할 수 있다. 

>>> c = SkyCoord(ra=10.68458*u.degree, dec=41.26917*u.degree)
>>> c.ra  

>>> c.ra.hour  
0.7123053333333335
>>> c.ra.hms  
hms_tuple(h=0.0, m=42.0, s=44.299200000000525)
>>> c.dec  

>>> c.dec.degree  
41.26917
>>> c.dec.radian  
0.7202828960652683

to_string() method를 이용해서 다음과 같이 반환받을 수도 있다.

>>> c = SkyCoord(ra=10.68458*u.degree, dec=41.26917*u.degree)
>>> c.to_string('decimal')
'10.6846 41.2692'
>>> c.to_string('dms')
'10d41m04.488s 41d16m09.012s'
>>> c.to_string('hmsdms')
'00h42m44.2992s +41d16m09.012s'

 

Frame Transformation

  Frame을 바꾸어줄 수 있다. 아래에 있는 표는 각 모드에서 바꿀 수 있는 종류를 표현한 것이다. 따라서 한 단계씩 밟아가면서 변경해줄 수 있다. 여러 transform_to 함수를 이용할 때, 내부적으로는 여러 개의 Frame을 거치지만, 실제 사용할 때에는 바로 넘어갈 수 있다. 

  여기에서 주의할 점이 있는데, j2000과 같은 경우에는 시점이 정확히 정해져 있기 때문에, 시점을 지정해줄 필요가 없지만, TEME는 관찰하는 시점에 따라서 좌표계가 달라진다. 따라서 transform이전에 Frame을 지정해줄 때, 이 Frame에 정보를 포함시켜야지만 변환할 수 있다.

>>> c_icrs = SkyCoord(ra=10.68458*u.degree, dec=41.26917*u.degree, frame='icrs')
>>> c_icrs.galactic  
<SkyCoord (Galactic): (l, b) in deg
    (121.17424181, -21.57288557)>

>>> c_fk5 = c_icrs.transform_to('fk5')  # c_icrs.fk5 does the same thing
>>> c_fk5  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    (10.68459154, 41.26917146)>

 

SPG4의 TEME 좌표계를 J2000 or ECEF으로 변환

  SPG4를 구할 때, Satrec을 사용하는데, 이가 반환하는 것은 에러, 위치, 속도이다. 이때, 해당 데이터 형태로 받았을 때 이를 간단하게 처리할 수 있는 모듈을 제작하였다.

transform.py
0.00MB

 

반응형