Объем солнечной тени (3D Analyst)
Резюме
Создает замкнутые объемы, которые моделирует затенение по каждому объекту, используя положение солнца в заданную дату и время.
Использование
Полигональные и линейные объекты можно использовать в качестве входных данных, если они являются вытянутыми слоями 3D. Свойства вытягивания можно применить к векторному слою в ArcScene или ArcGlobe, что приведет к преобразованию объекта в мультипатч.
Более подробно об использовании вытягивания для моделирования 3D символов
Все входные объекты должны располагаться в одном месте, поскольку соответствующие расчеты положения солнца основываются на положении первого объекта в первом классе объектов.
Тени, моделирующие состояние при восходе и заходе солнца можно создать, указав только дату в параметрах Дата и время начала и Дата и время окончания, соответственно. Теневые объемы не будут созданы, если солнце не видно в заданную дату и время, или если оно расположено под вертикальным углом 90 градусов к входным объектам.
Тени моделируются как замкнутые объекты-мультипатчи, путем вытягивания входных объектов в направлении солнечного света. Солнечные лучи считаются параллельными и движущимися в направлении, вычисленном для относительного положения солнца. Каждый теневой объем начинается и заканчивается на вертикальной плоскости, перпендикулярной горизонтальной проекции солнечных лучей.
Следующие поля будут добавлены в таблицу атрибутов объектов-теневых объемов:
- SOURCE – имя класса объектов, для которых рассчитывается объем тени.
- SOURCE_ID – уникальный ID объекта, для которого рассчитывается объем тени.
- DATE_TIME – местные дата и время, использующиеся для расчета положения солнца.
- AZIMUTH – угол в градусах между истинным севером и перпендикулярной проекцией относительного положения солнца к земному горизонту. Значения находятся в диапазоне от 0 до 360.
- VERT_ANGLE – угол в градусах между земным горизонтом и относительным положением солнца, где горизонт определяется как 0 градусов, а 90 градусов – это положение непосредственно над ним.
Примечание:Обычно каждый теневой объем выглядит так, чтобы тень была рядом с объектом (огибала его) или слегка от него отбрасывалась. Если тень нельзя создать таким способом, она будет создана, начиная от границы внешнего экстента объекта. Если хотя бы одна тень создается таким способом, добавляется поле HUGS_FEATR, в котором обозначаются тени, созданные вплотную к своим объектам.
Синтаксис
Параметр | Объяснение | Тип данных |
in_features [in_features,...] |
Объекты-мультипатчи, которые будут использоваться для моделирования теней. Также можно использовать полигональные и линейные объекты, если они добавляются как вытянутый слой 3D. | Feature Layer |
start_date_and_time |
Дата и время, по которым будет вычисляться траектория солнечного света для моделирования теней. | Date |
out_feature_class |
Класс пространственных объектов-мультипатчей, который будет хранить полученные объемы теней. | Feature Class |
adjusted_for_dst (дополнительно) |
Указывает, устанавливается ли значение времени в формате "летнего времени" (DST).
| Boolean |
time_zone (дополнительно) |
Часовой пояс, в котором размещен задействованный входной объект. Значением по умолчанию является часовой пояс, на который настроена операционная система. | String |
end_date_and_time (дополнительно) |
Конечные дата и время для расчета положения солнца. Если предоставлена только дата, в качестве конечного времени будет взят заход. | Date |
iteration_interval (дополнительно) |
Значение, используемое для определения итерации времени с даты начала. | Double |
iteration_unit (дополнительно) |
Единицы, определяющие значение итерации, применяемое к Дате и времени начала (Start Date and Time).
| String |
Пример кода
В следующем примере показано использование этого инструмента в окне Python:
import arcpy
from arcpy import env
arcpy.CheckOutExtension('3D')
env.workspace = 'C:/data'
arcpy.SunShadowVolume_3d(['sample.fgdb/buildings_1', 'buildings_2.shp'],
'12/25/2011 10:00 AM', 'shadows_dec25.shp',
'ADJUSTED_FOR_DST', 'Eastern_Standard_Time',
'12/25/2011 3:00 PM', 'HOURS', 1)
В следующем примере показано использование этого инструмента в автономном скрипте Python:
'''*********************************************************************
Name: Model Shadows For GeoVRML Models
Description: Creates a model of the shadows cast by GeoVRML models
imported to a multipatch feature class for a range of dates
and times. A range of times from the start time and end
time can also be specified by setting the EnforceTimes
Boolean to True. This sample is designed to be used in a
script tool.
*********************************************************************'''
# Import system modules
import arcpy
from datetime import datetime, time, timedelta
#************************* Script Variables **************************
inFiles = arcpy.GetParameterAsText(0) # list of input features
spatialRef = arcpy.GetParameterAsText(1) # list of GeoVRML files
outFC = arcpy.GetParameterAsText(2) # multipatch from 3D files
inTimeZone = arcpy.GetParameterAsText(3) # time zone
startDate = arcpy.GetParameter(4) # starting date as datetime
endDate = arcpy.GetParameter(5) # ending date as datetime
dayInterval = arcpy.GetParameter(6) # day interval as long (0-365)
minInterval = arcpy.GetParameter(7) # minute interval as long (0-60)
enforceTime = arcpy.GetParameter(8) # minute interval as Boolean
outShadows = arcpy.GetParameterAsText(9) # output shadow models
outIntersection = arcpy.GetParameterAsText(10) # shadow & bldg intersection
# Function to find all possible date/time intervals for shadow modelling
def time_list():
dt_result = [startDate]
if dayInterval:
if endDate: #Defines behavior when end date is supplied
while startDate < endDate:
startDate += timedelta(days=dayInterval)
dt_result.append(startDate)
dt_result.append(endDate)
else: # Behavior when end date is not given
daymonthyear = datetime.date(startDate)
while startDate <= datetime(daymonthyear.year, 12, 31, 23, 59):
startDate += timedelta(days=dayInterval)
dt_result.append(startDate)
return dt_result
try:
arcpy.CheckOutExtension('3D')
importFC = arcpy.CreateUniqueName('geovrml_import', 'in_memory')
# Import GeoVRML files to in-memory feature
arcpy.ddd.Import3DFiles(inFiles, importFC, 'ONE_FILE_ONE_FEATURE',
spatialRef, 'Z_IS_UP', 'wrl')
# Ensure that building models are closed
arcpy.ddd.EncloseMultiPatch(importFC, outFC, 0.05)
# Discard in-memory feature
arcpy.management.Delete(importFC)
dt_result = time_list()
for dt in dt_result:
if dt == dt_result[0]:
shadows = outShadows
else:
shadows = arcpy.CreateUniqueName('shadow', 'in_memory')
arcpy.ddd.SunShadowVolume(outFC, dt, shadows, 'ADJUST_FOR_DST',
inTimeZone, '', minInterval, 'MINUTES')
if dt is not dt_result[0]:
arcpy.management.Append(shadows, outShadows)
arcpy.management.Delete(shadows)
arcpy.ddd.Intersect3D(outFC, outIntersection, outShadows, 'SOLID')
arcpy.CheckInExtension('3D')
except arcpy.ExecuteError:
print arcpy.GetMessages()
except:
# Get the traceback object
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
# Concatenate error information into message string
pymsg = "PYTHON ERRORS:\nTraceback info:\n{0}\nError Info:\n{1}"\
.format(tbinfo, str(sys.exc_info()[1]))
msgs = "ArcPy ERRORS:\n {0}\n".format(arcpy.GetMessages(2))
# Return python error messages for script tool or Python Window
arcpy.AddError(pymsg)
arcpy.AddError(msgs)