摘要
LayerTime 对象提供有关如何在已启用时间的图层中存储和配置时间的信息。
说明
时间信息(例如包含与要素关联的时间值的字段、数据的开始和结束时间、时间步长间隔等)不仅可以用于获取有关已启用时间的的图层上的时间属性的知识,还可以用于随时间执行进一步的数据管理和分析任务。 下面的示例 1 显示了如何使用 startTime 和 endTime 获取已启用时间的图层的时间范围。 下面的示例 2 显示了如何基于时间查询选择要素,然后将这些要素保存到单独的要素类中。 您还可以使用时间信息来确保为选择要素指定的时间在图层的开始和结束时间之内。
Layer 类中的 enableTime 方法允许您针对具有时间信息的图层启用时间,因此可以访问 LayerTime 属性。 下面的第二个示例演示了 enableTime。
属性
属性 | 说明 | 数据类型 |
daylightSavings (可读写) | 表示启用时间的图层中时间字段内的时间值在收集时是否遵循了输入时区的夏令时规则。 | Boolean |
endTime (可读写) | 启用时间的图层的结束日期和时间。 | DateTime |
endTimeField (可读写) | 包含结束时间值的字段名称。 并非所有图层都使用结束时间字段。 如果每个要素都有一个单一的时间字段,则仅将使用 startTimeField,并且 endTimeField 将为 None。 如果每个要素都有开始和结束时间字段,则 startTimeField 和 endTimeField 将同时使用。 | String |
startTime (可读写) | 启用时间的图层的开始日期和时间。 | DateTime |
startTimeField (可读写) | 包含开始时间值的字段名称。 如果每个要素都有一个单一的时间字段,则仅将使用 startTimeField,并且 endTimeField 将为 None。 如果每个要素都有开始和结束时间字段,则 startTimeField 和 endTimeField 将同时使用。 | String |
timeDimension (可读写) | 使用 netCDF 数据时包含时间值的维度的名称。 | String |
timeFormat (可读写) | startTimeField 和 endTimeField 中的时间值所使用的存储格式。 格式化时间查询时,时间格式很重要。 | String |
timeOffset (可读写) | 应用于数据中的时间值的的时间偏移。 | Double |
timeOffsetUnits (可读写) | 描述了应用于数据中的时间值的 timeOffset 的时间偏移单位。
| String |
timeStepInterval (可读写) | 时间步长间隔定义时态数据的间隔长度。 时间步长间隔可以认为是时间值在数据中记录的频率。 | Double |
timeStepIntervalUnits (可读写) | 描述了应用于数据中的时间值的 timeStepInterval 的时间步长间隔单位。
| String |
timeZone (可读写) | 启用时间的图层的时区。 提示:有关有效时区字符串的列表,请参阅 ListTimeZones。 | String |
代码示例
以下脚本可以测试图层文件中的图层是否支持时间以及是否已设置时间属性。 然后,此脚本使用时间信息(开始时间和结束时间)计算已启用时间的图层的时间范围。
import arcpy
lyrFile = arcpy.mp.LayerFile(r'C:\Projects\Time\ShipPositions.lyrx')
for lyr in lyrFile.listLayers():
if lyr.supports('TIME'):
if lyr.isTimeEnabled:
lyrTime = lyr.time
startTime = lyrTime.startTime
endTime = lyrTime.endTime
timeDelta = endTime - startTime
print(f"Layer: {lyr.name}")
print(f" Start Time: {str(startTime.strftime('%m-%d-%Y'))}")
print(f" End Time: {str(endTime.strftime('%m-%d-%Y'))}")
print(f" Time Extent: {str(timeDelta.days)} days")
else:
print("No time properties have been set on the layer")
else:
print("Time is not supported on this layer")
以下脚本根据在特定时间有效的输入要素创建要素类,同时确保选择时间在已启用时间的图层的时间范围内(开始时间和结束时间)。
import arcpy, os
# Setup output location and overwrite status
arcpy.env.overwriteOutput = True
path = r"C:\Projects\Time\Ships"
output_GDB = os.path.join(path, "Ships.gdb")
# Get time information from a layer in a layer file
lyrFile = arcpy.mp.LayerFile(os.path.join(path, "ShipPositions.lyrx"))
lyr = lyrFile.listLayers()[0]
lyrTime = lyr.time
# Set the time for which you want to select features in the time-enabled layer
fromTimeSelection = datetime.datetime(1776, 1, 1)
toTimeSelection = datetime.datetime(1777, 1, 1)
# Get the start and end time of the time enabled layer and its time field
startTime = lyrTime.startTime
endTime = lyrTime.endTime
timeField = lyrTime.startTimeField
# Check to see if the time for which you want to select features lies within the start and end time of the time enabled layer
if (fromTimeSelection < startTime or toTimeSelection > endTime):
print("The time specified for selecting features is not within the time extent of the layer")
else:
# Formulate the time query
timeQuery = f"{timeField} >= timestamp '{fromTimeSelection}' And \
{timeField} < timestamp '{toTimeSelection}'"
# Process: Feature Class to Feature Class
arcpy.FeatureClassToFeatureClass_conversion(lyr, output_GDB, "Ships_1776", timeQuery, "", "")
# Add the new layer to a map and enable time
p = arcpy.mp.ArcGISProject(os.path.join(path, "ships.aprx"))
lyt = p.listLayouts('Ships')[0]
mf = lyt.listElements('MAPFRAME_ELEMENT', 'NoTimeMF')[0]
m = mf.map
m.addDataFromPath(os.path.join(output_GDB, "Ships_1776"))
l = m.listLayers("Ships_1776")[0]
l.enableTime()
mt = mf.time
mt.isTimeEnabled = True
# Save a copy of the project
p.saveACopy(os.path.join(path, "ships2.aprx"))