Как я могу рассчитать количество солнечных часов для данного дня и места, учитывая близлежащие горы (с Python)? - PullRequest
0 голосов
/ 26 мая 2020

Моя цель состоит в том, чтобы вычислить количество часов для данного дня, в течение которых солнце светит в данном месте, используя Python, при условии ясного неба. Проблема возникает из-за поиска недвижимости. Я хотел бы знать, сколько солнца я действительно получу от некоторой собственности, чтобы мне не приходилось полагаться на заявления, сделанные продавцом недвижимости, и я мог бы судить об объекте исключительно по адресу. Я ищу в районе с несколькими близлежащими горами, которые следует учитывать при расчете. Подход, который я хотел бы использовать, следующий:

  1. В течение всего года (с 1.1.2020 по 31.12.2020) с заданным временным разрешением (например, в минутах) вычислить высоту и азимут углы солнца для определенного местоположения.
  2. Найдите angular высоту ближайших препятствий, если смотреть с места, получая пары значений азимута и углов высоты. Это могут быть деревья, постройки или уже упомянутые горы. Предположим, что деревья и здания незначительны, и это в основном горы, которые забирают солнце.
  3. Каждый день проверяйте каждый раз с заданным разрешением, не превышает ли угол высоты Солнца высоту угол препятствия в азимутальном положении солнца. Тогда для каждого дня года я могу узнать, в какое время видно солнце.

Шаги 1 и 3 просты. Для шага 1 я могу использовать, например, модуль pysolar Python. Шаг 2 более сложный. Если бы я стоял на совершенно плоской плоскости, которая простирается далеко до горизонта, высота препятствия была бы 0 для всех азимутальных углов. Если бы поблизости была гора, мне нужно было бы знать форму горы, как видно с места. К сожалению, я даже не знаю, с чего начать решение шага 2, и я не знаю, как назвать эту проблему, т.е. я не знаю, как найти решение в Google. В лучшем случае был бы модуль Python, который будет выполнять эти вычисления за меня, например, подключаясь к данным топографии на основе OpenStreetMap или других сервисов. Если такой модуль не существует, мне пришлось бы вручную запрограммировать доступ к данным топографии, а затем выполнить какой-либо тип поиска по сетке - разделить ландшафт на мелкую сетку (возможно, сферические координаты), вычислить высоту и азимутальный угол точек сетки как видно из местоположения (с учетом кривизны земли и высоты в местоположении) и найти максимум для данного азимутального угла. Есть ли более простые способы сделать это? Существуют ли Python модули, которые это делают?

1 Ответ

0 голосов
/ 26 мая 2020

Шаг 2 не так уж и сложен, если у вас есть карта высот, и я уверен, что есть карты высот.

Равномерно распределите n лучей от вашего местоположения и посетите все позиции на карте через каждые delta метра от вашей начальной позиции вдоль этого луча. Если d - это расстояние от точки до вас, h - это ее высота, а h0 - ваша высота на карте высот, сохраняйте максимальное значение (h-h0)/d вдоль пути (если что-то вдвое дальше, чем требуется быть вдвое выше, чтобы отбрасывать тень той же длины).

Кривизну Земли можно в значительной степени игнорировать - ее влияние на преграду солнечного света незначительно.

...