def get_xy(reference)
imax, jmax = @meta[:size]
case @meta[:projection]
when "FG "
when "GS "
di, dj = @meta[:distance]
bi, bj = @meta[:basepoint]
by, bx = @meta[:basepoint2]
dum,n = @meta[:standard]
if n==0
n = (180.0/dj).round
end
xi = NArray.sfloat(imax).indgen(1) - bi
lon = bx + xi*di
glat = gausslat(n)
yj0 = ((n+1).to_f/2-bj).round
lat = glat[yj0..(yj0+jmax-1)]
return [lon, lat]
when "LL "
di, dj = @meta[:distance]
bi, bj = @meta[:basepoint]
by, bx = @meta[:basepoint2]
xi = NArray.sfloat(imax).indgen(1) - bi
yj = NArray.sfloat(jmax).indgen(1) - bj
lon = bx + xi*di
lat = by - yj*dj
return [lon, lat]
when "LMN "
dx, dy = @meta[:distance]
bi, bj = @meta[:basepoint]
by, bx = @meta[:basepoint2]
sy,sx = @meta[:standard]
sy2, = @meta[:standard2]
unless bx.abs < 180
raise "parameter for basepoint is invalide"
end
unless dx != 0 && dy != 0
raise "parameter for distance is invalide"
end
unless sx.abs < 180
raise "parameter for standard is invalide"
end
unless 0 < sy.abs && sy.abs < sy2.abs && sy2.abs < 90 && sy*sy2>0
raise "parameter for standard is invalide"
end
bx = bx*PI/180
by = by*PI/180
sx = sx*PI/180
sy = sy*PI/180
sy2 = sy2*PI/180
xi = NArray.sfloat(imax).indgen(1) - bi
yj = NArray.sfloat(jmax).indgen(1) - bj
yj = -yj
if sy == sy2
n = sin(sy)
else
n = (log(cos(sy))-log(cos(sy2)))/(log(tan((PI/2-sy)/2))-log(tan((PI/2-sy2)/2)))
end
f = R*cos(sy)*tan((PI/2-sy)/2)**n/n
r0 = f/tan((PI/2-sy)/2)**n
if reference
lon = NMath::asin(xi*dx/r0 + sin(n*(bx-sx)))/n + sx
r = yj*dy/cos(n*(bx-sx)) + r0
lat = PI/2 - NMath::atan((f/r)**(1.0/n))*2
else
rsin = xi*dx + r0*sin(n*(bx-sx))
rcos = yj*dy + r0*cos(n*(bx-sx))
r = NMath::sqrt(rsin**2+rcos.reshape!(1,jmax)**2)
lon = NMath::asin(rsin/r)/n + sx
lat = PI/2 - NMath::atan((f/r)**(1.0/n))*2
end
lon = lon*180/PI
lat = lat*180/PI
return [lon,lat]
when "LMS "
when "MER "
dx, dy = @meta[:distance]
bi, bj = @meta[:basepoint]
by, bx = @meta[:basepoint2]
sy, = @meta[:standard]
unless bx.abs < 180
raise "parameter for basepoint is invalide"
end
xi = NArray.sfloat(imax).indgen(1) - bi
yj = NArray.sfloat(jmax).indgen(1) - bj
r = R*cos(sy*PI/180)
lon = bx + xi*dx/r*180/PI
lat = NMath::asin( NMath::tanh(atanh(sin(by*PI/180)) + yj*dy/r) )*180/PI
return [lon, lat]
when "OL "
when "NPS ", "SPS "
dx, dx = @meta[:distance]
bi, bj = @meta[:basepoint]
by, bx = @meta[:basepoint2]
sy, sx = @meta[:standard]
unless bx.abs < 180
raise "parameter for basepoint is invalide"
end
unless dx != 0 && dy != 0
raise "parameter for distance is invalide"
end
unless sx.abs < 180
raise "parameter for standard is invalide"
end
bx = bx*PI/180
by = by*PI/180
sx = sx*PI/180
sy = sy*PI/180
xi = NArray.sfloat(imax).indgen(1) - bi
yj = NArray.sfloat(jmax).indgen(1) - bj
r0 = 2*R*cos(sy)*tan((PI/2-by)/2)
if reference
lon = NMath::asin(xi*dx/r0 + sin(bx-sx)) + sx
r = yj*dy/cos(bx-sx) + r0
lat = PI/2 - NMath::atan(r/(2*R*cos(sy)))*2
else
rsin = xi*dx + r0*sin(bx-sx)
rcos = yj*dy + r0*cos(bx-sx)
r = NMath::sqrt(rsin**2+rcos.reshape!(1,jmax)**2)
lon = NMath::asin(rsin/r) + sx
lat = PI/2 - NMath::atan(r/(2*R*cos(sy)))*2
end
lon = lon*180/PI
lat = lat*180/PI
return [lon,lat]
when "RD "
when "RG "
bi, dum = @meta[:basepoint]
dum, bx = @meta[:basepoint2]
parm = @meta[:subc]["RGAU"]
raise("parameters RGAU in SUBC do not exist") unless parm
i = parm[:i]
i_n = parm[:i_n]
j_n = parm[:j_n]
i_start = parm[:i_start]
i_n_max = i_n.max
lon = NArrayMiss.sfloat(i_n_max,j_n)
lat = NArrayMiss.sfloat(i_n_max,j_n)
itotal = 0
j_n.times{|jj|
xi = NArray.sfloat(i_n[jj]).indgen(i_start[jj])
lon[0...i_n[jj],jj] = (xi-bi)*360.0/i[jj] + bx
lat[0...i_n[jj],jj] = parm[:lat][jj]
}
if lon.get_mask!.count_false == 0
lon = lon.get_array!
lat = lat.get_array!
end
if reference
lon = lon.mean(1)
lat = lat.mean(0)
end
return [lon,lat]
when "RT "
when "SB "
when "ST "
when "XX "
when "YP "
else
raise "projection is invalid"
end
warn "sorry, projection of '#{@meta[:projection]}' is not suported"
xi = NArray.sint(imax).indgen(1)
yj = NArray.sint(jmax).indgen(1)
return [xi, yj]
end