2017-01-04 9 views
0

workshopのコードを使用して、指定した座標に最も近い座標でnetCDFファイルからデータを抽出しています。私は以下のようにトラブルもなく、私は必要な値を抽出することができる午前座標のちょうど1セット使用時:Python:リストから関数に座標を渡す

import numpy as np 
import netCDF4 
from math import pi 
from numpy import cos, sin 

def tunnel_fast(latvar,lonvar,lat0,lon0): 
    ''' 
    Find closest point in a set of (lat,lon) points to specified point 
    latvar - 2D latitude variable from an open netCDF dataset 
    lonvar - 2D longitude variable from an open netCDF dataset 
    lat0,lon0 - query point 
    Returns iy,ix such that the square of the tunnel distance 
    between (latval[it,ix],lonval[iy,ix]) and (lat0,lon0) 
    is minimum. 
    ''' 

    rad_factor = pi/180.0 # for trignometry, need angles in radians 
    # Read latitude and longitude from file into numpy arrays 
    latvals = latvar[:] * rad_factor 
    lonvals = lonvar[:] * rad_factor 
    ny,nx = latvals.shape 
    lat0_rad = lat0 * rad_factor 
    lon0_rad = lon0 * rad_factor 
    # Compute numpy arrays for all values, no loops 
    clat,clon = cos(latvals),cos(lonvals) 
    slat,slon = sin(latvals),sin(lonvals) 
    delX = cos(lat0_rad)*cos(lon0_rad) - clat*clon 
    delY = cos(lat0_rad)*sin(lon0_rad) - clat*slon 
    delZ = sin(lat0_rad) - slat; 
    dist_sq = delX**2 + delY**2 + delZ**2 
    minindex_1d = dist_sq.argmin() # 1D index of minimum element 
    iy_min,ix_min = np.unravel_index(minindex_1d, latvals.shape) 
    return iy_min,ix_min 

ncfile = netCDF4.Dataset('E:\wind_level2_1.nc', 'r') 
latvar = ncfile.variables['latitude'] 
lonvar = ncfile.variables['longitude'] 

#_________GG turbine_________GAD10 Latitude 51.735516, GAD10 Longitude 1.942656 

iy,ix = tunnel_fast(latvar, lonvar, 51.735516, 1.942656) 
print('Closest lat lon:', latvar[iy,ix], lonvar[iy,ix]) 

refLAT=latvar[iy,ix] 
refLON = lonvar[iy,ix] 
#try to find the data for this location 

SARwind = ncfile.variables['sar_wind'][:,:] 
ModelWind = ncfile.variables['model_speed'][:,:] 

print 'iy,ix' #appears to be the index of the value of Lat,lon 
print SARwind[iy,ix] 


ncfile.close() 

を今、私はデータを見つけ、座標のセットを抽出するために、座標coord_listを含むテキストファイルをループにしようとしていますリスト内の次の座標セットに移動します。このコードは以下のようにそれ自身の上で動作します:

import csv 
from decimal import Decimal 
with open('Turbine_locs_no_header.csv','rb') as f: 
    reader = csv.reader(f) 
    #coord_list = list(reader) 
    coord_list = [reader] 
    end_row = len(coord_list) 

    lon_ind=1 
    lat_ind=2 

for row in range(0, end_row-1):#end_row - 1 due to the 0 index 
    turbine_lat = coord_list[row][lat_ind] 
    turbine_lon = coord_list[row][lon_ind] 
    turbine_lat = [Decimal(turbine_lat)] 
    print 'lat',turbine_lat, 'lon',turbine_lon, row 

しかし、私は、変数iy, ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon)と番号を交換し、元のコードiy,ix = tunnel_fast(latvar, lonvar, 51.94341, 1.922094888)のこの部分にテキストファイルから座標を渡したいです。私はturbine_latturbine_lonはリスト項目ですので、使用することはできませんので、これはと思ったが、これはしていないようです、私は

File "C:/Users/mm/test_nc_bycoords_GG_turbines_AGW.py", line 65, in <module> 
    get_coordinates(coord_list, latvar, lonvar) 
    File "C:/Users/mm/test_nc_bycoords_GG_turbines_AGW.py", line 51, in get_coordinates 
    iy, ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon) 
    File "C:/Users/mm/test_nc_bycoords_GG_turbines_AGW.py", line 27, in tunnel_fast 
    lat0_rad = lat0 * rad_factor 
TypeError: can't multiply sequence by non-int of type 'float' 

次のエラーを取得し、機能get_coordinatesを作成することによって、2つのコードを結合してみてくださいエラーに接続されています。私はこのコードがもっと仕事を必要としていることを知っていますが、誰かが私が間違っているところにいるのを助けてくれれば助けになるでしょう。 2つのコードを組み合わせる私の試みは以下の通りです。

import numpy as np 
import netCDF4 
from math import pi 
from numpy import cos, sin 
import csv 

# edited from https://github.com/Unidata/unidata-python-workshop/blob/a56daa50d7b343c7debe93968683613642d6b9f7/notebooks/netcdf-by-coordinates.ipynb 

def tunnel_fast(latvar,lonvar,lat0,lon0): 
    ''' 
    Find closest point in a set of (lat,lon) points to specified point 
    latvar - 2D latitude variable from an open netCDF dataset 
    lonvar - 2D longitude variable from an open netCDF dataset 
    lat0,lon0 - query point 
    Returns iy,ix such that the square of the tunnel distance 
    between (latval[it,ix],lonval[iy,ix]) and (lat0,lon0) 
    is minimum. 
    ''' 

    rad_factor = pi/180.0 # for trignometry, need angles in radians 
    # Read latitude and longitude from file into numpy arrays 
    latvals = latvar[:] * rad_factor 
    lonvals = lonvar[:] * rad_factor 
    ny,nx = latvals.shape 
    lat0_rad = lat0 * rad_factor 
    lon0_rad = lon0 * rad_factor 
    # Compute numpy arrays for all values, no loops 
    clat,clon = cos(latvals),cos(lonvals) 
    slat,slon = sin(latvals),sin(lonvals) 
    delX = cos(lat0_rad)*cos(lon0_rad) - clat*clon 
    delY = cos(lat0_rad)*sin(lon0_rad) - clat*slon 
    delZ = sin(lat0_rad) - slat; 
    dist_sq = delX**2 + delY**2 + delZ**2 
    minindex_1d = dist_sq.argmin() # 1D index of minimum element 
    iy_min,ix_min = np.unravel_index(minindex_1d, latvals.shape) 
    return iy_min,ix_min 
#________________my edits___________________________________________________ 
def get_coordinates(coord_list, latvar, lonvar): 
    "this takes coordinates from a .csv and assigns them to variables" 

    end_row = len(coord_list) 

    lon_ind=1 
    lat_ind=2 

    for row in range(0, end_row-1):#end_row - 1 due to the 0 index 
     turbine_lat = coord_list[row][lat_ind] 
     turbine_lon = coord_list[row][lon_ind] 
     iy, ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon) 
     print('Closest lat lon:', latvar[iy, ix], lonvar[iy, ix]) 

#________________________________________________________________________________________________________________________ 
ncfile = netCDF4.Dataset('NOGAPS_wind_level2_1.nc', 'r') 
latvar = ncfile.variables['latitude'] 
lonvar = ncfile.variables['longitude'] 

#____added in to pass to get coordinates function 
with open('Turbine_locs_no_header.csv','rb') as f: 
    reader = csv.reader(f) 
    coord_list = list(reader) 
#_________take latitude from coordinateas function 

get_coordinates(coord_list, latvar, lonvar) 

#iy,ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon)#get these from the 'assign_coordinates_fromlist.py 
#print('Closest lat lon:', latvar[iy,ix], lonvar[iy,ix]) 

SARwind = ncfile.variables['sar_wind'][:,:] 
ModelWind = ncfile.variables['model_speed'][:,:] 

print 'iy,ix' #appears to be the index of the value of Lat,lon 
print SARwind[iy,ix] 


ncfile.close() 

私は(the docsを参照してください)あなたは*argsを使用して引数リストを展開することができます

+0

最初のコード例でコードの書式を更新できますか。私は6文字分の更新はしません。 –

+0

@EmettSpeer。最初のセクションでインデントを修正しました。ソートが必要なものは何ですか? –

+0

私は1つの書式問題のみを発見しました。 –

答えて

0

おかげでそれはlat0の簡単な問題であり、それは<type 'float'>を必要とするときlon0tunnel_fast<type 'str'>として渡されます。これは、リストとしてcoord_listをロードすることから来ているように見えます。私が使用し

with open('Turbine_locs_no_header.csv','rb') as f: 
    reader = csv.reader(f) 
    coord_list = list(reader) 

回避策は、私がこれを行うにはよりエレガントな方法があると確信していますtunnel_fast

lat0 = float(lat0) 
lon0 = float(lon0) 

の先頭に浮いしlat0lon0を変換することでしたが、それは動作します。

1

を変換してみてください。あなたの場合、tunnel_fast(latvar, lonvar, *coord_list[row])を行うことができます。引数の順番がcoord_list[row]であることを確認し、coord_list[row]に2つ以上の値が含まれている場合は、適切にスライスする必要があります。 a_guest

から支援する

+0

ありがとう、トレースバックエラーは上記のi'、ix = tunnel_fast(latvar、lonvar、turbine_lat、turbine_lon)の代わりに 'iy、ix = tunnel_fast(latvar、lonvar、* coord_list [row] –

+1

問題は、 'lat0'(例えば)は' list'型で、 'float'による乗算をサポートしていません(ただし、' int'の乗算はあなたが望むものではありません! 'tunnel_fast'の始めに' print type(lat0) 'と' print lat0'をチェックしてください。あなたは何とか間違った引数を渡しています。 –

+0

はい、あなたは正しいです。コードの現行バージョンでは、動作しないバージョンでは ''と ' 'です。 –

関連する問題