2017-01-04 2 views
0

Ich verwende einen Code aus einer workshop, um Daten aus netCDF-Dateien mit den Koordinaten zu extrahieren, die meinen angegebenen Koordinaten am nächsten sind. Wenn nur ein Satz von Koordinaten bin ich in der Lage, die Werte zu extrahieren I wie unten ohne Probleme müssen:Python: Übergeben von Koordinaten von der Liste zur Funktion

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() 

nun durch eine Textdatei Schleife enthält Ich versuche coord_list Koordinaten Sätze von Koordinaten zu extrahieren, die Daten finden Bewegen Sie sich dann zum nächsten Satz von Koordinaten in der Liste. Dieser Code funktioniert auf seine eigene, wie unten:

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 

Allerdings möchte ich Koordinaten aus der Textdatei in diesem Teil des ursprünglichen Codes iy,ix = tunnel_fast(latvar, lonvar, 51.94341, 1.922094888), passieren die Zahlen mit Variablen zu ersetzen iy, ix = tunnel_fast(latvar, lonvar, turbine_lat, turbine_lon). Ich versuche, die beiden Codes zu kombinieren, indem eine Funktion get_coordinates erstellen, erhalte ich die folgenden Fehler

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' 

Ich dachte, dies weil die turbine_lat und turbine_lon Liste sind Elemente können so nicht verwendet werden, aber dies scheint nicht zu sein verbunden mit den Fehlern. Ich weiß, dass dieser Code sowieso mehr Arbeit braucht, aber wenn mir jemand helfen könnte, herauszufinden, wo ich falsch liege, wäre das sehr hilfreich. Mein Versuch, die beiden Codes zu kombinieren, ist unten.

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() 

Wenn ich versuche,

+0

Können Sie die Codeformatierung in Ihrem ersten Codebeispiel bitte aktualisieren. Ich würde aber nicht 6 Zeichen wert Updates. –

+0

@EmettSpeer. Ich habe die Einrückung im ersten Abschnitt behoben, was muss noch sortiert werden? –

+0

Ich habe nur das eine Formatierungsproblem entdeckt. –

Antwort

0

Dank von a_guest

Es war ein einfaches Problem der lat0 und lon0 sind vergangen als <type 'str'>-tunnel_fast zu helfen, wenn es <type 'float'> erfordert. Dies scheint von dem Laden der coord_list als eine Liste zu kommen. Ich

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

Die Abhilfe verwenden lat0 und lon0 konvertieren zu Beginn der tunnel_fast

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

schwimmt Ich bin sicher, dass es eine elegantere Möglichkeit, dies zu tun, aber es funktioniert.

1

Sie konvertieren kann ein Argument Liste auspacken *args (siehe the docs). In Ihrem Fall könnten Sie tunnel_fast(latvar, lonvar, *coord_list[row]) tun. Sie müssen sicherstellen, dass die Reihenfolge der Argumente in coord_list[row] korrekt ist und wenn coord_list[row] mehr als die zwei Werte enthält, müssen Sie es entsprechend zerlegen.

+0

Danke, der Traceback-Fehler ist der selbe wie der obige mit 'iy, ix = tunnel_fast (latvar, lonvar, * coord_list [row]) 'anstelle von' iy, ix = tunnel_fast (latvar, lonvar, turbine_lat, turbine_lon) ' –

+1

Das Problem ist, dass 'lat0' (zum Beispiel) vom Typ' list' ist und somit die Multiplikation mit 'float' nicht unterstützt (obwohl die Multiplikation mit' int' wahrscheinlich auch nicht das ist, was Sie wollen!). Überprüfe 'print type (lat0)' und 'print lat0' am Anfang von' tunnel_fast' und du wirst sehen. Du gibst irgendwie die falschen Argumente. –

+0

Ja, du hast Recht.in der Arbeitsversion des Codes ist es '' und '' in der nicht funktionierenden Version. –

Verwandte Themen