探索珊瑚和海绵分布
在本部分中,您将探索控制卡塔利娜岛周围水域珊瑚和海绵分布的一些因素。 首先,您将从美国国家海洋和大气管理局 (NOAA) 下载数据,选择感兴趣区域,并准备数据以供探索。
下载深海珊瑚和海绵数据
NOAA 数据显示了来自世界各地的已知珊瑚和海绵位置。 了解如何下载和使用公共数据是学习如何使用 GIS 的一个重要方面。 您将首先从 NOAA 深海珊瑚研究和技术计划下载两个数据集。 首先,您需要转至深海珊瑚和海绵地图门户。 该站点包含每季度更新的数据,对研究海洋物种非常有用。 本部分中的步骤将向您展示如何下载世界特定区域的物种。 由于研究区域位于加利福尼亚海岸附近的卡塔利娜岛周围,因此您将下载北太平洋的数据。
- 在计算机上,打开 File Explorer。 在计算机上便于找到的位置,创建一个文件夹并将其命名为 DeepSeaCoralSponge。
在本教程中,数据显示在 C:\Lessons\DeepSeaCoralSponge\ 位置。 您可以使用其他文件夹,但是需要按照以下说明调整路径。
- 转至 https://www.ncei.noaa.gov/maps/deep-sea-corals/mapSites.htm。
NOAA 深海珊瑚和海绵地图门户包含由 NOAA 深海珊瑚研究和技术计划创建和管理的地图。 该地图的数据每季度更新一次。
- 在页面顶部,单击数据查询。
- 在数据查询窗格的区域部分中,单击下拉菜单,然后单击北太平洋。
- 清除搜索。
完成此搜索可能需要花费几分钟的时间。
- 数据加载完成后,在页面顶部,单击数据下载。
随即显示数据下载窗格。
- 接受默认值,然后单击自定义下载。
自定义下载页面随即打开,其中包含北太平洋地区的数据。
- 向下滚动,然后单击文件类型。
- 对于文件类型,选择以 .csv 开头的选项。
- 单击提交。
下载数据可能需要花费几分钟。
- 在计算机上找到下载的 .csv 文件。
提示:
文件名以 deep_sea_corals_ 开头,后跟一串字符,例如 deep_sea_corals_f6a2_cb18_f6f1.csv。
- 将 .csv 文件拖到在先前的步骤中创建的 DeepSeaCoralSponge 文件夹中。
您已下载北太平洋地区的深海珊瑚数据。 接下来,您将为工程区域下载沿海地貌模型。
下载 NOAA 沿海地貌模型
NOAA 沿海地貌模型是集成了测深和沿海地形的公共栅格数据集。 您将下载南加利福尼亚的模型。
- 转至 NCEI Geoportal 页面。
由于研究区域是卡塔利娜岛,因此您将下载南加利福尼亚地区的数据。
- 在搜索框中,键入 U.S. Coastal Relief Model - Southern California Version 2,然后按 Enter 键。
- 在搜索结果中,单击 U.S. Coastal Relief Model - Southern California Version 2。
- 向下滚动至下载数据部分,然后单击第二个下载 NetCDF 文件链接。
随即下载 crm_socal_3as_vers2.nc 文件,这是数据的 3 弧秒(90 米)分辨率版本。 另一个下载 NetCDF 文件链接指向数据的 1 弧秒(30 米)分辨率版本。 就本教程而言,90 米分辨率数据即可满足需求。
提示:
此文件大小为 512 MB。 根据连接速度,下载到计算机可能需要花费几分钟时间。
- 下载完成后,在计算机上找到 crm_socal_3as_vers2.nc 文件并将其拖到工程文件夹中。
- 右键单击 crm_socal_3as_vers2.nc 文件,并将其重命名为 SouthernCABathymetry.nc。
deep_sea_corals_ .csv 文件包含一行用于说明纬度、经度和深度列的单位。 虽然这对于将表作为电子表格查看的研究人员非常有用,但在将表格转换为点要素时会出现问题。 您将在电子表格编辑器中打开 .csv 文件,并删除该行。
- 在 Microsoft Excel(或所选电子表格编辑器)中打开 deep_sea_corals_ .csv 文件。
第二行包含 K、L、M 和 T 列的单位的文本描述。 要导入的数据值位于第 2 行之后的行中。
- 单击第 2 行的行号以选择该行。
- 右键单击该行,然后单击删除。
该行已被删除。 现在数据表格式正确,可以导入地理数据库。
- 单击保存按钮并关闭文件。
您已从 NOAA 下载并调整了公共数据的格式,以便可以将其导入地理数据库。 接下来,您将把数据添加到 ArcGIS Pro,准备 NetCDF 数据进行分析,并从地理数据库表中创建点。
导入沿海地貌模型
您下载的数据集仅是 NOAA 所发布数据的一小部分。 在本部分中,您将学习如何使用沿海地貌模型为圣卡塔利娜岛周围的环境创建派生栅格。 派生的信息之后将被引入珊瑚和海绵位置数据库。
添加数据并更改符号系统
接下来,您将在 ArcGIS Pro 中启动新工程,然后将数据添加到工程。
- 打开 ArcGIS Pro。
- 在新建工程部分,单击地图。
- 将新工程命名为 Deep Sea Coral and Sponge Database。
- 单击确定。
注:
如果目录窗格未打开,请单击视图选项卡然后单击目录窗格。
- 在目录窗格中,展开数据库。
当您创建工程时,ArcGIS Pro 会创建一个新的地理数据库以存储工程数据。 您需将 CSV 表导入此数据库。
- 右键单击 Deep Sea Coral and Sponge Database,指向导入,然后单击表。
- 对于输入表,浏览并选择您在本教程前面部分下载并编辑的 .csv 文件。
- 单击运行。
工具将运行一两分钟,将 CSV 表导入到地理数据库。
- 在目录窗格中,展开地理数据库,然后将表拖动到地图上。
表将添加到内容窗格的独立表部分。
- 在内容窗格中,右键单击 deep_sea_corals 表,然后单击显示 XY 数据。
- 在显示 XY 数据窗格中,对于输出要素类,输入 CoralandSpongeLocations。
工具可以检测到表包含经度和纬度字段,并将其分配到 X 字段和 Y 字段输入参数。
- 单击确定。
工具将运行约一分钟。 工具运行完成后,CoralandSpongeLocations 要素类将添加到地图。
您不再需要 deep_sea_corals 表。
- 在独立表部分中,右键单击 deep_sea_corals 表,然后单击移除。
接下来,您将编辑 CoralandSpongeLocations 图层的符号系统。
- 右键单击 CoralandSpongeLocations 图层,然后单击符号系统。
随即显示符号系统窗格。
- 在符号系统窗格中,单击主符号系统下拉列表,然后单击唯一值。
- 单击字段 1 下拉列表,然后单击 VernacularNameCategory。
- 关闭符号系统窗格。
- 在快速访问工具栏上,单击保存按钮以保存工程。
设置地图的坐标系
您想要研究控制加利福尼亚州卡塔利娜岛附近水域中珊瑚和海绵分布的因素。 您要将地图的坐标系设置为专用于加利福尼亚州的投影坐标系,以确保精度。
- 在内容窗格中双击地图。
随即出现地图属性窗口。
- 在地图属性窗口中,单击坐标系。
- 在 XY 坐标系可用框中,输入 NAD 1983 California (Teale) Albers,然后按 Enter 键。
- 依次展开投影坐标系、State Systems,然后单击 NAD 1983 California (Teale) Albers (Meters)。
- 单击确定。
地图的坐标系更改为 NAD 1983 California (Teale) Albers 坐标系,地图的 XY 单位已设置为米。
此投影已经过优化,可支持加利福尼亚州的面积计算。 可以看到投影使世界上的其他区域发生了畸变,但您的感兴趣区域是畸变程度较轻的区域,因此这不是问题。 您将提取与研究相关的点,因此,太平洋遥远地区点的畸变也不是问题。
选择工程数据
现在您已经下载了整个北太平洋的数据,您可以为工程设置一个兴趣区域 (AOI),然后将数据裁剪到此区域。 这样,就可以使用更易于管理的数据子集。
- 在目录窗格中,单击门户,然后单击 ArcGIS Online。 在搜索栏中,输入 California_Detail_Learn_ArcGIS。
注:
要打开目录窗格,在功能区上,单击视图选项卡,然后在窗口组中,单击目录窗格。
- 在搜索结果中,将所有者为 Learn_ArcGIS 的 California_Detail_Learn_ArcGIS 图层拖动到地图上。
- 在内容窗格中,右键单击 dtl_st_trim,单击重命名,然后将图层命名为 California。
- 在功能区上单击地图选项卡,然后在查询组中单击定位。
- 在定位窗格中的搜索栏上,输入 Catalina Island,然后单击 Catalina Island, CA, USA。
地图将缩放到卡塔利娜岛。
- 在地图窗口的下方一角,单击下拉比例指示器,然后选择 1:500,000。
- 在功能区上,单击地图选项卡,然后在导航部分中,单击浏览。
- 单击地图并平移地图,使卡塔利娜岛位于中心。
- 在选择组中,单击选择。
要仅选择珊瑚和海绵点,需要将 CoralandSpongeLocations 图层设置为唯一的可选图层。
- 在内容窗格中,右键单击 CoralandSpongeLocations 图层,指向选择,然后单击将此图层设为唯一可选图层。
- 当选择工具处于激活状态时,在卡塔利娜岛附近水体中的珊瑚和海绵点周围绘制一个框。
所选点以青色高亮显示,表示点处于选中状态。
- 在内容中,右键单击 CoralandSpongeLocations,指向数据,然后单击导出要素。
- 在导出要素窗口中,对于输出要素类,输入 CoralandSpongeCatalina。
工具将显示一条消息,指示输入具有选择内容。 您的已选点数量可能更多或更少,具体取决于所选区域。 其精确数量不重要,但数字接近 6,000 时效果较好。
运行工具之前,您将设置输出要素类的投影。
- 在导出要素工具上,单击环境选项卡。
- 在导出坐标部分中,单击输出坐标系下拉列表,然后单击当前地图 [Map]。
- 单击确定。
工具将导出卡塔利娜岛周围 AOI 的已选要素。 如果您拥有多个研究区域,则可以使用相同的方法,设置适用于在该位置执行分析的坐标系,缩放至该位置,选择要素并使用地图坐标系导出要素,从而创建用于分析和比较的其他数据集。
- 在内容窗格中,取消选中 CoralandSpongeLocations 图层。
现在将仅显示卡塔利娜岛周围的选定要素。
- 保存工程。
提示:
您也可以按 Ctrl+S 保存工程。
创建外接矩形
接下来,您将创建 AOI 的外接矩形,并将沿海地貌模型作为栅格导入。
- 如有必要,可在 ArcGIS Pro 打开您的工程。
- 单击功能区上的分析选项卡,然后单击工具。
将出现地理处理窗格。
- 在地理处理窗格的搜索栏中,输入最小边界几何。 在结果列表中,单击最小边界几何工具。
- 在最小边界几何工具窗格中,设置以下参数:
- 对于输入要素,选择 CoralandSpongeCatalina。
- 对于输出要素,输入 CatalinaBoundary。
- 对于几何类型,选择包络矩形。
- 单击运行。
- 在内容窗格中,单击 CatalinaBoundary 图层的符号。
- 在符号系统窗格中,单击图库选项卡,然后选择黑色轮廓(2 磅)。
现在,您拥有了表示研究区域的面和其中的珊瑚和海绵观测点。
添加海洋测深数据
沿海地貌模型采用 NetCDF 格式。 NetCDF 是一种数据格式,用于共享数组定向的科学数据,通常用于海洋学。 您将根据 NetCDF 文件创建一个栅格数据集,以执行分析。
- 在地理处理窗格中,单击后退箭头。 输入创建 NetCDF 栅格图层,然后单击创建 NetCDF 栅格图层打开该工具。
- 在创建 NetCDF 栅格图层工具窗格中,对于输入 netCDF 文件,单击浏览按钮。
- 在输入 netCDF 文件窗口中,浏览至 C:\DeepSeaCoralSponge 文件夹(或者您保存 crm_socal_3as_vers2.nc 文件的位置)。
- 单击 SouthernCABathymetry.nc,然后单击确定。
变量参数已设置为 Band1,而 X 和 Y 维度值已设置为 lon 和 lat。
- 单击运行。
提示:
此步骤可能需要几分钟时间。
栅格图层显示整个南加利福尼亚州区域。
- 保存工程。
准备用于分析的图层
为了能够准确分析下载的数据,您将投影并裁剪海洋测深图层。 最好对投影到投影坐标系中的地形或海洋测深栅格执行分析,该投影坐标系的单位应与栅格的高程或深度单位匹配。 在本例中,深度以米为单位。 您要将栅格投影至为数据框和 CoralSpongeCatalina 图层设置的加利福尼亚州投影坐标系。 坐标系使用米作为线性单位,与深度值的单位相同。
- 在地理处理窗格上,搜索并打开投影栅格工具。
- 在投影栅格窗格上,对于输入栅格,选择 Band1_Layer,对于输出栅格数据集,输入 CatalinaBathymetry。
- 对于输出坐标系,单击下拉菜单,然后单击当前地图 [Map]。
坐标系更新为与数据框坐标系匹配。
此外,将自动应用地理变换。 当输入和输出地理坐标系具有不同的地理坐标系 (GCS) 时,会使用变换以确保数据能够正确对齐。 在本例中,变换会解释 NetCDF 数据使用的 WGS 1984 GCS 和 California Teale Albers 坐标系使用的 NAD 1983 GCS 之间的差异。
- 单击环境选项卡。
- 在环境选项卡上的处理范围部分中,单击范围下拉菜单,然后单击 CatalinaBoundary。
此操作仅会投影 AOI 中的海洋测深数据,其结果为仅覆盖研究区域的较小栅格。 将处理范围限制在 AOI 之内可以节省磁盘空间并减少处理时间。
- 单击运行。
投影整个海洋测深栅格可能要花费几分钟,现在的处理方式则快得多。
- 在内容窗格中,右键单击 CatalinaBathymetry,然后单击符号系统。
- 在符号系统窗格中,单击选项按钮,然后单击从图层导入。
随即出现应用图层的符号设置工具。
- 对于符号系统图层,选择 Band1_Layer 并单击运行。
现在,您已将海洋测深数据裁剪至卡塔利娜区域,将数据投影至平面坐标系并进行了符号化,因此您不再需要将更大的 Band1_Layer 显示在地图上。
- 在内容窗格中,右键单击 Band1_Layer,然后单击移除。
- 保存工程。
执行栅格分析
现在,已针对 AOI 准备了海洋测深栅格,您将根据它来派生坡度和坡向栅格。 借助这些栅格,您将探索研究区域内可能控制珊瑚和海绵分布情况的因素。
- 在地理处理窗格的搜索栏中,输入坡度 (Spatial Analyst)。 单击坡度工具。
- 在坡度工具窗格中,对于输入栅格,选择 CatalinaBathymetry。 对于输出栅格,输入 CatalinaSlope。
- 单击运行。
已针对 AOI 内的每个像元计算坡度。 坡度可以确定栅格表面每个像元处的陡度。 坡度值越小,地势越平坦;坡度值越大,地势越陡峭。
- 在地理处理窗格上,单击后退按钮。 搜索并单击坡向 (Spatial Analyst) 工具。
- 在坡向工具窗格中,对于输入栅格,选择 CatalinaBathymetry。 对于输出栅格,输入 CatalinaAspect。
- 单击运行。
已针对 AOI 内的每个像元计算坡向。 坡向工具可以确定下坡坡度所面对的方向。 输出栅格中各像元的值可指示出各像元位置处表面所朝向的罗盘方向。
- 保存工程。
增强数据库
现在已经为圣卡塔利娜岛 AOI 创建了海洋测深、坡度和坡向栅格,您将采用这些值并将其整合至珊瑚和海绵数据库。 您将使用多值提取至点工具将值从这三个栅格添加到每个珊瑚和海绵位置点。 这样,您即可创建图表,以了解在观察到珊瑚和海绵的位置处,这些环境参数具有怎样的变化。
- 打开地理处理窗格。 搜索并打开多值提取至点工具。
- 在多值提取至点工具窗格中,对于输入要素,选择 CoralandSpongeCatalina。
- 对于输出栅格,选择以下项:
- CatalinaBathymetry
- CatalinaSlope
- CatalinaAspect
- 对于相应的输出字段名称,输入以下内容:
- Bathymetry
- 坡度
- 坡向
- 单击运行。
- 在内容窗格中,右键单击 CoralandSpongeCatalina 图层,然后单击属性表。
- 在属性表中,滚动以确认已为每个要素添加 Bathymetry、Slope 和 Aspect 值。
- 关闭表并保存工程。
现在,您已使用环境数据增强了珊瑚和海绵点,下一步便是使用图表可视化这些值。
使用 Python 探索数据
ArcGIS Pro 包含 ArcGIS Notebooks,以供数据科学社区探索数据。 您将在 Notebooks 中使用 Python 代码探索三个环境变量和不同珊瑚与海绵种类之间的关系。 这将有助于了解其首选栖息地。
使用 Notebooks 创建图表
您已导入海洋探测、派生的坡度和坡向栅格,并将结果数据添加至珊瑚和海绵观测点。 尽管可以目视检查图层以获取深入见解,但是有时创建图表更容易了解数据。 现在,您需要创建图表来探索数据。
- 在功能区上,单击分析选项卡。 在地理处理组中,单击 Python 旁的下拉箭头,然后单击 Python Notebook。
随即显示 Notebook 窗口,目录窗格的 Notebooks 新组下将列出一个新笔记本。
可通过 Python 笔记本和 Python 窗口这两种方式来运行 Python 代码。
Python 窗口中的代码会在您按 Enter 后立即运行。 Notebooks 允许在不同单元格中键入多行代码,运行代码,对其进行编辑然后重新运行。 Notebooks 可用于对代码进行原型制作以及数据分析。
- 在目录窗格中,展开 Notebooks。
- 右键单击 New Notebook.ipynb 并选择重命名。
- 键入 CoralSponge,然后按 Enter 键。
- 单击笔记本中的空白单元格。
- 要将 ArcPy 模块导入单元格,复制粘贴或键入下面的代码行:
import arcpy
Python 区分大小写,因此大写必须一致。
- 在第一个单元格上方的工具栏中,单击运行。
在该单元格运行时,星号 * 会在括号 [*] 中显示。 当其完成运行时,该星号将替换为数字 1,新的空白单元格会在第一个单元格下方显示。
Arcpy 模块包含 Python 代码,用于支持许多桌面制图和分析任务。
有时,在单元格中键入代码时,可能存在错误,例如打字错误。 在这种情况下,您可能会在单元格后面看到一条错误消息。
- 单击第二个单元格,然后键入 import ARCPY,然后单击运行按钮。
这一行代码会导致错误,因为未在 Python 中安装名为 ARCPY 的模块。 原始的第一行 import arcpy 运行正确。 尝试导入 ARCPY(或 arcPy、ArcPy 或者除 arcpy 之外的任何其他验证)将失败。 下面是区分大小写如何影响 Python 中的代码的示例。 用户可以略过和理解的轻微打字错误会导致 Python 代码出错。
接下来,您将编写一些代码以基于数据创建图表。 您需要使用 ArcPy 中的图表类。
- 在第二个单元格中,删除 import ARCPY 一行。
您需要将第二个单元格中的代码替换为作用本质上与您要做的事情相同的代码,以使用 ArcGIS Pro 图形用户界面创建图表。 但是,使用 arcpy.Chart 类创建图表时,需要使用一组 Python 命令指定图表的详细信息,而不是单击用户界面元素。
- 在第二个单元格中复制粘贴以下代码:
my_chart = arcpy.Chart('my_chart') my_chart.type = 'bar' my_chart.title = 'CoralandSpongeCatalina' my_chart.description = 'This chart shows the mean Slope values that correspond with the taxa in the CoralandSpongeCatalina layer.'
第一行 (my_chart = arcpy.Chart('my_chart')) 用于创建变量并将其设置为等效于属于 Chart 类的新对象。 该对象名为 my_chart。 可以将 Chart 类视为图表的模板。 您已创建一个图表,现在必须指定图表类型及其具有的属性。 剩余代码行就是为了实现此目的。
下一行 (my_chart.type = 'bar') 指定图表将为条形图。 它将图表的类型属性设置为条形图。 注记 my_chart.type 用于评估 my_chart 的类型属性,等号用于将值 'bar' 赋给该属性。 Chart 对象类支持各种类型的图表,它们按名称进行标识,例如条形图、折线图和散点图。 这些名称指定为包含在引号内的 Python 字符串。
接下来以 my_chart.title 和 my_chart.description 开头的几行用于指定图表的标题和描述。 代码执行此操作的方式与其设置类型相同,即评估 my_chart 对象的属性,然后将其设置为特定字符串值。 在此情况下,您在代码行中添加了 Python 字符串,而不是在文本框中键入描述。
- 将以下代码复制粘贴到单元格底部:
my_chart.xAxis.field = 'VernacularNameCategory' my_chart.xAxis.aggregation = 'VernacularNameCategory' my_chart.xAxis.title = 'Name' my_chart.yAxis.field = 'Slope' my_chart.yAxis.title = 'Mean Slope' my_chart.bar.aggregation = 'MEAN'
接下来的三行(以 my_chart.xAxis 开头)用于指定图层中将用于 X 轴的字段以及如何聚合该列中的值。 对于这两行,VernacularNameCategory 是 CoralandSpongeCatalina 图层属性表中的字段,其中包含不同珊瑚和海绵的名称。 为聚合指定 VernacularNameCategory 意味着值将按该字段中的唯一值进行分组。 接下来,会将 X 轴的标题设置为名称,以将该轴标注为珊瑚和海绵名称。
以 my_chart.yAxis 和 my_chart.bar.aggregation 开头的两行用于为 Y 轴指定字段、标题和聚合方法。 将使用数据表中的坡度字段并通过平均值对其进行聚合。 Y 轴将标注为平均坡度,因为它将显示每个珊瑚和海绵组的坡度的平均值。
注:
如果您在运行多值提取至点工具时接受了默认输出字段名称,则必须检查 CoralandSpongeCatalina 图层的属性表,确定包含坡度至的字段的名称。 必须编辑 my_chart.yAxis.field = 'Slope' 行才能包含正确的字段名称(如果不是坡度)。
- 将以下代码复制粘贴到单元格底部:
my_chart.dataSource = 'CoralandSpongeCatalina' my_chart.addToLayer = 'CoralandSpongeCatalina'
最后这两行用于指定地图上作为数据源并将图表添加至图层的图层。
注:
如果之前未将图层命名为 CoralandSpongeCatalina,则必须编辑此行以与图层名称相匹配
该单元格即已完成。
- 单击运行。
图表已创建,但是似乎不起作用。 要查看图表,必须运行 Python 代码才能进行显示。
- 在下一个新单元格中,复制粘贴以下代码,然后单击运行:
my_chart
图表即会在单元格下方显示。
- 将以下代码复制粘贴到下一个单元格中:
outChartName = "CoralandSpongeCatalinaSlope.svg" outSVGPath = "C:/Lessons/DeepSeaCoralSponge/" + outChartName my_chart.exportToSVG(outSVGPath, width=1500, height=800)
注:
如果之前创建的 DeepSeaCoralSponge 工程文件夹位于除 C:/Lessons/DeepSeaCoralSponge/ 之外的其他位置,编辑单元格中的路径以与计算机中的路径相匹配。 使用正斜线作为分隔符的路径可能看起来很奇怪。 Python 使用 \ 字符作为转义字符,该字符结合其他字符可表示换行符或制表符,因此建议在此路径中使用正斜线。
第一行代码(以 outChartName = 开头)用于定义图表文件的文件名,包括文件扩展名。 文件名为引号内的字符串。
第二行 (outSVGPath =) 用于定义一个字符串,以指定应保存该文件的路径。 其中使用 + 符号追加文件名,该符号可用于连接文本字符串(称为串连)以及在 Python 中添加数字。
第三行 (my_chart.exportToSVG) 用于调用图表对象的 exportToSVG 方法,并提供包含位于括号内的文件名、宽度(以像素为单位)和高度(以像素为单位)的完整路径作为方法的参数。
- 运行单元格。
将在文件夹中创建图表文件。
- 在计算机的 Microsoft File Explorer 中,转至该文件夹,然后打开图表图像。
该图表大于在笔记本中显示的图表,因为您为输出图表指定了不同的尺寸。
- 在检查图表后将其关闭。
尽管此方法可能看起来需要很多工夫,尤其当与通过 ArcGIS Pro 界面进行单击相比,但是使用代码可以自动执行过程。 在下一节中,您将学习如何将此代码转换为函数,以在创建多个图表时调用。
创建图表绘制函数
您学习了如何使用 Python 代码创建单个图表。 现在,您需要调整该代码以提高其可重用性。 您将创建 Python 函数,用于创建多个图表。
- 将以下代码复制粘贴到下一个单元格中:
def coral_and_sponge_chart(layer, field):
此行以 def 开头。 这将告知 Python 您要定义新函数。 下一部分为 coral_and_sponge_chart 函数的名称。 函数名称为当您想要运行该代码时如何在函数内引用代码块。 下一部分包含在括号内。 这些参数将在函数中使用。 参数是函数的输入,由函数进行处理以生成一些结果。 此函数将使用图层和字段名称作为输入。 它将为该字段创建条形图。 该行以冒号结尾。 这表示接下来的几行将为该函数的代码块。
- 按 Enter 键。
在开始函数定义的行后面按 Enter 键时,下一行会缩进四个空格。
- 将以下代码复制粘贴到单元格中:
my_chart = arcpy.Chart('MyChart') my_chart.type = 'bar'
这两行中的每一行与用于创建先前图表的代码相同,但是缩进了四个空格。 Python 使用缩进对代码部分进行分组。 此函数内的代码块行应全部缩进四个空格。
这几行用于基于 Chart 类创建图表并指定该图表应为条形图。
- 按 Enter 键,然后将以下代码复制粘贴到单元格中 chart.type 一行的后面:
my_chart.title = layer
该行的开头与原始图表代码中的下一行相似,但是不是将图表标题指定为特定字符串,而是指定标题应与输入图层参数相同。 这意味着输出图表标题与其图层名称一致,无论该图层为何。
- 将以下代码复制粘贴到单元格中 my_chart.title 一行的后面:
my_chart.description = f'This chart shows the mean {field} values that correspond with the taxa in the {layer} layer.'
该行类似于原始图表代码中的行,但会有一些差异。 第一个差异是,此行用于将描述设置为与 f 字符串或已格式化字符串相同,而不是与特定字符串相同。 已格式化字符串为可在其中替换值的字符串。 这些字符串以 f 开头,紧跟着一个引号。 f 用于向 Python 指示该字符串为已格式化字符串。
下一个差异为,不会将描述设置为包含文本 the mean Slope values,代码编写如下:the mean {field} values。 这意味着什么呢?
由于这是一个 f 字符串,代码 {field} 将替换为函数输入参数中的字段名称。 这同样适用于包含 in the {layer} layer 的代码的末尾。 {layer} 将替换为图层名称。 这样,输出图表描述将与输入图层和字段名称相匹配。
- 在同一单元格中,另起一行,复制粘贴以下代码:
my_chart.xAxis.field = 'VernacularNameCategory' my_chart.xAxis.aggregation = 'VernacularNameCategory' my_chart.xAxis.title = 'Name'
这三行与原始图表代码中的行相同,但是缩进了四个空格以称为代码块的一部分。 该函数将针对每个输入图层的 VernacularNameCategory 字段值绘制条形图,并对图表 Name 的 X 轴进行命名。
如果在缺少 VernacularNameCategory 字段的图层上运行该函数,则此行将失败并导致错误。 但是,所有 CoralandSpongeLocations 点均具有此字段,因此无论所选的研究区域为何,该函数都适用。
- 在同一单元格中,另起一行,复制粘贴以下代码:
my_chart.yAxis.field = field my_chart.yAxis.title = 'Name'
在这里,代码为 Y 轴的设置属性。
- 在同一单元格中,另起一行,复制粘贴以下代码:
my_chart.bar.aggregation = 'MEAN'
此行与原始代码中的行相同。 它会将条形图设置为显示每种类型珊瑚和海绵对应的输入字段的平均值。
- 在同一单元格中,另起一行,复制粘贴以下代码:
my_chart.dataSource = layer my_chart.addToLayer = layer
这些行类似于原始图表代码中的行,但不会设置数据源并将图表添加至特定的已命名图层(原始代码中的 CoralandSpongeCatalina),而是针对函数的输入图层执行该操作。 如果为其他研究区域创建了另一个珊瑚和海绵点子集(例如,在夏威夷附近或阿拉斯加沿海);向其添加了坡度、坡向和海洋测深值;并将其命名为其他名称,则该函数仍可用于创建图表并将其与输入图层相关联。
- 在同一单元格中,另起一行,复制粘贴以下代码:
outChartName = layer + field + ".svg" outSVGPath = "C:/Lessons/DeepSeaCoralSponge/" + outChartName my_chart.exportToSVG(outSVGPath, width=1500, height=800)
这些行类似于原始代码中的行。 outChartName 一行通过串连传递到函数的图层名称和字段名称构造图表名称。 如果您为阿拉斯加研究区域创建了一个图层,则输出图表名称会反映该图层的名称。
注:
如果之前创建的 DeepSeaCoralSponge 工程文件夹位于除 C:/Lessons/DeepSeaCoralSponge/ 之外的其他位置,编辑路径以与计算机中的路径相匹配。
- 在同一单元格中,另起一行,复制粘贴以下代码:
return my_chart
返回语句会使函数将图表对象返回到调用该函数的代码。
用于创建下一个图表的代码块即已完成。
第一行用于定义函数,应从最左侧列开始,后面的每一行应缩进四个控制。
def coral_and_sponge_chart(layer, field): my_chart = arcpy.Chart('MyChart') my_chart.type = 'bar' my_chart.title = layer my_chart.description = f'This chart shows the mean {field} values that correspond with the taxa in the {layer} layer.' my_chart.xAxis.field = 'VernacularNameCategory' my_chart.xAxis.aggregation = 'VernacularNameCategory' my_chart.yAxis.field = field my_chart.xAxis.title = 'Name' my_chart.yAxis.title = field my_chart.bar.aggregation = 'MEAN' my_chart.dataSource = layer my_chart.addToLayer = layer outChartName = layer + field + ".svg" outSVGPath = "C:/Lessons/DeepSeaCoralSponge/" + outChartName my_chart.exportToSVG(outSVGPath, width=1500, height=800) return my_chart
- 单击运行。
该单元格应运行但不会返回任何内容。
注:
如果显示错误消息,将整个代码块从此处复制粘贴到单元格中并运行。 一定要将 outSVGPath 变量的路径更新为计算机中的实际路径(使用正斜线)。
为什么此代码在运行单元格时未返回任何内容?
该代码用于定义函数,但是该函数需要由其他 Python 代码运行或调用。
- 在下一个单元格中,复制粘贴以下代码:
coral_and_sponge_chart()
- 运行单元格。
将显示一条错误消息。
该错误告知您该函数缺少两个必需的位置参数:图层和字段。 该函数需要这些值才能正常运行。
- 将单元格的内容替换为以下代码,然后单击运行:
coral_and_sponge_chart('CoralandSpongeCatalina', 'Slope')
图表将在笔记本中显示,并将在指定的文件夹中创建图表的 .svg 图形文件。 该文件的文件名与第一个代码的输出相同,但是现在查看该文件时,将看到其修改日期值已更新。
该结果与从第一个代码块获得的结果相同。 但是,现在您有一个函数,可向其传递图层名称和字段名称,从而获得其他图表。
- 在下一个单元格中,复制粘贴以下代码,然后单击运行:
myList = ['Slope', 'Aspect', 'Bathymetry']
- 在下一个单元格中,复制粘贴以下代码,然后单击运行:
print(myList)
在 Python 中,列表包含在方括号内,可通过这些列表存储以逗号分隔的对象组。 在此情况下,列表 myList 包含三个对象,分别是名为 Slope、Aspect 和 Bathymetry 的字段。
如果您在运行多值提取至点工具时接受了默认输出字段名称,则必须检查 CoralandSpongeCatalina 图层的属性表,确定字段名称,编辑 myList 中的值以匹配,并再次运行该单元格以重置 myList 值。
- 在下一个单元格中,复制粘贴以下代码,然后单击运行:
for envField in myList: outChart = coral_and_sponge_chart('CoralandSpongeCatalina', envField)
此单元格包含新的 Python 代码构造,即 for 循环。 for 循环用于循环或迭代一系列项目。 第一行用于指定循环将通过 myList 中的每个项目并将其赋值给临时变量 envField。 冒号指定下一部分将为 for 循环的代码块。 下一行将缩进四个空格,就像函数定义中的行一样。 将针对循环的每个周期或迭代运行 for 循环块中的缩进行。
在此情况中,代码块中只有一行。 此行与之前为测试 coral_and_sponge_chart 函数运行的行非常相似。 该行会创建一个变量并将其值设置为相当于对 CoralandSpongeCatalina 图层运行 coral_and_sponge_chart 函数,但不会同时指定 Slope 字段,而是对其从 envField 变量获取的字段名称运行该变量。 由于列表中存在三个项目,该循环将运行三次并为全部三个字段分别创建一个图表。
- 在计算机的 File Explorer 中,浏览至在函数定义中指定的文件夹。
应看到每个属性对应的图表。 这些输出文件可以在演示文稿中使用,使用 ArcGIS StoryMaps 添加至故事,或者放置在 ArcGIS Pro 中的地图布局上。
与手动创建三个图表相比,这样做的速度略快。 假设您有六个不同的环境变量用于丰富珊瑚和海绵点。 您可以为这些字段值创建列表并调用函数为每个值创建图表,该过程所花费的时间与创建这三个图表的时间几乎相同。
假设您有五个研究区域,并且想要为每个研究区域的所有值创建图表。 由于该函数还会将图层名称用作参数,因此可以为所有图层名称创建列表,创建 for 循环以循环遍历这些名称,然后在该 for 循环内调用刚刚创建的循环。
用于实现此目的的代码如下:
myLayersList = ['CoralandSpongeCatalina'] # You would add comma separated layer names in # quotation marks to the myLayersList, such as: # ['CoralandSpongeCatalina', 'CoralandSpongeAlaska', 'CoralandSpongeHawaii'] myList = ['Slope', 'Aspect', 'Bathymetry'] # You could add comma separated field names to the list for lyrName in myLayersList: # outer loop, iterate over the layer names in the list for envField in myList: # inner loop, iterate over the field names for that layer outChart = coral_and_sponge_chart(lyrName, envField)
对于 6 个变量和 5 个研究区域图层,创建这 30 个图表所需的时间与创建三个几乎相同。
- 在下一个单元格中,复制粘贴以下代码,然后单击运行:
outChart
可以看到该循环创建了三个图表。 为什么在运行此单元格时只显示一个?
变量 outChart 在循环的每个周期中重置为新图表。 完成循环时,变量将分配到在最后一个周期中创建的图表。 从循环编写输出文件时,常见问题为预期有多个输出,但实际上仅获得一个。 通常,这是因为输出文件名在循环的每个周期中相同。 将为每个周期生成结果,但是由于名称相同,在每个周期中会覆盖相同文件。 coral_and_sponge_chart 函数可基于输出变量构造文件名,从而避免此类问题。
outChartName = layer + field + ".svg"
还可通过其他方式处理此问题。 方式之一为在循环中包含计数器变量,并将其串连到输出文件名,从而生成 outfile_1、outfile_2、outfile_3 等。 另一种方式是将当前时间添加到文件名,除非每个周期的处理时间非常短,否则此举可行。 还有一种方式为创建唯一标识符并将其添加至文件名,尽管此举会导致文件名很长并且可能令人迷惑。
- 保存工程。
提示:
对于其他挑战,尝试选择另一个感兴趣区,然后按照本节教程中的步骤创建一组图表。
在本教程中,您学习了如何从 NOAA 下载海洋测深以及珊瑚和海绵数据。 您学习了如何将数据投影到适当的平面坐标系以进行栅格分析。 您学习了如何创建感兴趣区,派生 AOI 的坡度和坡向图层,以及将该信息追加到珊瑚和海绵属性。 您学习了如何使用 Python 创建图表以及如何定义函数以自动生成多个图表。 可以使用上述方法分析世界各地多个区域的珊瑚和海绵数据。
您可以在教程库中找到更多教程。