2014-11-06 4 views
5

THREDDS가 제공하는 삼각형 메쉬 모델에서 데이터의 하위 집합을 얻으려고합니다. LAT/LON 경계 상자를 지정하고 해당 상자 내에서 데이터를 가져올 수 있어야합니다. 데이터 URL은 다음과 같습니다 리딩 된 데이터와구조화되지 않은 THREDDS 데이터를 서브 샘플링하기위한 쉬운 스크립트 방식.

http://www.smast.umassd.edu:8080/thredds/dodsC/FVCOM/NECOFS/Forecasts/NECOFS_MET_FORECAST.nc

THREDDS 서버에서 데이터를 부분 집합 꽤 쉽다. 누구든지 가장 좋은 방법은 THREDDS가 제공하는 삼각형 메쉬의 하위 도메인을 얻는 것입니다.

격자 된 데이터의 경우 OPeNDAP 클라이언트로 Ferret을 사용하며 다운로드 프로세스를 스크립팅 할 수 있습니다. Matlab, Python 또는 다른 도구를 사용할 수도 있지만 비슷한 것을하고 싶습니다.

감사합니다,

스티브

답변

4

Opendap와 netCDF의 불규칙한 색인을 사용하여 추출을 허용하지 않습니다. 시작, 중지 및 보폭 만 요청할 수 있습니다.

그리고 이것이 삼각형 격자이기 때문에 동일한 영역의 삼각형 노드가 유사한 색인을 가지고 있다고 보장 할 수 없습니다. 따라서 경계 상자 내의 노드 만 가져 오려면 하나씩 요청해야합니다. 그리고 그것은 느립니다. 따라서 대부분의 경우 최소 및 최대 인덱스를 결정하고 전체 덩어리를 한 조각으로 요청한 다음 필요에 따라 인덱스를 추출하는 것이 더 빠릅니다.

다음은 파이썬에서 두 가지 접근법을 비교 한 샘플입니다. 우리는 각 인덱스를 통해 루프가 느린 경우

import netCDF4 
import time 
import numpy as np 

url='http://www.smast.umassd.edu:8080/thredds/dodsC/FVCOM/NECOFS/Forecasts/NECOFS_GOM3_FORECAST.nc' 
nc = netCDF4.Dataset(url) 
ncv = nc.variables 
lon = ncv['lon'][:] 
lat = ncv['lat'][:] 
tim = ncv['time'][:] 

# find indices inside box 
box = [-71.4,41,-70.2,41.5] 
ii = (lon>=box[0])&(lon<=box[2])&(lat>=box[1])&(lat<=box[3]) 
# jj will have just indices from inside the box: 
jj = np.where(ii)[0] 

:

# loop over indices, extracting time series 
time0=time.time() 
zi = np.zeros((len(tim),len(jj))) 
k=0 
for j in jj: 
    zi[:,k]=ncv['zeta'][:,j] 
    k +=1 
print('elapsed time: %d seconds' % (time.time()-time0)) 

elapsed time: 56 seconds 
이 예에서 모든 인덱스를 포함하는 부분 집합을 추출하는 추출, 시계열 각 인덱스를 통해 반복보다 약 10 배 빠른 각 시간 단계에서 범위 우리는 루프 경우

는하지만, 훨씬 더 빠르다 : 물론

time0=time.time() 
zi2 = np.zeros((len(tim),len(jj))) 
jmin=jj.min() 
jmax=jj.max() 

for i in range(len(tim)): 
    ztmp = ncv['zeta'][i,jmin:jmax+1] 
    zi2[i,:] = ztmp[jj-jmin] 
print('elapsed time: %d seconds' % (time.time()-time0)) 

elapsed time: 6 seconds 

하면 결과는 구조화되지 않은 그리드의 크기에 따라 페이지의 근접 다를 수 있습니다 당신의 추출물의 점수, 추출한 점수 등을 포함 할 수 있습니다.

+0

감사합니다. 이것은 매우 도움이됩니다. 나는 이것을 바탕으로 무언가를 찾으려고 노력할 것이다.목표는 하위 집합으로 NetCDF 파일을 갖는 것입니다. 흰 족제비에서는'save/file = myfile.nc/i = 55 : 94/j = 204 : 253 TEMP, SALINITY'와 같이 간단하게 온도와 염분의 작은 파일을 만들었습니다. 당신이 제공 한 것과 함께 일하고 NetCDF에 저장할 코드를 추가하려고합니다. –

2

성능 제약 조건이 매우 까다로운 경우 리치의 대답이이 작업을 수행하는 가장 좋은 방법입니다. 그러나 그가 말했듯이 결과는 메쉬와 부분 집합 영역에 따라 다를 수 있습니다.

time0 = time.time() 
zi3 = ncv['zeta'][0, :] 
zi3 = zi3[jj] 
print('elapsed time: %d seconds' % (time.time() - time0)) 

elapsed time: 0 seconds 
:

당신이 (웃기려는 의도 없음) 한 번에 1 시간 단계에만 관심이있는 경우, DAP 서버에서 그대로 단지 전체 공간 영역을 잡기 위해 한계 비용과 더 쉽게 코드가있다

프로파일을 만들었을 때 (배열을 미리 할당하는 경우에도)이 메쉬와 특정 공간 하위 집합이 주어지면 Rich가 수행하는 거친 최소/최대 하위 집합은 약 2 배 빠릅니다. NECOFS 메쉬는 구조화되지 않은 메쉬의 세계에서 상대적으로 작습니다. 예를 들어 대서양 규모의 ADCIRC 메쉬에 문제가 발생할 수 있습니다.

POSTSCRIPT : 하위 설정 색인을 결정하기 위해 어쨌든 위도와 경도를 얻으면 전체 눈금을 잡으려고합니다.