DataFrame (arcpy.mapping)
Резюме
Объект класса DataFrame предоставляет доступ ко многим свойствам фрейма данных, найденным в пределах документа карты (.mxd). Ссылка на объект DataFrame часто используется в качестве аргумента нескольких функций для отбора слоев или таблиц в определенном фрейме данных.
Обсуждение
Объект класса DataFrame предоставляет доступ к важным свойствам фрейма данных. Функция ListDataFrames возвращает Python-список объектов DataFrame. Затем необходимо пройти по всем элементами списка в цикле или указать номер индекса для ссылки на определенный объект DataFrame. Объект может работать как с единицами карты, так и с единицами страницы, в зависимости от используемого свойства. Например, его можно использовать для указания экстента, масштаба и поворота карты, а также таких элементов, как пространственная привязка. Используя единицы измерения страницы, можно также изменить расположение и/или размер объекта DataFrame на компоновке. Объект DataFrame также предоставляет доступ к информационным элементам, таким как права доступа и описание.
Ссылка на фрейм данных также может оказаться полезной при работе с другими объектами. Например, функция ListLayers имеет дополнительный параметр под названием data_frame, который позволяет искать слои в пределах одного фрейма данных, а не во всем документе карты. Объект DataFrame также используется в качестве дополнительного параметра, чтобы различить печать или экспорт фрейма данных и печать или экспорт компоновки страницы. Поэтому важно, чтобы у каждого фрейма данных было свое уникальное имя, по которому вы сможете легко найти этот фрейм данных.
Координаты экстента фрейма данных берутся на основе экстента фрейма данных в Виде компоновки (Layout View), а не в Виде данных (Data View). Это связано с тем, что форма фрейма данных в Виде данных может иметь иные пропорции, чем фрейм данных в Виде компоновки.
Параметры elementPositionX и elementPositionY основаны на положении якоря элемента, которое указывается на вкладке Размер и положение (Size and Position) в диалоговом окне свойств элемента в ArcMap.
Единицы измерения страницы могут меняться в ArcMap только с использованием меню Настройка (Customize) > Опции ArcMap (ArcMap Options) > Закладка Вид компоновки (Layout View Tab).
Свойства
Свойство | Объяснение | Тип данных |
credits (чтение и запись) |
Дает возможность получать или задавать права доступа к фрейму данных. | String |
description (чтение и запись) |
Дает возможность получать или задавать описательную информацию для фрейма данных. | String |
displayUnits (чтение и запись) |
Дает возможность получать или задавать единицы измерения для фрейма данных. | String |
elementHeight (чтение и запись) | Высота элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionX (чтение и запись) |
Положение Х якоря элемента во фрейме данных. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementPositionY (чтение и запись) |
Положение Y якоря элемента во фрейме данных. Единицы измерения задаются или считываются в единицах страницы. | Double |
elementWidth (чтение и запись) |
Ширина элемента в единицах страницы. Единицы измерения задаются или считываются в единицах страницы. | Double |
extent (чтение и запись) |
Дает возможность получать или задавать экстент карты для фрейма данных, используя координаты карты (то есть, единицы карты). Сохраните копию объекта Экстент перед изменением его свойств. Измененная копия будет использоваться для установки новых свойств объекта экстент. Примечание: в случае изменения свойств экстент простым назначением ссылки на объект Экстент, изменения не будут сохранены. например, df.extent.xMin = some value не будет работать. Если пропорция экспозиции экстент не соответствует форме фрейма данных, окончательный экстент будут изменен для соответствия новому экстенту внутри формы фрейма данных. Другими словами, в случае назначения точных значений для координат X и Y, вы можете не получить их при попытке прочтения позже. Примечание: свойства объекта Экстент в справочной системе по умолчанию доступны только для чтения. Отдельное исключение сделано для среды написания arcpy.mapping, обеспечивающее изменение экстентов в процессе автоматического создания карты.
| Extent |
geographicTransformations (чтение и запись) |
Дает возможность получать или задавать географическое преобразование фрейма данных. Свойство возвращает имя преобразования в списке. Можно использовать только имеющиеся предопределенные имена преобразований (либо соответствующие кодовые значения) для назначения географических преобразований. Полный список преобразований и кодовых значений имеется в Ресурсном центре ArcGIS. Для создания пользовательского преобразования использование geographicTransformations невозможно. Можно сослаться только на предопределенные методы. По умолчанию в документ карты всегда загружается одно географическое преобразование: NAD_1927_To_NAD_1983_NADCON. При изменении списка оно будет перезаписано. Географические преобразования можно также удалить, назначив пустой список. В следующем примере указаны два метода преобразования с использованием строк с именами. Первый от NAD27 до NAD 83 и второй от NAD83 до HARN. Во втором примере выполняются те же действия, однако используются только коды преобразований.
| String |
mapUnits (только чтение) |
Возвращает значение строки, отображающее текущие единицы карты фрейма данных. Они основаны на текущей системе координат фрейма данных. | String |
name (чтение и запись) |
Дает возможность задавать или получать имя фрейма данных, которое отображается в таблице содержания в документе карты, а также действительное имя элемента в слое. | String |
referenceScale (чтение и запись) |
Дает возможность получать или задавать базовый масштаб для фрейма данных. Это масштаб, в котором размеры всех символов и текста, используемых во фрейме данных, будут относительными. | Double |
rotation (чтение и запись) |
Дает возможность получать или задавать значение поворота для фрейма данных. Представляет собой значение в градусах, на которое будет повернут фрейм данных, измеренное против часовой стрелки с севера. Для вращения по часовой стрелке используйте отрицательное значение. | Double |
scale (чтение и запись) |
Дает возможность получать или задавать текущий масштаб для активного фрейма данных. Он должен быть двузначным числовым значением. | Double |
spatialReference (чтение и запись) | Предоставляет доступ к свойствам SpatialReference фрейма данных. Пространственная привязка содержит информацию о системе координат и единицах. | SpatialReference |
time (только чтение) |
Возвращает объект DataFrameTime, предоставляющий доступ к операциям по контролю отображения слоев с поддержкой времени во фрейме данных. | DataFrameTime |
type (только чтение) |
Возвращает тип любого элемента на странице компоновки.
| String |
Обзор метода
Метод | Объяснение |
panToExtent (extent) |
Передвигает и центрирует экстент фрейма данных с использованием объекта Extent без изменения масштаба фрейма данных |
zoomToSelectedFeatures () |
Изменяет экстент фрейма данных для его соответствия экстенту выбранных в текущий момент во всех слоях фрейма данных объектов. |
Методы
Этот метод наиболее подходит в тех случаях, когда масштаб фрейма данных не изменяется. Вместо задания экстента и последующего изменения масштаба каждый раз, когда это требуется, функция panToExtent поддерживает масштаб и центрует текущий фрейм данных по новому экстенту.
В следующем примере экстент фрейма данных масштабируется путем выбора определенных объектов слоя. Для этой цели используется класс слоя и метод getSelectedExtent.
df.panToExtent(lyr.getSelectedExtent())
Осуществляет ту же операцию ArcMap, что и команда меню Выборка (Selection) > Приблизить к выбранным объектам (Zoom To Selected Features). Единственное отличие состоит в том, что если не будет выбрано никаких объектов, приближение будет выполнено на весь экстент для всех слоев. Для приближения на весь экстент для выбранных объектов в определенном слое, нужно использовать метод Layer.getSelectedExtent.
В следующем примере показано приближение на полный экстент для выбранных объектов.
df.zoomToSelectedFeatures()
В следующем примере показано приближение на полный экстент для выбранных объектов для определенного слоя. В этом примере метод используется к объекту Layer.
df.extent = lyr.getSelectedExtent()
Пример кода
Следующий скрипт задает во всех фреймах данных для свойства поворот значение 0, а для свойства масштаб значение 1:24000, а затем экспортирует каждый фрейм данных в отдельный выходной файл TIFF, используя свойство фрейма данных имя в качестве имени выходного файла.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for df in arcpy.mapping.ListDataFrames(mxd):
df.rotation = 0
df.scale = 24000
outFile = r"C:\Project\Output\\" + df.name + ".tif"
arcpy.mapping.ExportToTIFF(mxd, outFile, df)
del mxd
Следующий скрипт задает экстент фрейма данных равным экстенту выборки объектов в слое. К экстенту добавлен 10%-й буфер, полученный путем изменения масштаба. В этом примере к объекту Слоя (Layer) применяется метод getSelectedExtent. Этот скрипт запускается из интерактивного окна в ArcMap при помощи ключевого слова CURRENT, при этом не нужно указывать путь к документу карты.
import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
accidentLayer = arcpy.mapping.ListLayers(mxd, "accidents", df)[0]
arcpy.SelectLayerByAttribute_management(accidentLayer, "NEW_SELECTION", "\"Accidents\" > 5")
df.extent = accidentLayer.getSelectedExtent(False)
df.scale = df.scale * 1.1
arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Output\FrequentAccidents.pdf", df)
arcpy.RefreshActiveView()
del mxd
Следующий скрипт изменяет положение и размер конкретного фрейма данных на компоновке.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
df.elementPositionX, df.elementPositionY = 1, 1
df.elementHeight, df.elementWidth = 5, 6.5
mxd.save()
del mxd
Следующий скрипт преобразует объект экстента фрейма данных в полигональный объект, так чтобы его можно было использовать с функцией SelectLayerByLocation_management.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
lyr = arcpy.mapping.ListLayers(mxd, "Accidents", df)[0]
#The DataFrame extent object is converted into a polygon feature so it can be used with the SelectLayerByLocation function.
dfAsFeature = arcpy.Polygon(arcpy.Array([df.extent.lowerLeft, df.extent.lowerRight, df.extent.upperRight, df.extent.upperLeft]),
df.spatialReference)
arcpy.SelectLayerByLocation_management(lyr, "INTERSECT", dfAsFeature, "", "NEW_SELECTION")
mxd.save()
del mxd