讨论
ArcGIS Pro 应用程序集成了 2D 和 3D 显示,因此 Camera 对象可用于同时控制 2D 地图的比例与范围以及 MapFrame 或 MapView 中 3D 地图的照相机位置。
MapFrame 或 MapView 对象上的 camera 属性会返回 Camera 对象。
由于此对象上会提供 2D 和 3D 属性,因此检查 Camera 对象上的模式属性是非常重要的。如果 Camera mode 是 MAP,则您可以设置 2D 属性。如果 Camera mode 是 GLOBAL 或 LOCAL,则您可以设置 3D 属性。此外,您还可以检查 Map 对象上的 MapType 属性;MAP 的值表示 2D,SCENE 的值表示 3D。
由于范围并非显式属性而是派生属性,因此它并非 Camera 对象的直接属性。照相机位置不会存储范围属性,范围是从 X, Y 位置和 scale 派生的。getExtent 方法将返回派生范围。从 3D 地图视图返回范围后,范围取决于从上方竖直向下观察的照相机位置 (pitch=-90)。在 3D 地图上使用 setExtent 方法时,同样,结果显示为如同照相机从上方竖直向下观察的样子。
属性
属性 | 说明 | 数据类型 |
heading (可读写) | 用于获取或设置地图视图旋转值。同时也被称为偏航角或方位角。用于表示地图数据将从正北方向按逆时针旋转的度数。要顺时针旋转,可使用负值。对 2D 和 3D 地图类型均适用。 | Double |
mode (只读) | 返回照相机的查看器模式。每个查看器模式均支持不同的照相机属性集合。
| String |
pitch (可读写) | 用于获取或设置地图视图俯仰角。俯仰角等效于将机头向上或向下移动(沿着穿过飞机机翼的轴进行旋转)。向前观察,正值则高于地平线(指向上方),负值则低于地平线(指向下方)。2D 地图类型的值为 -90.0(从上方竖直向下观察)。 | Double |
roll (可读写) | 用于获取或设置地图视图的滚动角。滚动角等效于飞机机翼向上或向下倾斜(沿着从前向后穿过飞机中心的轴进行旋转)。值为零表示完全水平。正值表示左侧向上倾斜(或右侧向下倾斜)。负值则与之相反。2D 地图类型的值为 0.0。 | Double |
scale (可读写) | 用于获取或设置地图框中的数据比例。必须使用数值(双精度值)。由于数据的平面视图,比例仅能应用于 2D 地图类型。比例可从 3D 地图类型中返回,但只是一个估算值。 | Double |
X (可读写) | 用于获取或设置 X 值。对于 2D 地图,此值取决于地图框的中心。对于 3D 地图,该值表示与视图相关的照相机的 X 位置。 | Double |
Y (可读写) | 用于获取或设置 Y 值。对于 2D 地图,此值取决于地图框的中心。对于 3D 地图,该值表示与视图相关的照相机的 Y 位置。 | Double |
Z (可读写) | 用于获取或设置 Z 值。对于 3D 地图,该值表示与视图相关的照相机的 Z 位置。2D 地图不支持此值,将返回 nan。 | Double |
方法
代码示例
下面的脚本将设置名为约塞米蒂国家公园主要景点的布局上名为约塞米蒂国家公园的地图框范围,从而与名为 Ranger Stations 的图层范围相匹配。
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\YosemiteNP\Yosemite.aprx")
m = aprx.listMaps("Yose*")[0]
lyr = m.listLayers("Ranger Stations")[0]
lyt = aprx.listLayouts("Main Attr*")[0]
mf = lyt.listElements("mapframe_element", "Yosemite National Park")[0]
mf.camera.setExtent(mf.getLayerExtent(lyr, False, True))
aprx.saveACopy(r"C:\Projects\YosemiteNP\Yosemite_Updated.aprx")
del aprx
下面的脚本会将两个地图框的地图从 2D 更改为 3D 地图。首先,该脚本会将两个文档导入到空白项目中。然后,会引用合适的地图和地图框。最后也是最重要的一步,在将 map 属性从 2D 地图更改为 3D 地图之前,将 Camera type 属性更改为 GLOBAL。
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\Blank.aprx")
#Import documents into project
aprx.importDocument(r"C:\Projects\YosemiteNP\Documents\Yosemite.mxd")
aprx.importDocument(r"C:\Projects\YosemiteNP\Documents\Yosemite_3DViews.3dd")
#Reference maps
m_scenic = aprx.listMaps("Globe layers")[0]
#Reference Layout and map frames
lyt = aprx.listLayouts()[0]
mf_inset1 = lyt.listElements("MapFrame_Element", "Inset1")[0]
mf_inset2 = lyt.listElements("MapFrame_Element", "Inset2")[0]
#Convert inset maps into Globe Views
mf_inset1.camera.type = "GLOBAL"
mf_inset1.map = m_scenic
mf_inset2.camera.type = "GLOBAL"
mf_inset2.map = m_scenic
aprx.saveACopy(r"C:\Projects\YosemiteNP\Yosemite.aprx")