Простой способ с помощью сценариев для подвыборки неструктурированных данных THREDDS?

Я пытаюсь получить подмножество данных из модели треугольной сетки, которая обслуживается THREDDS. Я хотел бы иметь возможность указать ограничивающую рамку LAT/LON и просто получить данные из этой рамки. URL-адрес данных:

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

С данными с координатной сеткой довольно легко получить подмножество данных с сервера THREDDS. Кто-нибудь знает, как лучше всего получить поддомен треугольной сетки, обслуживаемый THREDDS?

Для данных с координатной сеткой я использую Ferret в качестве клиента OPeNDAP, и я могу написать сценарий процесса загрузки. Я хотел бы сделать что-то подобное здесь, хотя я мог бы использовать Matlab, Python или другие инструменты.

Спасибо,

Стив


person Steve Cousins    schedule 06.11.2014    source источник


Ответы (2)


Opendap и NetCDF не допускают извлечение с использованием нерегулярной индексации. Вы можете только запросить старт, остановку и шаг.

А поскольку это треугольная сетка, нет гарантии, что узлы треугольников в одной области имеют одинаковые индексы. Поэтому, если вы хотите получить только те узлы в ограничивающей рамке, вам придется запрашивать их один за другим. И это медленно. Таким образом, во многих случаях быстрее определить минимальный и максимальный индексы и запросить весь фрагмент целиком, а затем извлечь индексы по мере необходимости.

Вот пример сравнения двух подходов в Python. В этом примере извлечение подмножества, включающего все индексы, выполняется примерно в 10 раз быстрее, чем цикл по каждому индексу, извлекающий временные ряды:

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

Но если мы будем перебирать диапазон на каждом временном шаге, это будет намного быстрее:

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

Конечно, ваши результаты могут различаться в зависимости от размера неструктурированной сетки, близости точек в вашем подмножестве, количества точек, которые вы извлекаете, и т. д. Но, надеюсь, это даст вам представление о возникающих проблемах.

person Rich Signell    schedule 07.11.2014
comment
Спасибо Рич. Это очень полезно. Постараюсь придумать что-нибудь на основе этого. Цель состоит в том, чтобы иметь файл NetCDF с подмножеством. В Ferret это было так же просто, как: save/file=myfile.nc/i=55:94/j=204:253 TEMP,SALINITY создать небольшой файл только температуры и солености в интересующей меня области. Я буду работать с тем, что вы предоставили, и попытаюсь добавить код для сохранения в NetCDF. - person Steve Cousins; 08.11.2014

Ответ Рича предлагает лучший способ сделать это, если у вас действительно жесткие ограничения производительности. Но, по его словам, результаты могут различаться в зависимости от сетки и области подмножества.

Если вас интересует только 1 временной шаг за раз (без каламбура), существует предельная стоимость и гораздо более простой код, чтобы просто получить всю пространственную область как есть с сервера dap:

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

elapsed time: 0 seconds

При профилировании (даже при предварительном распределении массивов) грубое минимальное/максимальное подмножество, которое делает Рич, примерно в 2 раза быстрее, учитывая эту сетку и конкретное пространственное подмножество. Сетка NECOFS относительно мала в мире неструктурированных сеток. Например, у вас могут возникнуть проблемы с сетками ADCIRC атлантического масштаба.

ПОСТСКРИПТ: Вы захватываете всю сетку, когда вы все равно получаете широту и долготу, чтобы определить индексы подмножества.

person acrosby    schedule 07.11.2014