Как нарисовать береговые линии на пользовательской карте без передискретизации - PullRequest
0 голосов
/ 08 января 2011

Я хотел бы отобразить спутниковое изображение (желательно с использованием Python, но приветствуются другие решения). Он состоит из параметра P с плавающей запятой, имеющего размерность NxM, и каждый пиксель геолоцируется полями широты и долготы (каждый размером NxM). Поэтому я хотел бы:

(1) создать изображение параметра P со связанной цветовой шкалой. Изображение не должно пересчитываться, поэтому оно должно иметь размерность NxM

(2) отображать береговые линии над этим изображением

В настоящее время я могу сделать (1), используя PIL. Я также могу использовать библиотеку базовой карты для отображения изображения и береговых линий, но я не знаю, как это сделать без перепроецирования, оставаясь в собственной проекции изображения с размером NxM.

Редактировать: параметр P не содержит никакой информации о береговой линии. Только местоположение (широта, долгота) пикселей должно использоваться для наложения береговой линии. Координаты береговой линии можно получить, например, из gshhs . gshhs фактически используется в библиотеке базовых карт.

Ответы [ 2 ]

0 голосов
/ 02 июня 2016

Для тех в сообществе, которые все еще ищут ответ на этот вопрос, метод, который я в настоящее время реализую (для аналогичных целей - я пытаюсь проверить геолокацию спутниковых данных), требует маску.

Повсюду в Интернете доступны наборы данных маск, каждый из которых имеет свои правила и характеристики. Я работаю с данными 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 (конечно, более плавная береговая линия может быть сгенерирована путем добавления соседних по диагонали ячеек, но в этом нет необходимости, так как, надеюсь, вам следует использовать набор данных наземной маски с более высоким пространственным разрешением, чем у спутниковых данных) .

0 голосов
/ 08 января 2011

Если все, что вы пытаетесь сделать, - это расширить границы между землей и водой, было бы хорошо использовать фильтр верхних частот.

Например, начните с Лены: alt text

и примените фильтр верхних частот: alt text

, затем наложите верхний проход поверх оригинала: alt text

(более подробную информацию и примеры можно найти здесь ).

Вы можете найти фильтры в scipy здесь .

...