ArcGIS 中栅格对象的交互
栅格对象将引用栅格数据集,而如果用于 ArcMap,则还可能与内容列表中的栅格图层关联在一起。大多数情况下,栅格数据集、栅格对象和栅格图层之间的关系保持不变,但想要有效地使用 Spatial Analyst 地图代数,了解这些关系至关重要。
可通过两种方法创建栅格对象:
- 通过 Spatial Analyst 地图代数表达式输出栅格对象。栅格对象最主要的行为之一是,将栅格对象创建为地图代数表达式的主要输出时,栅格对象将引用临时栅格。
>>> outRas = Slope("elevation") >>> print outRas.isTemporary True
- 可将某栅格数据集转换为栅格对象。如果将永久性栅格数据集转换为栅格对象,该数据集仍属于永久性数据集。
>>> outRas = Raster("C:/Data/elevation") >>> print outRas.isTemporary False
某些情况下,栅格对象可与某栅格图层建立关联。在 Python 窗口中操作时,如果保持地理处理选项将地理处理操作的结果添加到显示中为选中状态,那么地图代数表达式的结果便会添加到内容列表中,且名称与栅格对象名称相同。将数据集转换为栅格时,却不会向内容列表中添加任何图层。
保存临时栅格
如果与栅格对象关联的数据属于临时数据,则在 ArcGIS 会话结束时(该对象超出了作用范围或者脚本结束)会将该数据删除。也就是说,除非数据被保存,否则将被删除。如果保存了栅格,则图层和对象中均会反映出更新后的栅格属性,这包括数据集的 name(名称)、path(路径)、catalogPath(目录路径)及 isTemporary(是否属于临时数据)状态。保存临时数据集的方法有多种。
- 要通过关联的栅格对象保存临时栅格数据集,可以使用栅格对象的“保存”方法。
- 要保存与地图图层关联的临时数据集,可右键单击该图层并选择数据 > 使永久化,然后提供输出位置和名称。
- 要保留与地图图层关联的临时栅格数据集,保存“地图文档”即可。如果保存了“地图文档”,栅格数据集将会继续留在磁盘中当前它所在的位置,并会自动生成名称。
重复使用栅格对象
对象名称必须唯一。如果重复使用某个对象名称,则原始对象会被覆盖。在下例中,将 outRas 作为 Aspect 表达式的输出重新使用时,Slope 的输出将被替换。
outRas = Slope("inRas1")
outRas = Aspect("inRas2")
图层将添加到内容列表中,并且图层名称与栅格对象名称相同。如果重复使用某个栅格对象名称,则将向内容列表中多次添加使用同一名称的图层。在上例中,outRas 被两次添加到内容列表中。第一次是执行 Slope 表达式时。此首个 outRas 图层将引用 Slope 的结果,并会一直用在 Python 窗口中,直到执行 Aspect 表达式为止。执行 Aspect 时,名为 outRas 的第二个图层将被添加到内容列表中,之前的对象被覆盖后将开始引用 Aspect 生成的数据集和图层。
如果引用某数据集的栅格对象被覆盖,则可通过图层或数据集名称,将该栅格数据集重新转换为栅格对象。
删除栅格对象
如果删除了栅格对象,关联的数据集(及可能存在的图层)将发生何种变化取决于数据的状态。如果数据属于永久性数据,则删除该栅格对象不会对关联的数据集或图层产生任何影响。如果数据集属于临时性数据集,则删除栅格对象的影响将取决于是否存在同样引用该栅格数据集的图层。如果不存在与该临时数据集关联的任何图层,则删除对象时将删除该数据集。如果存在与该临时数据集关联的图层,则删除对象时将保留该临时数据。
下方示例说明的是如何删除名为 outRas 的栅格对象。
outRas = Slope("C:/Data/elevation")
del outRas
将某栅格对象指定给新的栅格对象
将栅格对象指定给新的栅格对象时并不会复制关联的数据集或图层。将栅格对象指定给新的栅格对象只会创建引用原始对象的又一个对象。在下例中,outRas1 和 outRas2 均引用同一个栅格数据集。
outRas1 = Slope("elevation")
# Assigns Raster object to a new Raster object and save the raster dataset
outRas2 = outRas1
outRas2.save("C:/output/outslope")
在上例中,outRas1 和 outRas2 均引用同一个数据集。因此,保存 outRas2 时,两个对象中均会反映出已保存数据集 outslope 的永久性状态、新位置以及新名称。如果 outRas1 是内容列表中的一个图层,并且通过图层属性或通过保存地图文档的方式保存了数据,那么两个对象(outRas1 和 outRas2)均会引用该已保存的数据集。