Метод затенения или наложения растровой карты для отражения времени суток и окружающего освещения

14
  • У меня есть дневной растр моего учебного района.
  • У меня есть 20+ счетчиков в области изучения, которые считают «материал» с отметкой времени.
  • Используя PyEphem, я определил тип внешнего освещения для каждой точки собранных данных.

Что я хотел бы сделать:

  • Добавьте серый / полупрозрачный оверлей, чтобы отразить окружающий свет (Сумерки, Восход, день, закат и темнота).

  • Конечная цель: создать основанную на времени визуализацию сбора данных, которая выделяет время дня. Или сможете сделать снимок в определенное время с соответствующим затененным наложением.

  • Думайте об этом как об этом изображении:

день / ночь глобус источник

dassouki
источник
2
Дополнительные ответы (с рабочим кодом Mathematica ) появляются по адресу mathematica.stackexchange.com/questions/3326/… .
whuber

Ответы:

9

Резюме

Учитывая положение солнца, вы можете легко создать сетку интенсивности поверхностного света (игнорируя атмосферные и топографические эффекты) в широтных координатах. Перепроектируйте эту сетку по желанию и наложите ее на карту.

Детали

Формулы являются стандартными для сферических координат: единичный вектор, соответствующий сферической координате (lon, lat), равен

(cos(lon)cos(lat), sin(lon)cos(lat), sin(lat)).

Интенсивность зависит от косинуса между внешним направлением («вверх») и направлением на Солнце. Этот косинус является просто точечным произведением этих двух единичных векторов. То есть пусть (x, y, z) будет единичным вектором, указывающим на солнце (в геоцентрических координатах), преобразуем геодезическую (широта, долгота) центральной точки каждой ячейки сетки в единичный вектор (xi, eta, zeta) и вычислить

(x,y,z) . (xi, eta, zeta) = x*xi + y*eta + z*zeta.

Любые результаты, которые меньше 0, соответствуют невидимому солнцу, поэтому установите их на ноль.

Замечания по реализации

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

(Чтобы создать сетку широты или долготы, сформируйте сетку с координатами y или x соответственно в географических координатах, а затем спроецируйте ее.) Из этой исходной информации вычислите раз и навсегда три сетки [xi], [eta ] и [дзета] (или отдельная векторная сетка [xi, eta, zeta]) для представления направлений вверх в ячейках сетки. Для любого данного положения на солнце вычисление становится простой линейной комбинацией [xi], [eta] и [zeta], приведенной выше; Солнце определяет коэффициенты x, y и z (которые, конечно, являются просто числами).

пример

Вот карта мира в проекции Плат Карри с такой сеткой интенсивности (216 на 432 ячейки).

интенсивность

Главный меридиан находится в центре, а север, как обычно, на вершине. Для этого расчета я установил солнечный вектор, пропорциональный (0,6, -0,8, 0,5), чтобы приблизиться к летнему дню в полдень над срединно-атлантическим океаном. (В ретроспективе z-значение 0,4 было бы более реалистичным; солнце никогда не заходило так далеко на север.)

Альфа-оверлей (который делает более яркие области также немного более прозрачными) на цветной карте Aster создает это изображение.

Карта мира

С течением времени солнечный вектор (x, y, z) пересчитывается, что требует пересчета сетки интенсивности. Это быстрый расчет. Вам также не нужно высокое разрешение: я использовал только одну десятую разрешения исходной сетки (2160 на 4320 ячеек) для этой иллюстрации. Интерполяция, используемая для отображения сетки более грубой интенсивности, прекрасно работает для заполнения пробелов. Это должно позволить вам практически мгновенно изменять отображение, создавая плавную анимацию.

Whuber
источник
2
Очень, очень приятно