2017-12-12 20 views
-2

지형/측심 정보 (기본적으로 x [십진수로 경도], y [십진수로 위도]를 포함하는 그리드) 및 파이썬 3에서 작업하려고합니다. z [미터]).netCDF 그리드 파일 : 2D 값을 사용하여 1D 배열에서 정보 추출

그리드 파일의 확장자는 .nc이므로 netCDF 파일입니다. 일반적으로 나는 Generic Mapping Tools와 같은 매핑 툴에서 이것을 사용할 것이고 netCDF 파일이 어떻게 작동하는지 귀찮게하지 않아도되지만 파이썬 스크립트로 특정 정보를 추출해야한다. 지금은 데이터 세트를 특정 경도/위도 범위로만 제한합니다.

그러나 지금은 특정 x 값과 y 값에 대해 z 정보를 얻는 방법에 대해 약간 분실되어 있습니다. 여기에 지금까지 데이터에 대해 무엇을 알고

import netCDF4 

#---------------------- 
# Load netCDF file 
#---------------------- 
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc' 
fh = netCDF4.Dataset(bathymetry_file, mode='r') 

#---------------------- 
# Getting information about the file 
#---------------------- 
print(fh.file_format) 

NETCDF3_CLASSIC

print(fh) 

root group (NETCDF3_CLASSIC data model, file format NETCDF3): title: GEBCO_08 Grid source: 20100927 dimensions(sizes): side(2), xysize(933120000) variables(dimensions): float64 x_range(side), float64 y_range(side), int16 z_range(side), float64 spacing(side), int32 dimension(side), int16 z(xysize) groups:

print(fh.dimensions.keys()) 

odict_keys(['side', 'xysize'])

print(fh.dimensions['side']) 

: name = 'side', size = 2

print(fh.dimensions['xysize']) 
,673,804,383,210
#---------------------- 
# Variables 
#---------------------- 
print(fh.variables.keys()) # returns all available variable keys 

odict_keys(['x_range', 'y_range', 'z_range', 'spacing', 'dimension', 'z'])

xrange = fh.variables['x_range'][:] 
print(xrange) 

[-180. 180.] # contains the values -180 to 180 for the longitude of the whole world

yrange = fh.variables['y_range'][:] 
print(yrange) 

[-90. 90.] # contains the values -90 to 90 for the latitude of the whole world

zrange = fh.variables['z_range'][:] 

[-10977 8685] # contains the depths/topography range for the world

spacing = fh.variables['spacing'][:] 

[ 0.00833333 0.00833333] # spacing in both x and y. Equals the dimension, if multiplied with x and y range

,369,136 난 아직도 특정 X/Y (위도/경도) 값 Z에 액세스하는 방법을 모르는이 정보를 바탕으로
dimension = fh.variables['dimension'][:] 

[43200 21600] # corresponding to the shape of z if it was the 2D array I would've hoped for (it's currently an 1D array of 9333120000 - which is 43200*21600)

z = fh.variables['z'][:] # currently an 1D array of the depth/topography/z information I want 
fh.close 

(3210). 기본적으로 z의 1D 배열을 경도/위도 값에 해당하는 2D 배열로 변환해야한다고 생각합니다. 나는 그걸하는 법을 모른다. 사람들이 1D를 2D 배열로 변환하려고 시도한 일부 게시물에서 보았지만, 나는 세계의 어느 구석에서 시작하고 어떻게 진행되는지 알 수있는 방법이 없습니다.

3 년 전인 similar post이 있다는 것을 알고 있습니다. 그러나 문제를 해결하기 위해 아날로그 배열 "인덱스를 찾는 방법을 모르겠습니다. 누군가 도울 수 있습니까?

답변

0

먼저 z의 크기 (위도, 경도, 깊이) 세 가지를 모두 읽은 다음 각 치수에서 값을 추출해야합니다. 다음은 몇 가지 예입니다. 당신은 위도/경도/깊이 입력 한 숫자는 예를 들어 그 차원에서 인덱스 아닌 실제 위도이라고

# Read in all 3 dimensions [lat x lon x depth] 
z = fh.variables['z'][:,:,:] 

# Topography at a single lat/lon/depth (1 value): 
z_1 = z[5,5,5] 

# Topography at all depths for a single lat/lon (1D array): 
z_2 = z[5,5,:] 

# Topography at all latitudes and longitudes for a single depth (2D array): 
z_3 = z[:,:,5] 

참고. 미리 찾고있는 값의 색인을 결정해야합니다.

+0

불행하게도 위도도도 긴 두 개 이상의와 직접 유일한 변수를 읽을 수 값은 z였습니다. 1D 배열 – Tobitobitobi

+0

저는 이것을 확실하게하려고 시도했는데 "ValueError : 슬라이싱식이 변수의 차원 수를 초과했습니다"라는 오류가 발생했습니다. – Tobitobitobi

0

방금 ​​해결책을 찾았습니다. this post. 미안 해요 전에는 그것을 보지 못했습니다. 여기 내 코드가 어떻게 생겼는지. Dave에게 감사드립니다 (그는 위의 게시물에서 자신의 질문에 답변했습니다). 작업해야 할 유일한 것은 치수가 정수를 유지해야한다는 것입니다. I가 ZZ 및 bathy (다음 코드) 모두의 형상을 보면

import netCDF4 
import numpy as np 

#---------------------- 
# Load netCDF file 
#---------------------- 
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc' 
fh = netCDF4.Dataset(bathymetry_file, mode='r') 

#---------------------- 
# Extract variables 
#---------------------- 
xrange = fh.variables['x_range'][:] 
yrange = fh.variables['y_range'][:] 
zz = fh.variables['z'][:] 
fh.close() 

#---------------------- 
# Compute Lat/Lon 
#---------------------- 
nx = (xrange[-1]-xrange[0])/spacing[0] # num pts in x-dir 
ny = (yrange[-1]-yrange[0])/spacing[1] # num pts in y-dir 
nx = nx.astype(np.integer) 
ny = ny.astype(np.integer) 
lon = np.linspace(xrange[0],xrange[-1],nx) 
lat = np.linspace(yrange[0],yrange[-1],ny) 

#---------------------- 
# Reshape the 1D to an 2D array 
#---------------------- 
bathy = zz[:].reshape(ny, nx) 

그래서, 현재, 전자는 933,120,000의 길이 43200x21600 치수와 후자의 2 차원 어레이와 1 차원 배열이다.

print(zz.shape) 
print(bathy.shape) 

다음 단계는 N1B4은 자신의 게시물에서 설명한 것처럼 정확하게 수심 측량/지형 데이터에 액세스하는 인덱스를 사용하는 것입니다