Краткая информация
Объект MapTime обеспечивает доступ к операциям управления временем, когда слои с включенным временем отображаются в MapFrame в Компоновке.
Обсуждение
Класс MapTime позволяет фильтровать объекты на карте, используя ряд доступных настроек времени, которые соответствуют элементам управления на вкладке Время и Бегунок времени на активированном фрейме карты в компоновке в ArcGIS Pro. Изменение свойств времени карты применяется только к карте, связанной с MapFrame в Компоновке, и в настоящее время не применяется к виду карты.
Свойства currentStartTime и currentEndTime используются для указания временного диапазона. Свойство timeInclusion определяет, включены ли объекты в определенный временной диапазон. Свойство устанавливается с помощью метода setTimeInclusion.
Подсказка:
Свойство currentStartTime не может быть больше свойства currentEndTime. И наоборот, свойство currentEndTime не может быть меньше, чем свойство currentStartTime. Если вы переходите на новый будущий временной диапазон, лучше всего установить currentEndTime перед настройкой currentStartTime.
Метод timeStep может использоваться для расчета новых значений currentStartTime и currentEndTime. Чтобы создать серию временных карт, используйте метод timeStep для перебора значений времени. Пример кода см. в примере 3 ниже.
Время можно включить для вновь добавленных слоев к карте фрейма карты, что позволяет выполнять анализ времени, создавать временные книги карт и т. д. Примеры кода см. в примерах 2 и 3 ниже.
Свойства
Свойство | Описание | Тип данных |
currentTimeEnd (чтение и запись) | Текущая дата и время окончания для текущего промежутка времени фрейма карты. | DateTime |
currentTimeSpan (только чтение) | Текущий временной интервал, представляющий разницу между временем начала и окончания временного интервала фрейма карты. | Double |
currentTimeSpanUnits (только чтение) | Строка, представляющая единицы измерения для значения currentTimeSpan. Поддерживаются следующие значения:
| String |
currentTimeStart (чтение и запись) |
Текущая дата и время начала временного интервала фрейма карты. | DateTime |
isTimeEnabled (чтение и запись) | Булево значение, определяющее, включено ли время для фрейма карты. Свойство isTimeEnabled должно быть True для изменения других свойств MapTime. Время можно отключить для фрейма карты, даже если фрейм карты содержит слои с включенным временем. | Boolean |
timeInclusion (только чтение) | Строка, которая определяет, включены ли currentTimeStart и currentTimeEnd в текущий временной интервал. Допустимый список значений выглядит следующим образом:
| String |
timeStepInterval (только чтение) | Указывает время, на которое будут смещены время начала и окончания на каждом временном шаге. | Double |
timeStepIntervalUnits (только чтение) | Единицы измерения, используемые timeStepInterval. Список допустимых значений выглядит следующим образом:
| String |
Обзор метода
Метод | Описание |
setTimeInclusion (time_inclusion) | Метод setTimeInclusion контролирует, как currentTimeStart и currentTimeEnd будут включены в текущий временной интервал. |
timeStep (reference_time, interval, interval_units) | Метод timeStep возвращает новое время на основе заданного эталонного времени и временного интервала. |
Методы
setTimeInclusion (time_inclusion)
Параметр | Описание | Тип данных |
time_inclusion | A string that specifies a valid time inclusion value.
| String |
Данные, отображаемые на основе значений currentTimeStart и currentTimeEnd, можно дополнительно изменить, исключив одно или оба значения во временном интервале - например, если вы отображаете временной интервал в один год, где время начала - 01.01.2020, а время окончания - 01.01.2021. Если вы не хотите, чтобы данные от 01.01.2021 включались в какой-либо анализ, вы должны установить значение time_inclusion на INCLUDE_ONLY_START.
timeStep (reference_time, interval, interval_units)
Параметр | Описание | Тип данных |
reference_time | A Python DateTime object. The interval and interval_units will be added to the reference_time. Подсказка:The reference_time can be any Python DateTime object. For example, you can set the reference_time to be the currentStartTime or currentEndTime values. | DateTime |
interval | A double that defines a time interval. Подсказка:Positive or negative intervals can be used. | Double |
interval_units | A string that specifies a valid interval unit.
| String |
Тип данных | Описание |
DateTime | Новое значение DateTime, рассчитанное из reference_time, interval и interval_units. |
Метод timeStep возвращает новое время на основе заданного эталонного времени и временного интервала. Объект datetime Python, возвращаемый методом timeStep, можно использовать для установки свойств currentTimeEnd и currentTimeStart. Чтобы создать серию временных карт, используйте метод timeStep для перебора значений времени.
Пример кода
Следующий скрипт устанавливает время начала и окончания для фрейма карты, а затем выполняет итерацию с интервалом в один месяц в течение года. Каждый месяц экспортируется в файл PDF.
import arcpy, os
path = r"C:\Projects\Time\Ships"
#Reference a project, layout, and a map frame
p = arcpy.mp.ArcGISProject(os.path.join(path, "ships.aprx"))
lyt = p.listLayouts('ships')[0]
mf = lyt.listElements('MAPFRAME_ELEMENT', 'ShipsWithTimeMF')[0]
if not mf.time is None:
#Get the map frame time, set the initial time window and inclusion settings
t = mf.time
t.currentTimeStart = datetime.datetime(1776, 1, 1, 0, 0)
t.currentTimeEnd = datetime.datetime(1776, 2, 1, 0, 0)
t.setTimeInclusion('INCLUDE_ONLY_START')
for x in range(1,13):
#Export to PDF
outPDF = os.path.join(path, "Output", f"1776-{x}.pdf")
lyt.exportToPDF(outPDF)
#Change the time window to the next 1 month interval
t.currentTimeStart = t.timeStep(t.currentTimeStart, 1, "months")
t.currentTimeEnd = t.timeStep(t.currentTimeEnd, 1, "months")
Следующий скрипт добавляет слой с учетом времени из файла слоя на карту фрейма карты. В этом рабочем процессе фрейм карты не содержит времени. Затем скрипт приближает к экстенту добавленного слоя. Время включается во фрейме карты путем установки isTimeEnabled на True. Наконец, скрипт определяет начальный промежуток времени, задав currentStartTime, currentEndTime и setTimeInclusion.
import arcpy, os
path = r"C:\Projects\Time\Ships"
#Reference a project, layout, and a map frame
p = arcpy.mp.ArcGISProject(os.path.join(path, "ships.aprx"))
lyt = p.listLayouts('Ships')[0]
mf = lyt.listElements('MAPFRAME_ELEMENT', 'NoTimeMF')[0]
#Reference the map frame's map and add a time enabled layer from a layerfile
m = mf.map
m.addDataFromPath(os.path.join(path, "ShipPositions.lyrx"))
#Zoom to the layer
l = m.listLayers()[0]
mf.camera.setExtent(mf.getLayerExtent(l))
#Enable time on the map and set its time window
mt = mf.time
mt.isTimeEnabled = True
mt.currentTimeEnd = datetime.datetime(1900, 1, 1, 0, 0)
mt.currentTimeStart = datetime.datetime(1800, 1, 1, 0, 0)
mt.setTimeInclusion('INCLUDE_ONLY_START')
#Export the layout
lyt.exportToPDF(os.path.join(path, output, "ShipPositions_1800s.pdf"))
Следующий скрипт добавляет слой с учетом времени из файла слоя на карту фрейма карты. После этого в слое и в карте включается время. Для итерации по ряду временных интервалов используется метод timeStep. Каждый раз интервал экспортируется в файл PDF. Чтобы создать готовый атлас, используется класс PdfDocument, чтобы добавить титульную страницу и конечную страницу во временный атлас.
import arcpy, os
basedir = r"C:\Project\Time"
# Create the output pdf file
pdfPath = os.path.join(basedir, "output", "HistoricalBoundaries.pdf")
pdfDoc = arcpy.mp.PDFDocumentCreate(pdfPath)
# Reference project, layout, map frame and map
aprx = arcpy.mp.ArcGISProject(os.path.join(basedir, "Tokyo.aprx"))
layout = aprx.listLayouts('Historical Boundaries')[0]
mfTokyo = layout.listElements('MAPFRAME_ELEMENT', 'Tokyo Map Frame')[0]
mTokyo = mfTokyo.map
# Add a layer that contains time values to the map
lyrTokyo = mTokyo.addLayer(arcpy.mp.LayerFile(os.path.join(basedir, 'Tokyo_Historic_Boundaries.lyrx')), 'TOP')[0]
# Enable time on the newly added layer
lyrTokyo.enableTime(startTimeField='Year', endTimeField='YearEnd')
# Enable Map Time
mtTokyo = mfTokyo.time
mtTokyo.isTimeEnabled = True
# Access Map Time properties for use in the MapTime.timeStep() method
interval = mtTokyo.currentTimeSpan
unit = mtTokyo.currentTimeSpanUnits
# Use the MapTime.timeStep() method to get the first time span
start = lyrTokyo.time.startTime
end = mtTokyo.timeStep(start, interval, unit)
# Loop through time spans
while end < lyrTokyo.time.endTime:
# Update the map frame with the time span
mtTokyo.currentTimeStart = start
mtTokyo.currentTimeEnd = end
# Export the time span to pdf
output_pdf_file = os.path.join(basedir, "output", f"HistoricalBoundaries_{start.year}_to_{end.year}.pdf")
layout.exportToPDF(os.path.join(basedir, "output", output_pdf_file))
# Appened the time step pdf to the output pdf
pdfDoc.appendPages(output_pdf_file)
# Use the MapTime.timeStep() method to proceed to the next time span
start = end
end = mtTokyo.timeStep(end, interval, unit)
# Add title and end pages to create a complete map book
pdfDoc.insertPages(os.path.join(basedir, 'Title Page.pdf'), 1)
pdfDoc.appendPages(os.path.join(basedir, 'End Page.pdf'))
# Save the output pdf
pdfDoc.saveAndClose()