Для тех в сообществе, которые все еще ищут ответ на этот вопрос, метод, который я в настоящее время реализую (для аналогичных целей - я пытаюсь проверить геолокацию спутниковых данных), требует маску.
Повсюду в Интернете доступны наборы данных маск, каждый из которых имеет свои правила и характеристики. Я работаю с данными netCDF4 в python, и моя маска - это набор данных .nc с сеткой, в котором элементы океана оцениваются как 1, а элементы земли - как 0.
Перебирая спутниковые данные, я умножаю каждое значение широты и долготы на количество элементов на градус в маске. В моем случае 120 градусов на градус в широте / долготе, поэтому
lon_inds = (lons*120).astype(int)
lat_inds = (lats*120).astype(int)
Более общий способ написания этого предполагает замену 120 на
len(lons)/360
len(lats)/180
соответственно. Оба примера этих операций могут быть выполнены практически мгновенно, если использовать пустые массивы (как в случае с модулем python netCDF4).
Теперь я создаю собственную маску: она должна иметь те же измерения, что и массив данных (для тех, кто не очень близко знаком со спутниками, массивы данных, лат и лоны будут иметь одинаковые измерения):
my_mask = np.zeros(data.shape, dtype=int)
Теперь все, что нам нужно сделать, это заменить значения в маске, где есть береговая линия. Это делается путем итерации массивов lat_inds и lon_inds для поиска значения в маске
landmask[lon_inds[i,j],lat_inds[i,j]]
и изменение значения
mask[i,j]
к 1, если кто-либо из соседей
landmask[lon_inds[i,j]-1,lat_inds[i,j]]
landmask[lon_inds[i,j]+1,lat_inds[i,j]]
landmask[lon_inds[i,j],lat_inds[i,j]-1]
landmask[lon_inds[i,j],lat_inds[i,j]+1]
не равны 0 (конечно, более плавная береговая линия может быть сгенерирована путем добавления соседних по диагонали ячеек, но в этом нет необходимости, так как, надеюсь, вам следует использовать набор данных наземной маски с более высоким пространственным разрешением, чем у спутниковых данных) .