11地图脚本 map scripting(2)

11.7 添加、删除、插入和移动图层

使用 arcpy.mp 模块执行的典型任务之一是操作一个或多个地图中的图层。此操作包括添加、删除、插入和移动图层。 Map 对象具有用于每个任务的方法。这些方法中的每一种都一次使用一层。要操作多个层,您需要某种形式的迭代来重复这些步骤。
可以从 ArcGIS Online 将底图添加到 ArcGIS Pro 中的地图。要添加底图,请单击地图选项卡,单击底图,然后选择一种底图类型。 Map.addBasemap()方法在 ArcPy 中复制了此功能。这个函数的语法是

Map.addBasemap(basemap_name)

唯一需要的参数是显示在 ArcGIS Pro 底图库中的底图名称。如果地图中没有底图,则将添加新底图。如果底图已经存在,它将被新的替换。您一次只能使用一张底图。考虑带有地形底图的地图的内容,如图所示。
在这里插入图片描述
以下代码将现有底图替换为不同的底图:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
m.addBasemap("Imagery")
aprx.save()
del aprx

结果是地形底图被影像底图取代。
在这里插入图片描述
请注意,basemap_name 参数基于底图库中的显示名称(即 Imagery),而不是图层添加到地图后的名称(即 World Imagery)。
在这里插入图片描述
您可以使用 Map.removeLayer() 方法删除底图。
在 ArcGIS Pro 中,您可以通过从目录窗格中拖动数据集或单击地图选项卡上的添加数据来将数据添加到地图中。此功能使用 Map .addDataFromPath() 方法在 ArcPy 中复制。这个方法的语法是

Map.addDataFromPath(data_path)

data_path 参数是表示本地路径或 URL 的字符串。以下代码将要素类添加到现有地图:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
m.addDataFromPath("C:/Mapping/Data.gdb/sidewalks")
aprx.save()
del aprx

要素类根据图层权重和几何类型的标准规则添加为图层,与从 ArcGIS Pro 应用程序中添加图层的方式相同。在此示例中,折线要素图层添加到现有点要素图层下方和现有折线要素图层上方。

在这里插入图片描述
可以使用 Map.removeLayer() 方法删除图层。这个方法的语法是

Map.removeLayer(remove_layer)

remove_layer 参数是一个 Layer 对象。这种语法意味着您不能直接通过其名称或索引调用图层,但您必须先创建一个图层对象。如前面的示例所示,您可以使用 Map.listLayers() 方法结合图层名称和索引来创建图层对象。删除特定层的代码如下:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyr = m.listLayers("historical_landmarks")[0]
m.removeLayer(lyr)
aprx.save()
del aprx

这段代码去掉了具体的层,如图
在这里插入图片描述
如果您事先知道要删除的图层的索引号,则仅索引号就足够了。当您使用图层名称创建图层对象时,您仍必须使用索引零 [0],因为 Map.listLayers() 方法返回图层对象的列表。
除了通过引用磁盘上的数据将新图层添加到地图之外,您还可以通过引用图层或 LayerFile 对象来添加图层。您可以使用 Map.addLayer()Map.insertLayer() 方法添加图层。这些方法以类似的方式工作,但后者提供了对层放置的更细粒度的控制。这两个方法中第一个的语法是

Map.addLayer(add_layer_or_layerfile, {add_position})

第一个参数是对现有图层或图层文件对象的引用,而第二个可选参数确定图层的位置。放置选项包括基于层权重规则和几何形状的 AUTO_ARRANGE(默认)、BOTTOM(在层堆栈的底部)和 TOP(在层堆栈的顶部)。该代码示例通过引用磁盘上的 .lyrx 文件来创建一个 LayerFile 对象,然后将该层添加到地图中,如下所示:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyr = arcpy.mp.LayerFile("C:/Mapping/hospitals.lyrx")
m.addLayer(lyr)
aprx.save()
del aprx

根据默认的 AUTO_ARRANGE 放置选项将图层添加到顶部位置。
在这里插入图片描述
此语法类似于 addDataFromPath() 方法,但 .lyrx 文件不仅包含对源数据的引用,还包含图层文件作者创建的自定义符号系统。可以使用保存到图层文件地理处理工具创建 .lyrx 文件。创建图层文件通常用于在项目之间和用户之间共享符号系统。
Map.addLayer() 方法也可以使用 Layer 对象而不是 LayerFile 对象。这种方法的一个典型应用是在一个地图中引用一个图层并将其添加到同一项目中的另一个地图中。以下代码引用 Parks 地图中名为 city_parks 的图层,然后将此图层添加到设施地图:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyr = m.listLayers("city_parks")[0]
m = aprx.listMaps("Facilities")[0]
map.addLayer(lyr, "BOTTOM")
aprx.save()
del aprx

这种方法可以扩展到包括多个项目。例如,您可以在一个项目中引用一个图层并将其添加到另一个项目,而无需在磁盘上创建图层文件。
Map.insertLayer() 方法很像 Map.addLayer() 方法。语法如下:

Map.insertLayer(reference_layer, insert_layer_or_layerfile,
                                 {insert_position})

第一个参数是一个图层对象,表示地图中的现有图层,用作放置目的的参考。第二个参数是一个 Layer 或 LayerFile 对象,表示要添加的层,也称为“源层”。第三个参数是一个字符串,用于确定是在图层堆栈中的参考图层之前还是之后添加图层。以下示例代码将源层插入到层堆栈中的特定位置:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Demo.aprx")
m = aprx.listMaps("Parks")[0]
lyr = m.listLayers("city_parks")[0]
m = aprx.listMaps("Facilities")[0]
reflyr = m.listLayers("parcels")[0]
m.insertLayer(reflyr, lyr, "BEFORE")
aprx.save()
del aprx

最后,Map.moveLayer() 方法依赖于参考层的相同概念来控制堆栈中的位置。语法是

Map.moveLayer(reference_layer, move_layer, {insert_position})

此方法采用现有图层并将其移动到图层堆栈中的新位置,无论是在参考图层之前还是之后。此方法只能用于在同一地图内移动图层。

11.8 使用图层符号系统

使用图层的一个重要方面是它们的符号系统。当使用图层对象时,它们的符号系统会被保留。例如,在一个地图中引用图层并使用 Map.insertLayer() 方法将图层添加到另一张地图时,符号系统是相同的。此外,您可以通过图层对象的属性修改符号系统的某些方面,包括亮度、对比度和透明度。这些属性是可读写的。然而,符号系统的许多其他方面需要更细粒度的控制。使用符号系统是通过符号系统类完成的,可以通过图层对象的符号系统属性访问该类。在典型的工作流程中,您会引用图层的符号系统属性,对符号系统对象进行更改,然后将这些更改应用到图层。

Symbology 类有两个属性来定义图层的符号化方式:着色器(用于栅格图层)和渲染器(用于要素图层)。这些属性返回用于符号化图层的着色器或渲染器。您还可以使用 **updateColorizer()(用于栅格图层)和 updateRenderer()(用于要素图层)**方法更改着色器或渲染器的类型。

由于符号系统类同时用于栅格图层和要素图层,因此您必须在进行任何更改之前检查图层类型。 colorizer 和 renderer 属性分别返回一个 colorizer 和 renderer 对象。栅格图层和要素图层有几个不同的类,每个类都具有基于符号系统性质的不同属性。所有不同的类都有一个共同的类型属性,可以用来确定着色器和渲染器的类型。
考虑具有几个不同层的示例地图,如图所示。
在这里插入图片描述
使用默认设置将这些图层添加到新的空地图中。 Symbology 类可用于确定着色器或渲染器的类型。一个复杂的因素是,并非所有栅格图层或要素图层都分别具有有效的着色器或渲染器。因此,除了检查图层的类型(栅格或要素)之外,您还必须确保图层支持着色器或渲染器。您可以使用 Python 的内置 hasattr() 方法执行此检查,该方法是“has attribute”的缩写。此方法检查对象是否具有命名属性,并且该方法返回一个布尔值。
以下示例代码迭代地图中的图层。对于每个图层,它使用图层对象的符号系统属性创建一个符号系统对象。然后它执行两项检查:(1)图层的类型和(2)图层是否支持着色器或渲染器。

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Symbology.aprx")
m = aprx.listMaps("Plan")[0]
lyrs = m.listLayers()
for lyr in lyrs:
        sym = lyr.symbology
        if lyr.isFeatureLayer:
            if hasattr(sym, "renderer"):
                 print(lyr.name + ": " + sym.renderer.type)
       if lyr.isRasterLayer:
            if hasattr(sym, "colorizer"):
                print(lyr.name + ": " + sym.colorizer.type)

地图中五个图层的结果打印如下:

facilities: SimpleRenderer
trails: SimpleRenderer
parks: SimpleRenderer
landuse: RasterUniqueValueColorizer

对于三个要素图层,默认符号系统是 SimpleRenderer。对于土地利用栅格,默认符号系统为 RasterUniqueValueColorizer。由于符号系统类型为拉伸,因此不会打印高程栅格的结果,并且符号系统对象中没有此类型的着色器。
对于栅格图层,有两种着色器:

RasterClassifyColorizer - 类似于 ArcGIS Pro 中栅格的分类符号系统 RasterUniqueValueColorizer - 类似于 ArcGIS Pro 中栅格的唯一值符号系统

与 ArcGIS Pro 中栅格的符号系统选项相比,缺少一些符号系统选项,包括拉伸、离散和矢量场。
在这里插入图片描述
对于要素图层,有四种着色器:
GradedColorsRenderer — 类似于 ArcGIS Pro 中要素的渐变颜色符号系统 GradgedSymbolsRenderer — 类似于 ArcGIS Pro 中要素的渐变符号符号系统 SimpleRenderer — 类似于 ArcGIS Pro 中要素的单符号符号系统
UniqueValueRenderer — 类似于 Unique ArcGIS Pro 中要素的值符号系统

与 ArcGIS Pro 中要素的符号系统选项相比,缺少一些选项。它们包括未分类的颜色、比例符号、点密度、图表和字典。
在这里插入图片描述
栅格和要素图层的不同符号系统类型说明了脚本必须检查图层类型以及支持哪种符号系统的原因。
虽然 Symbology 对象的属性是只读的,但它的方法可用于更改着色器或渲染器的类型。此外,符号系统对象的属性可以访问着色器或渲染器对象,这反过来又可以访问可以更改的属性。下面的几个示例说明了如何对不同类型的图层和符号系统进行这些更改。

首先,更改折线要素图层的符号系统。类型(SimpleRenderer)保持不变,但颜色被修改。 SimpleRenderer 类有一个 symbol 属性,它返回一个 Symbol 对象。可以使用 Symbol 对象的 color 属性修改折线的颜色。使用 Python 字典为特定颜色模型设置符号的颜色。以下代码使用 RGB(红、绿、蓝)值更新折线的颜色:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Symbology.aprx")
m = aprx.listMaps("Plan")[0]
lyr = m.listLayers("trails")[0]
sym = lyr.symbology
red = {"RGB": [255, 0, 0, 100]}
if lyr.isFeatureLayer and hasattr(sym, "renderer"):
    sym.renderer.symbol.color = red
    lyr.symbology = sym
aprx.save()
del aprx

结果是多段线的颜色发生了变化。
在这里插入图片描述

该代码需要一些解释。前四行代码创建了感兴趣的 Layer 对象。
下一行 sym = lyr.symbology 创建一个 Symbology 对象。红色是使用字典形式的 RGB 值创建的。尽管 RGB 仅使用三个值(红色、绿色和蓝色),但 ArcGIS Pro 中的颜色模型使用一个称为 alpha 或 opacity 的附加值。该值与透明度相反。换句话说,100 的 alpha 值意味着 0% 的透明度。执行两项检查以确保该图层是要素图层并支持渲染器。可以执行一项额外检查以确保渲染器的类型是 SimpleRenderer,但此处省略了该检查。 sym.renderer.symbol.color = red 行将 RGB 值分配给 Symbol 对象的 color 属性,该属性是使用 SimpleRenderer 对象的 symbol 属性获得的,而后者又是 Symbology 对象的属性。到目前为止的代码实际上还没有改变图层,只有 Symbology 对象。因此,必须使用 lyr .symbology = sym 将新符号系统应用于图层。最后,保存项目以使更改生效。
此代码可能看起来相对复杂,仅用于更改折线要素图层的颜色,但请记住,此方法可用于更改许多项目中许多地图中许多图层的颜色。
使用 Symbol 类可以对基本符号属性进行细粒度控制,包括颜色、轮廓颜色和大小。您还可以通过引用其名称来使用符号库中的预定义样式。
在这里插入图片描述
确定样式名称后,可以使用 Symbol 类的 applySymbolFromGallery() 方法更新符号系统。代码如下:

import arcpy
aprx = arcpy.mp.ArcGISProject("C:/Mapping/Symbology.aprx")
m = aprx.listMaps("Plan")[0]
lyr = m.listLayers("trails")[0]
sym = lyr.symbology
if lyr.isFeatureLayer and hasattr(sym, "renderer"):
    sym.renderer.symbol.applySymbolFromGallery("Dashed 4:4")
    lyr.symbology = sym
aprx.save()
del aprx

一些符号具有相同的名称,特别是对于点符号,其中相同名称用于不同大小的相同符号。 Symbol.applySymbolFromGallery() 方法有一个可选的第二个参数,用于使用索引返回所需的符号。例如,默认图库包含三个名为 Hospital 的符号。
在这里插入图片描述
索引对应于库中符号的顺序,从零开始。如果正在使用点要素图层,则以下代码将应用三个符号中的第二个:

sym.renderer.symbol.applySymbolFromGallery("Hospital", 1)

因为不同的项目可能有不同的符号集合,Symbol .listSymbolsFromGallery() 方法可用于创建符号列表,然后您可以使用大小或颜色等属性来识别感兴趣的符号。
到目前为止的示例都假定为 SimpleRenderer,并且这种类型保持不变。用于要素图层的其他类型的渲染器是 GradgedColorsRenderer、GraduatedSymbolsRenderer 和 UniqueValueRenderer。每种类型的渲染器都有不同的属性,并且需要稍微不同的方法来修改符号系统。下一节回顾 GradedColorsRenderer 的使用。

11.9 应用渐变颜色符号系统 graduated color symbology

ArcGIS Pro 中的分级颜色符号系统是一种定量专题制图技术,其中使用一系列颜色显示要素属性值的差异。这种地图类型也被称为“等值线图”,广泛用于绘制定量变量的地图,例如人口、就业、种族、教育等人口普查数据。通常,分级颜色映射中使用的变量是标准化的,这意味着它们针对潜在的人口或区域进行了调整。例如,不是映射失业人数的计数,而是将总人口用作标准化变量,这会导致失业人数的一小部分或百分比。此外,分级颜色映射通过使用分类间隔将具有相似值的特征分组到同一类别中。在 ArcGIS Pro 中创建分级彩色地图需要对用作感兴趣变量的字段、用于规范化的字段(如果有)、分类方法、类数和色带做出决定。这些决定是在 arcpy.mp 中使用 GradedColorsRenderer 类实现的。

尽管现有要素图层可能已经应用了这种类型的渲染器,但更典型的场景是图层具有默认渲染器(即 SimpleRenderer),必须将其更改为感兴趣的渲染器。您可以使用 Symbol .updateRenderer() 方法更改渲染器。
以下脚本打开一个工程并引用现有地图中的单个图层。此多边形要素图层是用于分级彩色地图的最常见的要素图层类型。使用 sym = lyr.symbology 创建符号系统对象。执行两项

检查以确保该图层是要素图层并支持渲染器。代码如下:
import arcpy
aprx = arcpy.mp.ArcGISProject("Housing.aprx")
mymap = aprx.listMaps("State")[0]
lyr = mymap.listLayers("Counties")[0]
sym = lyr.symbology
if lyr.isFeatureLayer and hasattr(sym, "renderer"):
    sym.updateRenderer("GraduatedColorsRenderer")

到目前为止,此代码与前面的示例几乎相同。然而,最后一行代码不同,因为不是使用现有的渲染器,而是使用 Symbol.updateRenderer() 方法来更改层的渲染器。结果是现有的渲染器(无论其类型如何)被 GradedColorsRenderer 替换。 GradedColorsRenderer 类包含多个读写属性,这些属性类似于 ArcGIS Pro 在创建渐变色图时的设置。
以下示例使用空置房屋的原始计数(在名为 VACANT 的字段中)并通过所有住房单元的原始计数(在名为 HSE_UNITS 的字段中)对该计数进行标准化,从而得到分数。
使用五个类别应用等间隔分类:

sym.renderer.classificationField = "VACANT"
sym.renderer.normalizationField = "HSE_UNITS"
sym.renderer.classificationMethod = "EqualInterval"
sym.renderer.breakCount = 5

创建渐变颜色符号系统的下一步是应用色带。您可以使用 GradautedColorsRenderer 类的 colorRamp 属性应用颜色渐变。此属性提供对 ColorRamp 类的访问权限,这使得可以使用项目中可用的任何颜色渐变。颜色渐变不直接通过名称引用,而是使用 ArcGISProject.listColorRamps() 方法获得。此方法可确保色带存在并被正确引用。此方法的参数是基于色带名称的通配符。因为该方法返回一个列表,所以索引获取的是色带本身而不是列表,如下所示:

sym.renderer.colorRamp = aprx.listColorRamps("Yellow-Orange-Red  
                                            (5 Classes)")[0]

最后,使用 lyr.symbology = sym 将新符号系统应用于图层,并保存项目以使更改生效:

        lyr.symbology = sym
aprx.saveACopy("Housing_Choropleth.aprx")
del aprx 

结果如图所示。
在这里插入图片描述
要查看项目中所有色带的列表,请使用以下代码:

import arcpy
aprx = arcpy.mp.ArcGISProject("Housing.aprx")
ramps = aprx.listColorRamps()
for ramp in ramps:
print(ramp.name)

一个典型的项目有数百个色带。该数字取决于是否已创建自定义色带。另请注意,ArcGIS Pro 将颜色渐变称为颜色方案。存在许多不同类型的色带,但并非所有都适合渐变色映射。此外,一些色带可用于任意数量的类(例如,黄-绿-蓝(连续)),而一些色带是为特定数量的类创建的(例如,黄-橙-棕(5 个类) ))。建议先熟悉 ArcGIS Pro 应用程序中的特定色带,然后再在脚本中使用它们。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值