2017-01-04 5 views
0

workshop의 일부 코드를 사용하여 지정한 좌표에 가장 가까운 좌표로 netCDF 파일의 데이터를 추출합니다. 데이터를 찾을 수파이썬 : 목록에서 함수로 좌표 전달하기

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 포함 된 텍스트 파일을 통해 루프를 시도하고있다 : 좌표의 한 세트를 사용하면 내가 다음과 같이 문제없이 필요한 값을 추출 할 수 있어요 그런 다음 목록의 다음 좌표 세트로 이동하십시오. 변수 iy, ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon)와 숫자를 대체

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, 51.94341, 1.922094888)이 부분에 텍스트 파일에서 좌표를 전달하려는 :이 코드는 다음과 같이 그 자체에서 작동합니다. 내가 함수 get_coordinates를 작성하여이 개 코드를 결합하려고, 나는 다음과 같은 오류

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' 

내가 turbine_latturbine_lon 그렇게 사용할 수없는 목록 항목이기 때문에 이것이 생각 얻을 수 있지만이 될 것 같지 않습니다 오류에 연결됩니다. 어쨌든이 코드는 더 많은 작업이 필요하다는 것을 알고 있지만 누군가 내가 잘못 가고있는 부분에 도움이된다면 도움이 될 것입니다. 두 코드를 결합하려는 시도는 다음과 같습니다.

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

한 가지 형식 문제 만 발견했습니다. –

답변

0

감사는 <type 'float'>을 필요로 할 때 tunnel_fast<type 'str'>로 전달되는 lat0lon0의 간단한 문제였다

a_guest에서 도움이됩니다. 이것은 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]에 두 개 이상의 값이 포함되어 있으면 적절하게 슬라이스해야합니다.

+0

감사합니다. 추적 오류는'iy, ix = tunnel_fast (latvar, lonvar, turbine_lat, turbine_lon) 대신'iy, ix = tunnel_fast (latvar, lonvar, * coord_list [ –

+1

문제는'lat0' (예를 들어)는'list' 타입이기 때문에'float'에 의한 곱셈을 지원하지 않습니다. ('int'에 의한 곱셈은 여러분이 원하는 것이 아닐 것입니다!). 'tunnel_fast'의 시작 부분에서'print type (lat0)'와'print lat0'을 확인하면 알 수 있습니다. 당신은 어떻게 든 잘못된 주장을 전달하고 있습니다. –

+0

네가 맞아.코드의 실제 버전에서 작동하지 않는 버전에서는''및' '입니다. –