添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
使用 Python 自动化地理处理工作流 打开工程和查看数据集 投影要素类 使用 Python 描述要素类 创建要素类列表并描述要素类 创建脚本 使用代码创建地理数据库 使用代码创建要素数据集 使用代码根据条件复制要素类 添加代码以根据条件投影要素类 为脚本添加注释 想要了解更多?​ 相关 Esri 培训
<p id="GUID-789F80AA-5C75-433F-9907-13968A9155BF">GIS 中的许多工作流都包含重复性任务。 地理处理工具可以通过 <span class="ph">ArcGIS Pro</span> 中的<span class="uicontrol">地理处理</span>窗格运行,但也可以在 <span class="ph">Python</span> 中作为 <span class="ph">ArcPy</span> 的函数使用。 这样,您就可以使用 <span class="ph">Python</span> 脚本自动化重复性地理处理任务。</p><p id="GUID-5DA33998-9690-4129-A7C1-80FA7EFF6015">在本教程中,您将编写一个 <span class="ph">Python</span> 脚本,用于检查多个数据集的坐标系,并在脚本中使用该信息确定应如何处理数据集。</p><p id="GUID-8A32B3BF-8A21-4542-A305-D28A729B75D5">有关本教程中涉及的主题的更多详细信息,请参阅 Esri Press 出版的书籍 <a target="_blank" class="xref xref" href="https://www.esri.com/en-us/esri-press/browse/python-scripting-for-arcgis-pro">Python Scripting for ArcGIS Pro</a>。</p><p id="GUID-6B3DA3B6-4801-48D1-9C5E-CA627EEC9FD0"><i>本教程上次于 2024 年 4 月 26 日使用 <span class="ph">ArcGIS Pro</span> 3.3 进行了测试。 如果您使用的是其他版本的 <span class="ph">ArcGIS Pro</span>,可能会遇到不同的功能和结果。</i></p></div> <div class="requirements" id="requirements"><h4 class="leader-1 trailer-half">要求</h4><ul><li purpose="li" id="LI_DE9BCFAE9FAF40C8A468601630BE2123" conrefsub="GUID-33DD3BCE-FFEC-4235-A376-3F0693A4C2F4/LI_1E64CA2FB972496AA3381961793ACE82"><span class="ph">ArcGIS Pro</span>(<a class="xref xref" esrisubtype="extrel" hrefpfx="" href="/en/become-a-member/">请参阅软件访问权限选项</a>)</li></ul></div> <div class="lesson-plan" id="lesson-plan"><h2 class="leader-1">Outline</h2><table class="table-striped"><tbody><tr><td><a href="#%E4%BD%BF%E7%94%A8 Python %E8%87%AA%E5%8A%A8%E5%8C%96%E5%9C%B0%E7%90%86%E5%A4%84%E7%90%86%E5%B7%A5%E4%BD%9C%E6%B5%81"><h5 class="trailer-0">使用 Python 自动化地理处理工作流</h5></a><p>了解如何列出地理数据库中的要素类并将其复制到另一个地理数据库,同时根据条件投影到通用坐标系。</p></td><td><ul class="tpc-duration">1 小时 15 分钟</ul></td></tr></tbody></table></div> <section class="section1 padded-anchor" id="subsection-1" purpose="section1"><h2>打开工程和查看数据集</h2><p id="GUID-58B54193-CFA2-4D47-8682-12231A9644E7">在开始使用 <span class="ph">Python</span> 运行地理处理工具之前,您将在 <span class="ph">ArcGIS Pro</span> 中下载并查看数据集。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_0217BD30FB5C47D3A6D7562ECD49C791"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_6B33DC80779948C1B0A8A0F45D078099"><span purpose="cmd">下载<a target="_blank" class="xref xref" href="https://arcgis.com/sharing/rest/content/items/f549c8f9501c4e8394cbe55adfe08774/data">本教程数据</a>,并将内容提取到您的计算机上的某一位置。</span><div class="info" purpose="info"><p id="GUID-9259F3A1-ECA8-4154-A912-56625767FB6F"><span class="usertext">.zip</span> 文件包含名为 <span class="uicontrol">PythonWorkflow</span> 的文件夹。</p><p id="GUID-20089BD5-8904-4E78-A581-11DF8A3855A5">在本教程中,数据显示在 <span class="usertext">C:\Lessons\PythonWorkflow\</span> 位置。 您可以使用其他文件夹,但如果这样做,则必须在随后的说明和代码中调整路径。</p></div></li><li purpose="step" id="ESRI_STEP_24384BE5A10F4A57BE0C17FEE546FE17"><span purpose="cmd">在 <span class="usertext">C:\Lessons\PythonWorkflow\</span> 文件夹中,双击 <span class="uicontrol">Workflow.aprx</span>。</span><div class="info" purpose="info"><p id="GUID-7F301807-A9F0-41E8-9B94-7FC0B37613FB">Workflow 工程将在 <span class="ph">ArcGIS Pro</span> 中打开。</p></div></li><li purpose="step" id="ESRI_STEP_1833AEB85A2C4FBF841EC5954D3EC71D"><span purpose="cmd">如果<span class="uicontrol">目录</span>窗格尚未显示,请单击<span class="uicontrol">视图</span>选项卡,然后单击<span class="uicontrol">目录</span>窗格。</span></li><li purpose="step" id="ESRI_STEP_37ACE6481C80461386518600DFD317DA"><span purpose="cmd">在<span class="uicontrol">目录</span>窗格中,展开<span class="uicontrol">文件夹</span>,然后展开 <span class="uicontrol">PythonWorkflow</span>。</span></li><li purpose="step" id="ESRI_STEP_E6BEBEE5F0F64B0BBDF0CCD26852F3FE"><span purpose="cmd">展开 <span class="uicontrol">Transportation.gdb</span>。</span><div class="info" purpose="info"><p id="GUID-D5D85376-A98E-4DAF-B0F9-57513999A46C"><img purpose="img" placement="inline" alt="Transportation 地理数据库展开以显示要素类。" title="Transportation 地理数据库展开以显示要素类。" src="GUID-162F6514-B8D0-421F-805A-5D541735F469-web.png" loading="lazy"/></p><p id="GUID-B51BAE55-6F4D-44D1-B70D-D4F6987C3761">此地理数据库中的要素类与交通运输相关。 假设您需要根据这些要素类构建网络。 为了实现该目的,这些要素类需要存储在相同的要素数据集中,并且具有相同的坐标系。 当前情况并非如此。</p><p id="GUID-76D9BAAB-78A1-4521-A28D-951CDA2A17A2">在本教程中,您将使用 <span class="ph">Python</span> 代码检查要素类的坐标系,并使用<span class="uicontrol">投影</span>工具对所有当前不在正确坐标系中的数据集进行转换,从而将其复制到新地理数据库和要素数据集。 您可以通过此操作创建一个网络,但您在本课程中不会构建网络。</p><p id="GUID-B47AC6DD-C3F6-45DA-A121-5491638F3D12">在处理 <span class="ph">Python</span> 代码之前,您将检查所选数据集的坐标系并手动运行<span class="uicontrol">投影</span>工具。 您将通过此操作了解使用 <span class="ph">Python</span> 代码自动化过程所需的信息。</p></div></li><li purpose="step" id="ESRI_STEP_BAD6F5ED0DFA496AAB9AA9B7CF098E18"><span purpose="cmd">右键单击 <span class="uicontrol">bike_racks</span>,然后单击<span class="uicontrol">添加至当前地图</span>。</span><div class="info" purpose="info"><p id="GUID-34F19266-0FB0-4691-98C6-6BD26275C936"><img purpose="img" placement="inline" alt="右键单击 bike_racks 要素类,然后将其添加到当前地图。" title="右键单击 bike_racks 要素类,然后将其添加到当前地图。" src="GUID-17DB57CA-F19E-4083-9B6B-920366C51CB9-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_6CBFD51CC31C4A6393A893960E55363D"><span purpose="cmd">使用相同方法将道路要素类添加到地图。</span><div class="info" purpose="info"><p id="GUID-03CB8660-DE88-4EDC-8670-F669F2EDDCB4">这些要素类表示华盛顿特区内的自行车停放架和道路。</p><p id="GUID-05D83DDA-ADA4-4472-8702-1A348909AB02">接下来,您将查看两个要素类的坐标系。</p></div></li><li purpose="step" id="ESRI_STEP_4CB286D063FD4B55A06971B7B4BAFFE4"><span purpose="cmd">在<span class="uicontrol">内容</span>窗格中右键单击<span class="uicontrol">地图</span>,然后单击<span class="uicontrol">属性</span>。</span><div class="info" purpose="info"><p id="GUID-48D0C59A-2150-4361-B250-E2B1C49DCDE3"><img purpose="img" placement="inline" alt="打开地图的“属性”窗格。" title="打开地图的“属性”窗格。" src="GUID-4126044F-0AC9-414B-BD08-8FBF64BF48E5-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_7AB19E8C538C4E3F9348F8E99E4DB81D"><span purpose="cmd">在<span class="uicontrol">地图属性:地图</span>窗口中,单击<span class="uicontrol">坐标系</span>。</span><div class="info" purpose="info"><p id="GUID-920B2169-883C-400E-8B18-1587DD10A139"><img purpose="img" placement="inline" alt="单击坐标系。" title="单击坐标系。" src="GUID-A31C4838-5522-4D8B-AD73-5DDBEC6B4905-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_FA5EE60839C74FD48E91B849BFE9FC04"><span purpose="cmd">展开<span class="uicontrol">图层</span>,然后展开 <span class="uicontrol">WGS 1984</span> 和 <span class="uicontrol">NAD 1983 StatePlane Maryland FIPS 1900 (US Feet)</span> 坐标系的条目。</span><div class="info" purpose="info"><p id="GUID-28582E37-D08D-46C7-A3DE-D27351F1D387"><img purpose="img" placement="inline" alt="展开两个坐标系条目。" title="展开两个坐标系条目。" src="GUID-6A8EE57E-3B9C-4A43-9E8E-BC2CAD0235BC-web.png" loading="lazy"/></p><p id="GUID-8B632FD5-4A7D-4E5C-9905-9AF8EBE7B795">bike_racks 要素类位于名为 WGS 1984 的地理坐标系中,而 roads 和 boundary 要素类位于经过投影的美国国家平面坐标系(马里兰州)NAD 1983 StatePlane Maryland FIPS 1900 (US Feet) 中。</p><p id="GUID-89F20E53-C8D4-4D45-918A-6F681049B9B8">您的目标是将所有要素类置于具有投影坐标系的数据集中。</p></div></li><li purpose="step" id="ESRI_STEP_1DC8CA78512C433E9A293FE4D22464FA"><span purpose="cmd">单击<span class="uicontrol">确定</span>关闭<span class="uicontrol">地图属性</span>窗口。</span><div class="info" purpose="info"><p id="GUID-5061B9ED-B0BC-4E85-A142-C07E05D82C53">您已对地理数据库进行检查,并确定了要素类使用的两个坐标系。 接下来,您将投影其中一个要素类。</p></div></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-2" purpose="section1"><h2>投影要素类</h2><p id="GUID-4D9C726C-80CB-48E4-9C3E-3D619BD11043">接下来,您将投影其中一个要素类并检查工具所需的参数。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_6BDDCF652FFB4DF380D20FD8ACE5FD0C"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_3C2E8184C0B3462B849857B6240FDE81"><span purpose="cmd">单击功能区中的<span class="uicontrol">分析</span>,然后单击<span class="uicontrol">地理处理</span>部分中的<span class="uicontrol">工具</span>。</span><div class="info" purpose="info"><p id="GUID-FF585AA5-830C-4A76-AE95-E8422E756E34"><img purpose="img" placement="inline" alt="单击“分析”,然后在“地理处理”部分中单击“工具”。" title="单击“分析”,然后在“地理处理”部分中单击“工具”。" src="GUID-6D930963-F58F-46C9-A09B-6B5AE19A1F98-web.png" loading="lazy"/></p><p id="GUID-6BBAD3B6-4D8E-4A98-9C64-8F2C91F91DD1">将出现<span class="uicontrol">地理处理</span>窗格。</p></div></li><li purpose="step" id="ESRI_STEP_49007C90275F49D5B3B033F373F907BC"><span purpose="cmd">在<span class="uicontrol">地理处理</span>窗格中的搜索框内单击,然后输入<span class="uicontrol">投影</span>。</span></li><li purpose="step" id="ESRI_STEP_009579F7DCDC4D4AAE13EB9EF3BBB11B"><span purpose="cmd">在搜索结果中,单击<span class="uicontrol">投影(数据管理工具)</span>。</span></li><li purpose="step" id="ESRI_STEP_18AAE3A7BC544D598E2278EF76EC0318"><span purpose="cmd">在<span class="uicontrol">投影</span>工具窗格中,对于<span class="uicontrol">输入数据集或要素类</span>参数,请选择 <span class="uicontrol">bike_racks</span>。</span></li><li purpose="step" id="ESRI_STEP_E50F31484BB44EC3AAD0424C35CF07AD"><span purpose="cmd">对于<span class="uicontrol">输出数据集或要素类</span>名称,单击浏览按钮并浏览至 <span class="uicontrol">Transportation</span> 地理数据库。 展开地理数据库,然后在<span class="uicontrol">名称</span>框中输入 <span class="usertext">bike_racks_sp</span>。 单击<span class="uicontrol">保存</span>。</span></li><li purpose="step" id="ESRI_STEP_E3AE661D73B34DCE8C3AD2AD9C91C67C"><span purpose="cmd">对于<span class="uicontrol">输出坐标系</span>,单击下拉列表,然后单击 <span class="uicontrol">roads</span>。</span><div class="info" purpose="info"><p id="GUID-607714EF-8BBA-4878-B4BB-C4C3072F7BBD"><img purpose="img" placement="inline" alt="“投影”工具的参数已设置完成。" title="“投影”工具的参数已设置完成。" src="GUID-47BEA67E-8BC6-4106-8EF6-E9A03C685586-web.png" loading="lazy"/></p><p id="GUID-1A890221-063B-42FB-BEFD-B8F20C279ED3">选择 <span class="uicontrol">roads</span> 会将<span class="uicontrol">输出坐标系</span>的值设置为 roads 要素类的坐标系,State Plane Maryland 坐标系。</p><p id="GUID-08FD38F9-2DEC-4BA0-AFD3-A4719F6B9DDE"><span class="uicontrol">地理变换</span>参数已设置为 <span class="uicontrol">WGS_1984_(ITRF00) To_NAD_1983</span>,因为输入和输出的地理坐标系不同。</p><div class="panel trailer-1 note" id="GUID-4B05C699-136F-427F-A228-4768210A25B7"><h5 class="icon-ui-comment trailer-0">注:</h5><p id="GUID-CBAB54E0-087E-4409-BF79-52AE8EAC53E2">当输入要素类和输出要素类的地理坐标系不同时,必须使用地理变换。 当地理坐标系相同时,此参数不会显示值列表。 当有必要进行变换时,将显示一个基于输入和输出地理坐标系的下拉列表,并会选择一个默认变换。 在本教程中,您将使用此默认变换。</p></div></div></li><li purpose="step" id="ESRI_STEP_1827669ACFF4468BA1C816E396124D59"><span purpose="cmd">单击<span class="uicontrol">运行</span>。</span><div class="info" purpose="info"><p id="GUID-E3048AB5-E5CD-472D-9C68-60A042999EAF"><span class="uicontrol">投影</span>工具随即运行,已投影的要素类将添加到活动地图。</p><p id="GUID-FEE8B904-8B13-4DEF-AC6C-31775933F60F">为了准备要在网络中使用的数据,您需要对地理数据库中的每个要素类重复此过程:检查坐标系,并决定是否需要运行<span class="uicontrol">投影</span>工具。 投影必须进行投影的要素类。 在不进行投影的情况下复制其他要素类。</p><p id="GUID-2C747627-032B-4B5F-B2D8-C2180BCCA321">您不会手动重复这些步骤,而会改为使用 <span class="ph">Python</span> 代码自动化此过程。</p></div></li><li purpose="step" id="ESRI_STEP_D9F8BBE969DB41B487A3050D432DF805"><span purpose="cmd">关闭<span class="uicontrol">投影</span>工具。</span></li><li purpose="step" id="ESRI_STEP_BC331837EE6B4672BA109032E381A2AD"><span purpose="cmd">在<span class="uicontrol">目录</span>窗格中,右键单击 <span class="uicontrol">bike_racks_sp</span> 要素类,单击<span class="uicontrol">删除</span>,然后单击<span class="uicontrol">是</span>永久删除该要素类。</span><div class="info" purpose="info"><p id="GUID-BC076E33-49CF-4AE1-8EA7-154E92212196">现在,您即可使用 <span class="ph">Python</span> 代码开始工作流。</p></div></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-3" purpose="section1"><h2>使用 Python 描述要素类</h2><p id="GUID-FC95D547-F147-4CC1-A08A-98F3556A53B2">工作流中的第一步是检查要素类的坐标系。 为执行此操作,您将在 <span class="uicontrol">Python</span> 窗口中使用 <span class="ph">Python</span> 代码。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_09400093AE724C03803E6421478BC076"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_6A13E2E2EF7B45F58226F3ECF9420ACC"><span purpose="cmd">在功能区上,单击<span class="uicontrol">分析</span>,然后在<span class="uicontrol">地理处理</span>部分中单击 <span class="uicontrol">Python</span> 按钮上的下拉箭头,然后单击 <span class="uicontrol">Python 窗口</span>。</span><div class="info" purpose="info"><p id="GUID-4557175C-7B89-40D4-AEDF-D78A0D702F3C"><img purpose="img" placement="inline" alt="打开 Python 窗口。" title="打开 Python 窗口。" src="GUID-4A00FF26-14E5-4067-BCA1-F45F974BDE2B-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_E652A53A16F743F6A721E5627EEE8497"><span purpose="cmd">单击 <span class="uicontrol">Python</span> 窗口底部的提示符部分,输入以下代码,然后按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-F4BECB8D-4720-41A3-8F17-43D7CF2CF1EC"><span class="usertext">desc = arcpy.da.Describe("bike_racks")</span></p><p id="GUID-FB3B1D7D-CAC9-42C3-A3A1-9EA82B80A2F0"><img purpose="img" placement="inline" alt="添加用于描述 bike_racks 要素类的代码。" title="添加用于描述 bike_racks 要素类的代码。" src="GUID-A904F626-16E1-4A58-9BE9-6A100B7C83C8-web.png" loading="lazy"/></p><p id="GUID-EADC2A70-A5DF-46CD-90F5-3BB1AE941C89">当您按 <span class="shortcut">Enter</span> 键时,代码将立即运行。 代码不会打印任何信息,但是会创建一个名为 <span class="usertext">desc</span> 的变量,并将其设置为等于对 bike_racks 要素类运行 <span class="uicontrol">Describe</span> 函数的结果。</p><p id="GUID-B9255C01-50D9-4713-9E1B-3ACFDE2401DD"><span class="uicontrol">Describe</span> 函数会返回一个包含数据集属性的字典。 您可以使用此字典访问空间参考及其他属性。</p></div></li><li purpose="step" id="ESRI_STEP_02F9DB0371204339ABB5A42A3DFABB79"><span purpose="cmd">在提示符部分中,添加以下代码并按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-BBE6EA0F-85B5-4421-A682-D6234E8F1185"><span class="usertext">sr = desc["spatialReference"]</span></p><p id="GUID-3F17F706-86A0-45E9-A3BA-C8FBB1F8A1A2">此操作将名为 <span class="usertext">sr</span> 的新变量设置为数据集属性字典的 <span class="usertext">SpatialReference</span> 键中存储的值。 <span class="usertext">SpatialReference</span> 对象包含数据集坐标系的所有相关信息。 您可通过它检查特定属性。</p></div></li><li purpose="step" id="ESRI_STEP_80AF59BB8CD14FEA8A2F33C11860A301"><span purpose="cmd">在提示符部分中,添加以下代码并按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-B09DC5AB-A307-4D2E-95D4-436D3B2F39E8"><span class="usertext">print(sr.name)</span></p><p id="GUID-2A164738-15D9-4E90-B7B2-84E915044AB1">此操作会打印空间参考对象的名称。</p><p id="GUID-DB8B5925-131F-4F45-A678-4E8F337264E4"><img purpose="img" placement="inline" alt="打印空间参考对象的名称。" title="打印空间参考对象的名称。" src="GUID-3AF57F23-F602-42E9-95FD-6498730AB03B-web.png" loading="lazy"/></p><p id="GUID-B9EFDF31-548D-4290-BDA6-A5D99AC138ED">这样依次检查每个要素类的坐标系有点麻烦,所以您将使用一个 list 函数创建一个列表,以便处理所有的要素类。</p></div></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-4" purpose="section1"><h2>创建要素类列表并描述要素类</h2><p id="GUID-82B2E134-5407-413B-8C73-75EA0D6BAB4E">您可以加速检查要素类坐标系的过程,方法是创建一个要素类列表,然后在 <span class="ph">Python</span> 中使用循环结构处理列表并描述每个要素类。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_87930252EDD644D7B73AF8BE1C3E9F23"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_32CA19E426614364A28F574D639382BF"><span purpose="cmd">在提示符部分中,添加以下代码并按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-B4438D23-4E77-4DAE-BB32-D74C10A6ED50"><span class="usertext">fcs = arcpy.ListFeatureClasses()</span></p><p id="GUID-51C957E0-704E-4806-9339-475979652EC8">此操作将创建一个名为 <span class="usertext">fcs</span> 的变量,并将其设置为等于对当前工作空间运行 <span class="usertext">ListFeatureClasses</span> 函数的结果。 您尚未以显式方式设置工作空间,但是 <span class="uicontrol">Transportation.gdb</span> 是此工程的默认工作空间。 此函数会返回 <span class="uicontrol">Transportation.gdb</span> 中要素类的列表。</p></div></li><li purpose="step" id="ESRI_STEP_2F6E1D61C99E4D04AA6D4E9ECEAAA933"><span purpose="cmd">在提示符部分中,添加以下代码并按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-D691F231-305C-4D97-A8FD-62A3A5B38954"><span class="usertext">print(fcs)</span></p><p id="GUID-A2458BEE-0227-4EDA-ABF6-908B01196580">结果是要素类名称的 <span class="ph">Python</span> 列表。 列表使用方括号括起来,而要素类名称为 <span class="ph">Python</span> 字符串,使用逗号分隔。</p><p id="GUID-D3F76E6F-0A0E-4484-8023-6249F1DCFC49"><span class="usertext">['bus_lines', 'boundary', 'street_lights', 'roads', 'traffic_analysis_zones', 'bike_routes', 'bike_racks', 'parking_zones', 'intersections', 'station_entrances']</span></p><p id="GUID-D44BF8DF-D931-4B6A-887D-ED7577173153">接下来,您将使用 <span class="usertext">for</span> 循环处理列表中的每个项目。</p></div></li><li purpose="step" id="ESRI_STEP_2EEE90147BCC49CFBE79876A1EDC9B40"><span purpose="cmd">在提示符部分中,添加以下代码:</span><div class="info" purpose="info"><p id="GUID-FECEAC97-E648-494E-8685-2D9A39DA09CE"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockdesc" purpose="codeblockdesc"/><div class="codeblockbody"><pre><code class="other no-highlight">for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] print(f"{fc}: {sr.name}")</code></pre></div></section></p><p id="GUID-B939C967-E9D5-4564-AC96-11C7BF7A90A9"><img purpose="img" placement="inline" alt="用于处理要素类列表的 for 循环" title="用于处理要素类列表的 for 循环" src="GUID-A338E22E-85DA-49F2-BBFA-F631048F80D8-web.png" loading="lazy"/></p><p id="GUID-017B7E90-36C8-4F06-95F1-A587D61A50F9">第一行用于定义一个 <span class="usertext">for</span> 循环。 此代码用于创建一个名为 <span class="usertext">fc</span> 的临时变量,代码会为此变量分配 <span class="usertext">fcs</span> 列表中每个要素类的名称。 此代码行以冒号结尾,表示后续内容是要对列表中每个项目运行的代码块。 接下来的三行缩进了四个空格,表示它们属于该代码块。 代码块中的第一行用于创建一个名为 <span class="usertext">desc</span> 的变量,并将其设置为等于对存储在 <span class="usertext">fc</span> 变量中的当前要素类值运行 <span class="usertext">Describe</span> 函数的结果。 第二行用于创建 <span class="usertext">sr</span> 变量,并将其设置为 <span class="usertext">desc</span> 中存储的 <span class="usertext">spatialReference</span> 对象。 第三行将打印一个格式化字符串,其中包含要素类名称、一个冒号和空间参考名称。</p><p id="GUID-663D9AEF-45DA-4D8E-9DE2-C6BCFDDFA9EE">此代码块中的代码用于重复您之前为获取 bike_racks 要素类的空间参考名称所执行的操作过程,但此代码块针对一个变量执行,该变量被设置为列表中的每个项目,因此代码块会处理并报告所有要素类的结果。</p></div></li><li purpose="step" id="ESRI_STEP_7BD1C8A66D4B4052826ABBC34D8FBA34"><span purpose="cmd">按两次 <span class="shortcut">Enter</span> 键以运行 <span class="usertext">for</span> 循环及其代码块。</span><div class="info" purpose="info"><p id="GUID-390BACBF-1505-4E0D-982B-9C7DC6C5D5F1"><img purpose="img" placement="inline" alt="报告列表中每个要素类的空间参考。" title="报告列表中每个要素类的空间参考。" src="GUID-187AB961-5670-49A5-AFE7-82CAA6597BC5-web.png" loading="lazy"/></p><p id="GUID-882D2DD9-9C5B-4674-9F92-0CFCE0350710">这些要素类中有一半在一个坐标系中,另一半在另一个坐标系中。</p><p id="GUID-B2EF40FA-AF74-44FA-A6A7-9FA28F407647">下一步是编写代码以创建地理数据库并使用<span class="uicontrol">投影</span>和<span class="uicontrol">复制要素</span>工具将要素类加入具有通用投影坐标系的同一数据集中。 您将导出到目前为止所做的工作并将其用作脚本的基础。</p></div></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-5" purpose="section1"><h2>创建脚本</h2><p id="GUID-55BE7E93-F879-4E7D-9377-1C6542F9ACF7">接下来,您将继续编写代码以将此过程自动化为脚本。 您可以在 <span class="uicontrol">Python</span> 窗口中测试代码,但是对于较长的脚本,通常在 <span class="ph">Python</span> 编辑器中编写效果更好。 您将导出到目前为止完成的代码,并在默认的 <span class="ph">Python</span> 编辑器 IDLE 中继续处理代码。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_08068BF0A4814946848892D1F8687E59"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_312873DBD9194785BD6978E737776742"><span purpose="cmd">右键单击 <span class="uicontrol">Python</span> 窗口脚本部分中的代码,然后单击<span class="uicontrol">保存脚本</span>。</span><div class="info" purpose="info"><p id="GUID-B06560F3-5D97-4D08-9979-72837AB7B8B4"><img purpose="img" placement="inline" alt="右键单击 Python 窗口并保存脚本。" title="右键单击 Python 窗口并保存脚本。" src="GUID-0769373F-8A5B-4088-9575-C6EAA487EB88-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_CA2F008D3B1E45DBA74BF8A9BD2BBF7C"><span purpose="cmd">在<span class="uicontrol">保存脚本</span>窗口中,浏览至您曾用于提取数据的 <span class="uicontrol">PythonWorkflow</span> 文件夹,将脚本命名为 <span class="usertext">workflow_project.py</span>,然后单击<span class="uicontrol">保存</span>。</span><div class="info" purpose="info"><p id="GUID-BE3EA70C-0F8C-4602-A846-56F21E4E4548">此操作会将脚本另存为可以在 <span class="ph">Python</span> 编辑器中打开的 <span class="ph">Python</span> 脚本文件。</p></div></li><li purpose="step" id="ESRI_STEP_75DE08AE343A45A9B0F46705E10DFDAF"><span purpose="cmd">启动 <span class="ph">Microsoft File Explorer</span>,然后转至 <span class="uicontrol">PythonWorkflow</span> 文件夹。</span></li><li purpose="step" id="ESRI_STEP_5FC2C3F5290B46709D1C80CBD74953DA"><span purpose="cmd">右键单击 <span class="usertext">workflow_project.py</span>,然后单击<span class="uicontrol">使用 IDLE 编辑 (ArcGIS Pro)</span>。</span><div class="info" purpose="info"><p id="GUID-68330646-852F-4C12-9A3F-C3A7D5519F2A"><img purpose="img" placement="inline" alt="右键单击 workflow_project.py 脚本,然后单击“使用 IDLE 编辑 (ArcGIS Pro)”。" title="右键单击 workflow_project.py 脚本,然后单击“使用 IDLE 编辑 (ArcGIS Pro)”。" src="GUID-61CE4698-5012-469E-8800-E4EC4EC5B47E-web.png" loading="lazy"/></p><p id="GUID-EE8ED665-2D08-4607-B3B9-2446A48D3313"/><div class="panel trailer-1 note" id="GUID-5B7C340A-D448-4EEC-94E3-455B340C597B"><h5 class="icon-ui-comment trailer-0">注:</h5>如果您已安装 <span class="ph">ArcGIS Desktop</span> 10.x (<span class="ph">ArcMap</span>),则快捷菜单中还将包含快捷选项<span class="uicontrol">使用 IDLE 编辑</span>。 请勿使用此快捷选项,因为此选项不会打开正确版本的 <span class="ph">Python</span>。</div><p id="GUID-59A1AA4B-7E6E-4421-B28D-78E8F7BE8D57"/><div class="panel trailer-1 note" id="GUID-64E4CED1-F302-474D-BC12-0BDD6794BB72"><h5 class="icon-ui-comment trailer-0">注:</h5>如果<span class="uicontrol">使用 IDLE 编辑(ArcGIS Pro)</span>在快捷菜单中不可见,单击<span class="uicontrol">开始</span>,展开 <span class="uicontrol">ArcGIS</span>,然后单击 <span class="uicontrol">Python 命令提示符</span>。 在 <span class="uicontrol">Python 命令提示符</span>窗口中,输入 <span class="usertext">idle</span> 并按 <span class="shortcut">Enter</span> 键。 IDLE (Python 3.9 Shell) 窗口随即显示。 单击<span class="uicontrol">文件</span>,然后单击<span class="uicontrol">打开</span>。 浏览至 <span class="usertext">workflow_project.py</span> 文件并将其打开。</div><p id="GUID-B6C099F0-E4E4-400E-A4A5-8B6092C6433C">脚本将在 <span class="ph">Python</span> 默认编辑器 IDLE 中打开。 该脚本包括 <span class="uicontrol">Python</span> 窗口脚本部分中的所有代码,包括所有已打印的消息,这些消息显示为行首带有井号字符的注释。</p><p id="GUID-8A1631F3-DD58-4CE7-BCFF-596C86AEF11D"><img purpose="img" placement="inline" alt="脚本将在 IDLE Python 编辑器中打开。" title="脚本将在 IDLE Python 编辑器中打开。" src="GUID-AB104184-708A-4C1B-99D2-2AA915B2103F-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_4340808FB527498B942B2231F14A1D1A"><span purpose="cmd">在 IDLE 编辑器窗口中,移除 <span class="usertext">fcs = arcpy.ListFeatureClasses()</span> 行之前的所有代码。</span> <li purpose="step" id="ESRI_STEP_BBE12D5FD0F243999C32134226A1607D"><span purpose="cmd">移除所有注释行。</span></li><li purpose="step" id="ESRI_STEP_84EE85BA766E4A1189FF36CC26981B36"><span purpose="cmd">移除 <span class="usertext">print(fcs)</span> 行。</span><div class="info" purpose="info"><p id="GUID-D3CBF01E-9112-49E7-BA44-7CD516490915">以下是剩余的代码:</p><p id="GUID-7BFD8AF8-FF0E-407A-8DA5-B074A0E98279"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">fcs = arcpy.ListFeatureClasses() for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] print(f"{fc}: {sr.name}")</code></pre></div></section></p><p id="GUID-A64065F6-05D7-4684-9DBD-D38A226E7878">接下来,您将添加用于导入两个库的代码行、设置一些变量以及设置工作空间。</p></div></li><li purpose="step" id="ESRI_STEP_6BE2FF613B61466DB7B7E7A180AC0D02"><span purpose="cmd">在 <span class="usertext">fcs = arcpy.ListFeatureClasses()</span> 行之前添加一个新行,并在脚本的开头添加以下行。</span><div class="info" purpose="info"><p id="GUID-A0F6C480-D993-4D5D-A06B-1F3FABCDB70C"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os</code></pre></div></section></p><p id="GUID-71CA93BE-FB8F-4F1F-8AB5-342E91082B06">第一行代码用于导入 <span class="ph">ArcPy</span> 包以确保在 <span class="ph">ArcGIS Pro</span> 外部运行脚本时可以使用 <span class="ph">ArcPy</span> 的功能。 第二行用于导入 os 模块,用于处理文件路径。</p></div></li><li purpose="step" id="ESRI_STEP_B1D33E2FCEEB4773B1E4933319E97139"><span purpose="cmd">在前两行代码后添加一个新行,并添加以下代码行:</span><div class="info" purpose="info"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockdesc" purpose="codeblockdesc"/><div class="codeblockbody"><pre><code class="other no-highlight">mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" arcpy.env.workspace = os.path.join(mypath, gdb)</code></pre></div></section><p id="GUID-7BBB4B1F-38B6-4EF1-9DB5-B8FFDA625B46">第一行用于指定数据的位置。 如果您已将 <span class="uicontrol">PythonWorkflow</span> 文件夹提取至其他位置,则必须将此行编辑为您计算机上的相应路径。 此值会赋给一个名为 <span class="usertext">mypath</span> 的变量。 此变量将用于设置工作空间和执行其他任务,例如创建文件地理数据库。</p><p id="GUID-2E5F0008-97D1-49FB-B032-73B84E8A2E9A">路径中使用单个正斜线 (/) 而非单个反斜线 (\)。 <span class="ph">Python</span> 中的单个反斜杠用作转义字符,可能会产生意想不到的后果。 如果不使用单个正斜线,您也可以在字符串前面使用表示原始 (raw) 的字母 r(例如 <span class="usertext">r"C:\Lessons\PythonWorkflow"</span>),或使用双反斜线(例如 <span class="usertext">"C:\\Lessons\\PythonWorkflow"</span>)。 所有三种注记均被视为正确注记,可以互换使用。</p><p id="GUID-3CEE6543-8ABC-4051-B89D-1EDCDD0F3032">下一行将变量 <span class="usertext">gdb</span> 设置为等于存储感兴趣要素类的地理数据库的名称。</p><p id="GUID-5E2A0CEE-69E4-40B1-AF13-3F5EAC55C599">最后一行通过将数据所在的文件夹 (<span class="usertext">mypath</span>) 与地理数据库的名称 (<span class="usertext">gdb</span>) 组合来设置工作空间。 <span class="usertext">os.path.join()</span> 函数用于将这两个字符串组合为工作空间路径的新字符串。 建议您使用 <span class="usertext">os.path.join()</span> 执行此操作,因为它可以创建可靠的路径字符串,而不使用单个反斜线 (\)。 这些反斜线会被 <span class="ph">Python</span> 读取为转移字符,进而导致错误。</p><p id="GUID-A9731CF5-91C3-4E19-8BD8-631CFF753F19">以下是到目前为止的完整脚本:</p><p id="GUID-49F0981D-F8B6-4C15-9C31-0BD9A514677A"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockdesc" purpose="codeblockdesc"/><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" arcpy.env.workspace = os.path.join(mypath, gdb) fcs = arcpy.ListFeatureClasses() for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] print(f"{fc}: {sr.name}")</code></pre></div></section></p><p id="GUID-1D4CA477-8E04-46FB-9988-9DA4BFB05ADF"><img purpose="img" placement="inline" alt="第一个测试点的脚本" title="第一个测试点的脚本" src="GUID-73325D90-9CF2-4D8C-BBA1-D43E9C3A0B0A-web.png" loading="lazy"/></p><p id="GUID-A550799D-A2ED-4CBD-A344-D93CEF5B0CD7">现在,即可测试您的脚本以确认其可以运行。</p></div></li><li purpose="step" id="ESRI_STEP_DC140552EA8140B7B1A32C7DA9BF7500"><span purpose="cmd">单击<span class="uicontrol">文件</span>,然后单击<span class="uicontrol">保存</span>。</span><div class="info" purpose="info"><p id="GUID-F4900200-BAC7-40D0-8D8F-EE9940F08812">此操作将保存您对脚本做出的更改。 您也可以在 IDLE 中使用键盘快捷键 <span class="shortcut">Ctrl+S</span> 保存您的工作成果。</p></div></li><li purpose="step" id="ESRI_STEP_0551B6A8D2AD42979149DA26C9A6B742"><span purpose="cmd">单击<span class="uicontrol">运行</span>,然后单击<span class="uicontrol">运行模块</span>。</span><div class="info" purpose="info"><p id="GUID-DD26481B-B533-446B-94A2-6DC627B134FD"><img purpose="img" placement="inline" alt="用于运行脚本代码的“运行模块”" title="用于运行脚本代码的“运行模块”" src="GUID-0EA401D3-EE54-4744-AB22-0A3B5E38EF30-web.png" loading="lazy"/></p><p id="GUID-AB4BB6A8-B086-470B-95B3-B30FE29F452E">此操作会运行脚本。 您也可以使用键盘快捷键 <span class="shortcut">F5</span> 运行脚本。</p><p id="GUID-882AB11B-A00E-42D4-B8DE-B5E3A0B2DD7F">IDLE Shell 窗口随即显示,<span class="ph">ArcPy</span> 模块导入时会暂停片刻,之后将打印要素类名称和空间参考。</p><p id="GUID-7EF5FBC7-159A-42D3-B4F3-B5BCEF2CB090"><img purpose="img" placement="inline" alt="首次测试的结果,打印的要素类名称和空间参考" title="首次测试的结果,打印的要素类名称和空间参考" src="GUID-D861F22F-BAB3-4B95-BB6E-80A1CC432675-web.png" loading="lazy"/></p><p id="GUID-D6010D76-9ADC-4FAF-B3C8-A6756351DCB2">要完成脚本以自动执行此工作流,您需要添加以下功能:1) 创建一个地理数据库;2) 创建一个要素数据集;3) 复制已经投影的要素类;4) 投影地理坐标系中的要素类。 您将编写每个元素的代码,测试代码,然后继续处理下一个元素。</p></div></li></ol></div></section></section> <section class="section1 padded-anchor" id="subsection-6" purpose="section1"><h2>使用代码创建地理数据库</h2><p id="GUID-18F1D5F5-4942-49D6-A611-AC15472C23FB">下一步是将代码添加到脚本以创建地理数据库。 由于您可能需要多次测试脚本,所以需要能够覆盖之前创建的数据。 您将为脚本添加环境设置以支持此需求。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_3BB778A68BFC4AE0A8B6B464E3F6E386"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_BE704150C57D4FC7AB7FADA0965C5962"><span purpose="cmd">在以 <span class="usertext">arcpy.env.workspace</span> 为开头的行后,添加一个新行并添加以下代码:</span><div class="info" purpose="info"><p id="GUID-F6DBECBD-78BB-4AD6-899B-7FE3735B75A7"><span class="usertext">arcpy.env.overwriteOutput = True</span></p><p id="GUID-DBDE9B24-6954-4C18-9880-C7221F2A2DFB">接下来,您将创建变量以存储新地理数据库和新要素数据集的名称。</p></div></li><li purpose="step" id="ESRI_STEP_DBD3EF9A37F44C5BAE4FC5604CB15223"><span purpose="cmd">在 <span class="usertext">gdb = "Transportation.gdb"</span> 行后,添加一行并添加以下代码:</span><div class="info" purpose="info"><p id="GUID-6B222554-A519-434F-BF30-DA686FBDDF5A"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">new_gdb = "Metro_Transport.gdb" fds = "Metro_Network"</code></pre></div></section></p><p id="GUID-ABAD6887-984B-4244-9250-A6D6A665295F">使用变量后,您不再需要在脚本的其余部分重复名称。 这可以增强代码的可重用性。 如果您想为地理数据库或数据集使用其他名称,仅需在脚本中的一个位置更改名称。</p><p id="GUID-CF7795E1-C85F-436B-9CFD-0EEBFD6BBB39">接下来,添加代码以创建地理数据库。</p></div></li><li purpose="step" id="ESRI_STEP_11D0391BD6824D168209FDBD24554F86"><span purpose="cmd">在以 <span class="usertext">arcpy.env.overwriteOutput</span> 为开头的行后,添加以下代码:</span><div class="info" purpose="info"><p id="GUID-9A3AAC78-721B-4D73-A62D-CB9635E2EB9D"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)</code></pre></div></section></p><p id="GUID-3E069ABD-54A6-4998-9D6F-71B53CAC5237">此代码行会调用“创建文件地理数据库”工具。 在括号中,您指定了第一个必填参数(新地理数据库的位置)设置为变量 <span class="usertext">mypath</span>,其中包含您设置的路径值。 在逗号之后,您提供了工具的另一个必填参数,文件地理数据库的名称。 变量 <span class="usertext">new_gdb</span> 包含新地理数据库的名称。</p><p id="GUID-1606EE50-BFEC-4FB9-8D43-AA9DA3EB5E1E">该代码行还会将创建地理数据库的结果赋值给一个变量。 变量 <span class="usertext">new_gdb_path</span> 包含路径及新创建的地理数据库的名称。 这样更便于在脚本中引用这一新地理数据库。</p><p id="GUID-27DA04BB-C097-4F88-A46A-8B9A2FE02CAE">测试脚本之前,您将注释掉一些不需要测试的代码。</p></div></li><li purpose="step" id="ESRI_STEP_C800D0DEDFC44CCCB1C5C191244E2278"><span purpose="cmd">选择 <span class="usertext">new_gdb_path</span> 行之后的所有代码行。</span><div class="info" purpose="info"><p id="GUID-3B1A6785-CF9C-4D9A-AE73-D320F9BB73F0"><img purpose="img" placement="inline" alt="选择不需要测试的行。" title="选择不需要测试的行。" src="GUID-30DD88A0-7465-4273-8790-A632CE3796AC-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_58C73363B8F9450FA3BBEE73A4190076"><span purpose="cmd">单击<span class="uicontrol">格式</span>,然后单击<span class="uicontrol">注释掉区域</span>。</span><div class="info" purpose="info"><p id="GUID-2BDB8026-70D6-44DC-8B0C-0EB162579AE4"><img purpose="img" placement="inline" alt="注释掉代码行。" title="注释掉代码行。" src="GUID-5B461B80-DB2F-438C-85F5-E639238255D8-web.png" loading="lazy"/></p><p id="GUID-64B78587-CC66-42CB-9C56-0DB02B4E3604">此操作会将两个井号字符添加到每个所选代码行的开头。 <span class="ph">Python</span> 会将以井号开头的行解释为注释,因此它们不会运行。 您可以删除这些行,但是其中的一些代码需要再次使用。 通过注释掉这些代码行,您可以将代码保留在脚本中供后续使用,但当前不运行代码。</p><p id="GUID-F80B8CC3-0323-4604-BD1F-B9CF95F3CDC4"><img purpose="img" placement="inline" alt="已注释掉一些代码行。" title="已注释掉一些代码行。" src="GUID-BB422649-44BC-4844-BCF0-56650999DD3D-web.png" loading="lazy"/></p><p id="GUID-2001EA68-5072-42B6-B50F-3E3CEB9B37D3">以下为到目前为止的代码:</p><p id="GUID-263A2AC6-B670-4676-85CE-FD6710B06469"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" new_gdb = "Metro_Transport.gdb" fds = "Metro_Network" arcpy.env.workspace = os.path.join(mypath, gdb) arcpy.env.overwriteOutput = True new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb) ##fcs = arcpy.ListFeatureClasses() ##for fc in fcs: ## desc = arcpy.da.Describe(fc) ## sr = desc["spatialReference"] ## print(f"{fc}: {sr.name}")</code></pre></div></section></p></div></li><li purpose="step" id="ESRI_STEP_67357E43BA8943D5A4F71F2EA4C25039"><span purpose="cmd">保存并运行脚本。</span><div class="info" purpose="info"><p id="GUID-599228E6-2EBF-45CC-9128-82854579A72E">IDLE Shell 窗口重新启动,片刻之后,返回输入提示符 <span class="usertext">>>></span>。 该代码目前没有任何可将信息打印到 shell 的生效行,因此难以判断该代码是否有效。 您将在 <span class="ph">ArcGIS Pro</span> 中进行检查。</p></div></li><li purpose="step" id="ESRI_STEP_6287D03500644F4B9FDF900134A59E62"><span purpose="cmd">在 <span class="ph">ArcGIS Pro</span> 的<span class="uicontrol">目录</span>窗格的<span class="uicontrol">文件夹</span>部分中,右键单击 <span class="uicontrol">PythonWorkflow</span> 文件夹,然后单击<span class="uicontrol">刷新</span>。</span><div class="info" purpose="info"><p id="GUID-712A1FC2-ACE1-45F3-9EED-862B9036C1E0"><img purpose="img" placement="inline" alt="刷新“目录”窗格中的 PythonWorkflow 文件夹。" title="刷新“目录”窗格中的 PythonWorkflow 文件夹。" src="GUID-77744BAB-EBA3-41BF-B71D-0D705E053F58-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_FC7AF906D20A47568FFEE0DFB7038574"><span purpose="cmd">展开 <span class="uicontrol">PythonWorkflow</span> 文件夹。</span><div class="info" purpose="info"><p id="GUID-109B6C68-A68A-45C1-87CC-76ABF3D1F149"><img purpose="img" placement="inline" alt="新地理数据库位于文件夹中。" title="新地理数据库位于文件夹中。" src="GUID-000C7762-F188-4414-A47B-572C09687F6F-web.png" loading="lazy"/></p><p id="GUID-8D6DE5BD-266D-4A01-A2BA-0FB5A80A4487">新地理数据库位于文件夹中。 当前仪表盘为空。</p></div></li><li purpose="step" id="ESRI_STEP_93352FC3C02F4B17A0AE0CFFA406E3D2"><span purpose="cmd">右键单击 <span class="uicontrol">Metro_Transport.gdb</span>,单击<span class="uicontrol">删除</span>,然后单击<span class="uicontrol">是</span>以永久删除该地理数据库。</span><div class="info" purpose="info"><p id="GUID-2B5D4595-E24D-49D0-85C3-6AAA13B30DAA">在测试脚本时,删除输出通常十分有用,这样做可以轻松地看到脚本是否有效。</p><p id="GUID-1F1C49ED-0831-4C0A-AD5F-2506B3625610">可以使用另一种指示方式表明脚本有效,即添加消息以声明执行了什么操作。 您可以向代码添加 <span class="usertext">print</span> 语句,以帮助您追踪正在执行的操作。</p></div></li><li purpose="step" id="ESRI_STEP_37EB75D0378245219BDFD96ADCA11A1B"><span purpose="cmd">在 IDLE 编辑器窗口中以 <span class="usertext">new_gdb_path = arcpy.CreateFileGDB</span> 为开头的行后,添加一个新行并添加以下代码:</span><div class="info" purpose="info"><p id="GUID-6465CFDC-E85E-499A-AC9E-1F27C17699D1"><span class="usertext">print(f"The geodatabase {new_gdb} has been created.")</span></p><p id="GUID-F89E5C79-DF30-45D1-B4B4-323BEAAEAED7"><img purpose="img" placement="inline" alt="添加一个用于打印格式化字符串的代码行以表示已创建地理数据库。" title="添加一个用于打印格式化字符串的代码行以表示已创建地理数据库。" src="GUID-83736B92-7D43-458F-8F58-93715CE95121-web.png" loading="lazy"/></p><p id="GUID-F8231ECB-EA51-490B-BEF9-6C282BA39494">此打印语句会打印一个包含 <span class="usertext">new_gdb</span> 变量值的格式化字符串。 打印语句不是脚本运行所必需的,但它们可以帮助您跟踪脚本正在执行的操作。 它们也十分有助于排除长脚本中的错误。 您可以在脚本的不同位置添加多个指示状态的打印语句,当您看到各消息时,便可得知脚本已经执行到该位置。 您也可以使用格式化字符串打印脚本中的变量值;此方法十分有助于排除错误。</p></div></li><li purpose="step" id="ESRI_STEP_DEF0B48B1C8F4A52B5E04CD1959D6209"><span purpose="cmd">保存脚本。</span></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-7" purpose="section1"><h2>使用代码创建要素数据集</h2><p id="GUID-6A0FA51E-38BD-4C68-997C-CCC4BA5F7103">接下来,您将在新地理数据库中创建要素数据集。 要素数据集的一个最典型的属性是要素数据集中的所有要素类共享相同的坐标系。</p><p id="GUID-242B4B3F-70D9-4760-9B3D-A49A64D6F40F">您将为此数据集使用 State Plane Maryland 坐标系。 虽然在 <span class="ph">Python</span> 中设置坐标系时可以使用坐标系名称,但是使用被称为 WKID 或熟知标识符的短代码更加简单。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_6A19D66EE1334E93B1EC9C9C96C96E2D"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_E5A0231FA86C408CAC7B6D9F5D1E96BB"><span purpose="cmd">在 <span class="ph">ArcGIS Pro</span> 中的<span class="uicontrol">内容</span>窗格中,右键单击 <span class="uicontrol">roads</span> 图层,然后单击<span class="uicontrol">属性</span>。</span></li><li purpose="step" id="ESRI_STEP_FCF10D329CA54B0189B48BABEB28CE31"><span purpose="cmd">在<span class="uicontrol">图层属性</span>窗格中,单击<span class="uicontrol">源</span>选项卡。</span><div class="info" purpose="info"><p id="GUID-D68E6D38-ACEC-4088-B3CE-922C4E0E45A2"><img purpose="img" placement="inline" alt="单击“图层属性”窗格的“源”选项卡。" title="单击“图层属性”窗格的“源”选项卡。" src="GUID-697437DF-86B6-466B-A864-C01DF225068E-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_37865DD1C3C64159ABFD85FC2F8C5276"><span purpose="cmd">单击<span class="uicontrol">数据源</span>以折叠<span class="uicontrol">数据源</span>部分。</span><div class="info" purpose="info"><p id="GUID-A2EA3DE8-054F-4A58-9CF1-B28FAEC0F504"><img purpose="img" placement="inline" alt="折叠“数据源”部分。" title="折叠“数据源”部分。" src="GUID-C1B8A459-530F-40D8-BBB7-286CF3637378-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_488C05931A6741A1A13FAD30B12E06E7"><span purpose="cmd">单击<span class="uicontrol">空间参考</span>将其展开。</span><div class="info" purpose="info"><p id="GUID-77683F19-6946-416A-8BDE-20929D987FF1"><img purpose="img" placement="inline" alt="单击“空间参考”以展开“空间参考”部分。" title="单击“空间参考”以展开“空间参考”部分。" src="GUID-A3E6F24A-52FE-4827-9EC8-196A2AA6E912-web.png" loading="lazy"/></p><p id="GUID-CD10042D-08AE-446D-BD2F-696AFE2BFEBA">此坐标系的 WKID 代码为 2248。</p><p id="GUID-1ECC251E-8E4E-4DDB-A5BF-67EE0D12745B"><img purpose="img" placement="inline" alt="WKID 代码为 2248。" title="WKID 代码为 2248。" src="GUID-CFBDA64A-A322-4016-8BAF-22C541FA60D3-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_D2C55CB031024881887B4FABE8D1CC2D"><span purpose="cmd">单击<span class="uicontrol">取消</span>以关闭<span class="uicontrol">图层属性</span>窗格。</span><div class="info" purpose="info"><p id="GUID-02A80920-1F32-4B93-9FBC-06CEC4CC1DD4">现在,您将使用此 WKID 代码设置要素数据集的空间参考。</p></div></li><li purpose="step" id="ESRI_STEP_7E75B4843C2E45789A4CED0505D8FEF1"><span purpose="cmd">在 IDLE 中以 <span class="usertext">print(f"The geodatabase</span> 为开头的行后,添加以下代码:</span><div class="info" purpose="info"><p id="GUID-1D3B3FED-B8F4-41CB-B523-450092BE0ACB"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248) print(f"The feature dataset {fds} has been created.")</code></pre></div></section></p><p id="GUID-F1FBD01C-2097-44E9-946A-A40F1370D27F"><img purpose="img" placement="inline" alt="用于创建要素数据集并打印数据集创建报告的代码行。" title="用于创建要素数据集并打印数据集创建报告的代码行。" src="GUID-09A15525-D764-491D-A1CC-6546FD830051-web.png" loading="lazy"/></p><p id="GUID-66EC44AC-4297-41A2-8FC4-6B7088D0B6C2">第一行用于运行<span class="uicontrol">创建要素数据集</span>工具,为其提供了三个必填参数。 第一个参数是要创建要素数据集的地理数据库位置,第二个是要素数据集的名称,第三个是数据集坐标系的 WKID。 <span class="usertext">new_gdb_path</span> 变量包含数据库的完整路径。 要素数据集的名称之前已赋给 <span class="usertext">fds</span> 变量。</p><p id="GUID-2F574AB2-9B6C-46C8-B04D-05A91D8323A6">另一种设置坐标系的方法是提供现有要素类的路径,例如,提供 <span class="usertext">Transportation.gdb</span> 地理数据库中 roads 要素类的路径。</p><p id="GUID-16104F97-FBB0-430F-878A-39D6264A8410">第二行用于打印一个格式化字符串,用于表示新数据集已创建。</p><p id="GUID-A0F609EC-872B-4C20-88D8-5695C4168A26">以下为完整代码:</p><p id="GUID-931CF118-84EF-451E-AED6-05E04AAE8E9C"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" new_gdb = "Metro_Transport.gdb" fds = "Metro_Network" arcpy.env.workspace = os.path.join(mypath, gdb) arcpy.env.overwriteOutput = True new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb) print(f"The geodatabase {new_gdb} has been created.") arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248) print(f"The feature dataset {fds} has been created.") ##fcs = arcpy.ListFeatureClasses() ##for fc in fcs: ## desc = arcpy.da.Describe(fc) ## sr = desc["spatialReference"] ## print(f"{fc}: {sr.name}")</code></pre></div></section></p></div></li><li purpose="step" id="ESRI_STEP_E36EBC2F01674AADB666E1120891C155"><span purpose="cmd">保存并运行代码。</span><div class="info" purpose="info"><p id="GUID-14F0BB73-602A-4176-91C4-93238BB8FF78">代码随即运行,片刻之后,两个状态消息将打印至 IDLE shell。</p><p id="GUID-6D034C32-4F72-4407-8C67-6516ACF98C17"><img purpose="img" placement="inline" alt="代码运行并报告状态。" title="代码运行并报告状态。" src="GUID-219B8C6A-35BE-4839-B96B-0B72E173B841-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_BA90F82065D940D39358A13259511C82"><span purpose="cmd">在 <span class="ph">ArcGIS Pro</span> 的<span class="uicontrol">目录</span>窗格中,右键单击 <span class="uicontrol">PythonWorkflow</span> 文件夹,然后单击<span class="uicontrol">刷新</span>。</span><div class="info" purpose="info"><p id="GUID-8B82F8A7-101C-4AA6-AB6A-C32BB36C0463"><span class="uicontrol">Metro_Transport</span> 地理数据库已创建。</p></div></li><li purpose="step" id="ESRI_STEP_C8783799AB3B494F8B69070A6D113E52"><span purpose="cmd">展开 <span class="uicontrol">Metro_Transport</span> 地理数据库。</span><div class="info" purpose="info"><p id="GUID-0FD4ABCF-CB96-42BE-9F14-83CD238FFB76"><span class="uicontrol">Metro_Network</span> 数据集已创建。</p></div></li><li purpose="step" id="ESRI_STEP_51CB1FB3F0204BFD831861F5A8BAF972"><span purpose="cmd">删除 <span class="uicontrol">Metro_Transport</span> 地理数据库。</span></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-8" purpose="section1"><h2>使用代码根据条件复制要素类</h2><p id="GUID-462DD22C-CEAB-442B-AAAB-18445E12157D">接下来,您将使用之前注释掉的一部分代码列出 <span class="usertext">Transportation.gdb</span> 地理数据库中的要素类。 您将向其中添加逻辑以检查每个要素类的空间参考 WKID 是否为 2248,并编写代码以在该条件为真时将要素类复制到新的地理数据库。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_9C96C0BCEA2748CDBCA3F9D08B2B9F7F"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_48A8D49F44D24EE38A949A70EACD9A3C"><span purpose="cmd">在 IDLE 中,选择之前注释掉的代码行。</span></li><li purpose="step" id="ESRI_STEP_F02F4BFD455141B0B00FAAFB7EC47046"><span purpose="cmd">单击<span class="uicontrol">格式</span>,然后单击<span class="uicontrol">取消注释区域</span>。</span><div class="info" purpose="info"><p id="GUID-DF7563C7-9C35-44B3-8D6E-A88D391CFB86"><img purpose="img" placement="inline" alt="取消注释代码。" title="取消注释代码。" src="GUID-8CBB051D-E949-448C-9797-B6042FC59CDF-web.png" loading="lazy"/></p><p id="GUID-D61172C5-EE26-49FC-8889-957A548296EC">取消注释代码会删除每一行之前的井号,因此代码将运行而不是被解释为注释。</p><p id="GUID-C5C948BF-0FF3-45A9-ADED-1DFC5780C1C9">您取消注释的代码可创建当前工作空间中要素类的列表,然后使用列表中各个项目的描述提取空间参考。 现在,您将添加代码以检查空间参考值并选择复制或投影要素类,而不是打印该信息。</p><p id="GUID-FAD2C3D9-CDD3-49E6-BD93-D7C8706933D4"><span class="uicontrol">复制要素</span>工具和<span class="uicontrol">投影</span>工具都会使用一个输入要素类并生成一个输出要素类。 虽然要素类的名称可以保持相同,但输出的路径将有所不同,因为新的要素类将位于新的地理数据库中。</p><p id="GUID-041329D5-F3B2-4702-94FC-1BD1021DB93A">输入要素类通过变量 <span class="usertext">fc</span> 表示。 <span class="usertext">fc</span> 的值是从当前工作空间的要素类列表派生的要素类名称。</p><p id="GUID-DCF12E19-4EA6-467F-8E44-9D3B55B3B143">例如,其中一个输入要素类的完整路径为:<span class="usertext">C:\Lessons\PythonWorkflow\Transportation.gdb\roads</span>。</p><p id="GUID-969B0759-AF66-4FCD-9CE2-A2E4270714CD">因为已经设置了工作空间,所以在工具中可以直接使用要素类的名称(例如 <span class="usertext">roads</span>)。 当使用当前工作空间中的要素类时,不需要完整路径。 这就是 <span class="usertext">desc = arcpy.da.Describe(fc)</span> 或 <span class="usertext">desc = arcpy.da.Describe("roads")</span> 有效的原因。</p><p id="GUID-409F35C6-2324-437C-8940-3D3A42AAEBC0">但是,您必须为输出要素类参数提供新工作空间中的新要素类的完整路径。 与之前在脚本中设置环境时类似,可以使用 <span class="usertext">os.path.join()</span> 构建此路径。</p></div></li><li purpose="step" id="ESRI_STEP_7D5E9CBFCC1649238F61B8A96E519ACC"><span purpose="cmd">选择以 <span class="usertext">print(f"{fc}:</span> 为开头的代码行,然后使用以下代码行将其替换:</span><div class="info" purpose="info"><p id="GUID-161F9363-C39A-478B-AB8D-9B4F967443EE"><span class="usertext">new_fc = os.path.join(mypath, new_gdb, fds, fc)</span></p><p id="GUID-B9DB992D-58A7-4E6A-A796-7203E81C0F27">此代码应该具有相同的缩进级别,位于 <span class="usertext">for fc in fcs:</span> 循环代码块中。</p><p id="GUID-F06F01D3-CF02-457F-883F-C963825810F8">在此代码行中,新变量 <span class="usertext">new_fc</span> 被设置为等于将数据所在的文件夹 (<span class="usertext">mypath</span>)、新地理数据库 (<span class="usertext">new_gdb</span>) 和新要素数据集 (<span class="usertext">fds</span>) 连接到一起所创建的路径。 路径的最后一部分是新要素类的名称,该名称与输入要素类相同(变量 <span class="usertext">fc</span> 的值)。 路径的这一部分随着要素类列表循环的每一次迭代而改变。</p><p id="GUID-366CDE79-CB7A-4CAF-8537-E9B1BD60757C">创建输出要素类的完整路径后,您就可以添加代码以根据坐标系决定是复制还是投影各个要素类。 在 <span class="ph">Python</span> 中,您可以使用 <span class="usertext">if</span> 语句测试不同的条件,然后根据语句中的条件是否为真运行不同的代码块。</p></div></li><li purpose="step" id="ESRI_STEP_E5F5FAC237C14991AAF875E222356820"><span purpose="cmd">在 <span class="usertext">new_fc = os.path.join</span> 行之后的相同缩放级别处(<span class="usertext">for</span> 循环内部),添加以下代码行:</span><div class="info" purpose="info"><p id="GUID-14C1D53A-6F1D-42EC-A60A-0A6E9695CB83"><span class="usertext"> if sr.factoryCode == 2248:</span></p><p id="GUID-83131EEB-22B5-43F3-AA02-7E1CA9A3ED71">此代码用于检查要素类的 WKID(存储在 <span class="usertext">sr</span> 对象中作为其 <span class="usertext">factoryCode</span> 值)是否与 State Plane Maryland 坐标系的 WKID 2248 相匹配。</p><p id="GUID-13AB61FF-B2A7-4B31-A082-A388CBB2783B">此代码使用 <span class="usertext">if</span> 语句和一个表达式,并使用冒号结尾以指示后面跟随的是语句为真时将会运行的代码块。</p><p id="GUID-6C16178E-2232-460B-9542-305225C9AC77">该语句使用双等号。 在 <span class="ph">Python</span> 中,单个等号用于将变量设置为某个值,而双等号用于检查是否相等。</p></div></li><li purpose="step" id="ESRI_STEP_1A38EE92ED2E4EF1BA0CB3AAE410F803"><span purpose="cmd">单击该代码行的末尾,然后按 <span class="shortcut">Enter</span> 键。</span><div class="info" purpose="info"><p id="GUID-ECFEFC2F-AE61-4459-A558-D6EC08C7D8DE">此操作使下一行代码具有正确的缩进,即相对于 if 语句行缩进四个空格。 这是新代码块的开始,此代码块仅会在 <span class="usertext">sr.factoryCode</span> 等于值 <span class="usertext">2248</span> 时运行。</p><p id="GUID-61B32FDE-3123-4FAD-BA69-356102AF1DD0">创建输出要素类的完整路径并且满足对坐标系的测试后,您可以添加代码以复制要素类。</p></div></li><li purpose="step" id="ESRI_STEP_18DE7A3586CC47E7A1B5BA5847EE3D59"><span purpose="cmd">在新缩进的行处,添加以下代码行:</span><div class="info" purpose="info"><p id="GUID-18DDC919-D6E1-42F3-96E2-E7AD2891DB87"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">arcpy.CopyFeatures_management(fc, new_fc) print(f"The feature class {fc} has been copied.")</code></pre></div></section></p><p id="GUID-465F38EC-FC46-416F-A3DD-697BB7090584">第一行用于运行“复制要素”工具,将当前要素类复制到新的地理数据库。</p><p id="GUID-7888BF16-C06E-478F-92ED-26FC6F91F207">第二行用于打印一个格式化字符串,用于表示新数据集已创建。</p><p id="GUID-9F20933E-9F18-4E5D-9DAC-79BB6CB95B37">以下为完整代码:</p><p id="GUID-C856B82B-8F7F-45F4-9658-B272FD16B541"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" new_gdb = "Metro_Transport.gdb" fds = "Metro_Network" arcpy.env.workspace = os.path.join(mypath, gdb) arcpy.env.overwriteOutput = True new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb) print(f"The geodatabase {new_gdb} has been created.") arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248) print(f"The feature dataset {fds} has been created.") fcs = arcpy.ListFeatureClasses() for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] new_fc = os.path.join(mypath, new_gdb, fds, fc) if sr.factoryCode == 2248: arcpy.CopyFeatures_management(fc, new_fc) print(f"The feature class {fc} has been copied.")</code></pre></div></section></p><p id="GUID-4CFF57BD-3E75-47C6-AD00-CED680FED827"><img purpose="img" placement="inline" alt="用于在 WKID 为 2248 时在地理数据库之间复制要素类的逻辑已添加到脚本" title="用于在 WKID 为 2248 时在地理数据库之间复制要素类的逻辑已添加到脚本" src="GUID-75A0B6F2-1C9A-4604-87E4-336AB9DD6E95-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_E27142ADA73D44EFBAC6B21440314EF1"><span purpose="cmd">保存并运行代码。</span><div class="info" purpose="info"><p id="GUID-582C2681-916F-48EA-AAF6-8B67C15A447D"><img purpose="img" placement="inline" alt="已复制匹配的要素类。" title="已复制匹配的要素类。" src="GUID-BE519D4D-8AA2-4F69-B484-38CDCB0309F7-web.png" loading="lazy"/></p><p id="GUID-208515D8-EFCA-41EE-BE77-AC5FE85159E3">该代码随即运行。 代码会创建地理数据库和要素数据集,并会复制位于 State Plane Maryland 坐标系中的五个图层。</p></div></li><li purpose="step" id="ESRI_STEP_D447136891414361AEC81E2078377286"><span purpose="cmd">在 <span class="ph">ArcGIS Pro</span> 中的<span class="uicontrol">目录</span>窗格中,刷新 <span class="uicontrol">PythonWorkflow</span> 文件夹。</span></li><li purpose="step" id="ESRI_STEP_4C3D032CC5F44650B19EB80680B1B0C5"><span purpose="cmd">刷新 <span class="uicontrol">Metro_Transport</span> 地理数据库并将其展开。</span></li><li purpose="step" id="ESRI_STEP_0D94F2EB960E43C68286B78345833F5B"><span purpose="cmd">刷新 <span class="uicontrol">Metro_Network</span> 要素数据集并将其展开。</span><div class="info" purpose="info"><p id="GUID-BC81873B-8FDF-49F8-A958-4433E07135D7"><img purpose="img" placement="inline" alt="五个要素类已复制到新地理数据库。" title="五个要素类已复制到新地理数据库。" src="GUID-53221599-745D-427D-A0E1-B8E139A26E2F-web.png" loading="lazy"/></p><p id="GUID-4E7943E2-7B3C-4FBC-9156-31C66DEBEBDD">地理数据库和数据集包含与数据集坐标系匹配的要素类。</p></div></li><div class="stepinfo" purpose="stepinfo"/></ol></div></section></section><section class="section1 padded-anchor" id="subsection-9" purpose="section1"><h2>添加代码以根据条件投影要素类</h2><p id="GUID-11EAC44E-9A19-41EA-B3AF-D6CF79096008">完成脚本的最后一步是添加逻辑以使用“投影”工具投影不在 State Plane Maryland 坐标系中的要素类,并将结果写入新地理数据库中的要素数据集。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_84209BF40AA040CFB259799350BA227E"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_3D9E8D6462A9445CAF2F211F3914B845"><span purpose="cmd">在 IDLE 中以 <span class="usertext">print(f"The feature class</span> 为开头的代码行末尾单击,然后按 <span class="shortcut">Enter</span> 键。</span></li><li purpose="step" id="ESRI_STEP_AC519C2E7ACE401DB6C307756E0A6068"><span purpose="cmd">按 <span class="shortcut">Backspace</span> 键以减少一个级别的缩进。</span><div class="info" purpose="info"><p id="GUID-DA87899E-E9DD-41C0-B894-C405B88B8E52">您将添加一个 <span class="usertext">else</span> 语句,此语句必须与之前的 <span class="usertext">if</span> 语句位于同一缩进级别。</p><p id="GUID-526ADF4A-383E-4B69-8C16-375C48CAAFB3"><span class="usertext">else</span> 语句用于在 <span class="usertext">if</span> 语句为假时运行一个不同的代码块。</p></div></li><li purpose="step" id="ESRI_STEP_E5B3660100C7419E8AB556984707B4A5"><span purpose="cmd">在减少缩进的新行处,添加以下代码行:</span><div class="info" purpose="info"><p id="GUID-2681EEE3-14DA-4243-A897-9105E791AEAD"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">else: arcpy.Project_management(fc, new_fc, 2248) print(f"The feature class {fc} has been projected.")</code></pre></div></section></p><p id="GUID-2E7269C8-B1D6-40FD-8841-FC14787DE001"><img purpose="img" placement="inline" alt="if 语句和 else 语句位于同一缩进级别。" title="if 语句和 else 语句位于同一缩进级别。" src="GUID-C74075E9-30A8-4B48-A710-D6A488CD7C61-web.png" loading="lazy"/></p><p id="GUID-CE96E2D1-49DF-4097-8C59-C189B8DE98BA"><span class="usertext">else</span> 语句用于创建一个包含代码块的逻辑分支,检查 <span class="usertext">if</span> 语句后,如果结果不为真,则将运行该代码块。 该逻辑为:如果 WKID 是 2248,则复制要素类,否则,将投影要素类。</p><p id="GUID-52C56E46-7D34-4F05-9889-1CF007FAF6AA">这些代码行中的第二行缩进了四个空格,表示其属于在 <span class="usertext">else</span> 条件下运行的代码块。 <span class="uicontrol">投影</span>工具会将输入要素类投影到 State Plane Maryland 坐标系,并且输出要素类将存储在新地理数据库中。 <span class="uicontrol">投影</span>工具的参数为输入要素类、输出要素类和输出坐标系(此参数使用 WKID 2248)。</p><p id="GUID-833E0690-64AF-42C0-B69F-2DBAF8C1E582"/><div class="panel trailer-1 note" id="GUID-4D39BD47-0A77-492D-B043-E3924053956A"><h5 class="icon-ui-comment trailer-0">注:</h5><span class="uicontrol">投影</span>工具存在第四个参数,该参数为可选变换。 当您之前运行<span class="uicontrol">投影</span>工具时,您看到需要在 NAD 1983 地理坐标系和 WGS 1984 地理坐标系之间进行变换,但默认情况下,系统会在运行该工具时选择适当的变换。 这意味着无需在此处的代码中指定变换。</div><p id="GUID-3CE61B20-FBCE-4F59-A464-A0914C8621F6">基于之前得出的所有要素类坐标系的检查结果,您了解到当前不在 State Plane Maryland 坐标系中的要素类位于一个特定的地理坐标系中。 但是,无需指定此特定的坐标系。 通过使用 <span class="usertext">else</span> 语句,将对所有 <span class="usertext">if</span> 语句为假的要素类运行<span class="uicontrol">投影</span>工具,无论特定的坐标系是什么。</p><p id="GUID-AAB0592E-B4E5-4095-9994-0F0CA9E6FEC8">以下为完整代码:</p><p id="GUID-3DBD131B-9F78-476B-B6BB-73C6FD0CC991"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight">import arcpy import os mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" new_gdb = "Metro_Transport.gdb" fds = "Metro_Network" arcpy.env.workspace = os.path.join(mypath, gdb) arcpy.env.overwriteOutput = True new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb) print(f"The geodatabase {new_gdb} has been created.") arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248) print(f"The feature dataset {fds} has been created.") fcs = arcpy.ListFeatureClasses() for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] new_fc = os.path.join(mypath, new_gdb, fds, fc) if sr.factoryCode == 2248: arcpy.CopyFeatures_management(fc, new_fc) print(f"The feature class {fc} has been copied.") else: arcpy.Project_management(fc, new_fc, 2248) print(f"The feature class {fc} has been projected.")</code></pre></div></section></p><p id="GUID-7AEF6C3B-08E3-4404-8204-9868EA1F0537"><img purpose="img" placement="inline" alt="脚本的完整代码" title="脚本的完整代码" src="GUID-DDA3D8D7-6F02-4A09-B87F-B2E475F69B87-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_A84D48DCD7E14239923FDE8739918C45"><span purpose="cmd">保存并运行脚本。</span><div class="info" purpose="info"><p id="GUID-37F36023-2B0D-4622-A104-4F41D5686472">该代码随即运行。 代码会创建地理数据库和要素数据集,复制位于 State Plane Maryland 坐标系中的五个图层,并投影 WGS84 坐标系中的五个图层。</p><p id="GUID-3908AE52-C7E7-4386-B120-D8CA9BF78EA1"><img purpose="img" placement="inline" alt="最终的代码运行结果" title="最终的代码运行结果" src="GUID-2A3E5A07-0FAD-4CEF-9F2B-0B0652D196AC-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_05FA89AE983540C88EE46B2407CF95D9"><span purpose="cmd">在 <span class="ph">ArcGIS Pro</span> 的<span class="uicontrol">目录</span>窗格中,刷新 <span class="uicontrol">Metro_Network</span> 要素数据集。</span><div class="info" purpose="info"><p id="GUID-BEC3528F-6EC8-4875-90AF-BF4AAB31ABFF">数据集包含所有要素类,这些要素类均位于正确的坐标系。</p><p id="GUID-B51CF87D-46B8-487B-8F56-38DFE183955B"><img purpose="img" placement="inline" alt="包含所有要素类的最终地理数据库" title="包含所有要素类的最终地理数据库" src="GUID-5A721B9A-D8DD-4068-9954-C3541076B4D2-web.png" loading="lazy"/></p><p id="GUID-B814C00D-FD6A-4A2C-9CA3-21FCB57226D6">您的代码运行正常,此时,您将可以创建几何网络。</p></div></li></ol></div></section></section><section class="section1 padded-anchor" id="subsection-10" purpose="section1"><h2>为脚本添加注释</h2><p id="GUID-0D9F3E0C-7941-4153-8399-7F8E3F5894C7">这是一个相对简单的脚本,但建议您在代码中添加注释以使其更易于理解。 注释可用于解释脚本用途和标识关键步骤。 这样可以使其他用户更容易理解您的脚本,并根据其目的修改脚本。 如果您在长时间不使用脚本后需要继续修改脚本,注释有助于您理解代码。</p><p id="GUID-8FC98E17-56A5-4299-8866-D99944C06F3D">注释以一个或多个井号字符为开头。 可以将注释置于代码行的开头,也可以将其添加到代码行的末尾。</p><section class="wfsteps padded-anchor" purpose="wfsteps"><div class="steps" id="ESRI_STEPS_D327434699374808A7FCF626815D1B8C"><ol class="list-numbered" purpose="ol"><li purpose="step" id="ESRI_STEP_05BCDCEFBC9444F79312045AA7CC2EF4"><span purpose="cmd">在 IDLE 中,在脚本的开头添加一个新行。</span></li><li purpose="step" id="ESRI_STEP_0D550165A49D4A8CB75B509124899AFF"><span purpose="cmd">将以下注释复制并粘贴到新行中:</span><div class="info" purpose="info"><p id="GUID-EFC37EFE-C0D4-4A6C-BDD2-C7FA950A3595"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Author: your name # Date: the date # Purpose: This script reads all the feature classes in a # geodatabase and copies them to a new feature dataset in # a new geodatabase. Feature classes not already in the # target coordinate system are projected.</code></pre></div></section></p></div></li><li purpose="step" id="ESRI_STEP_F9B19CA5DAEE49008812AE91EF5066B7"><span purpose="cmd">编辑 <span class="usertext">Author</span> 和 <span class="usertext">Date</span> 行以添加您的姓名和当前日期。</span></li><li purpose="step" id="ESRI_STEP_4FEF1B41E90345F88CCDA4B3AA58CEB4"><span purpose="cmd">在 <span class="usertext">import arcpy</span> 行之前,添加两个新行,并在第二行添加以下注释:</span><div class="info" purpose="info"><p id="GUID-2897C455-4801-4D11-88C4-6A7F6473C1B3"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Imports</code></pre></div></section></p><p id="GUID-C615C0BA-6439-470D-B20B-36EA8DB96418">空白行不会影响代码,但可以使代码更加清晰。 注释标明此部分用于导入代码所需的库。 导入语句通常集中放置在脚本顶部附近。</p></div></li><li purpose="step" id="ESRI_STEP_4E506D9CDA36451581C1B46185BACD61"><span purpose="cmd">在 <span class="usertext">import os</span> 行之后添加两个新行并添加以下注释:</span><div class="info" purpose="info"><p id="GUID-1D89CB9B-7F87-42CE-B320-8EE777131987"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Variables for paths, outputs, workspaces</code></pre></div></section></p><p id="GUID-277103B7-1BC3-4802-B311-04BBC2217F4C">此注释标明首次设置这些变量的位置。</p></div></li><li purpose="step" id="ESRI_STEP_681494A3361146F5AC0D60ECFD5AF16F"><span purpose="cmd">在 <span class="usertext">arcpy.env.overwriteOutput = True</span> 行之后添加两个新行并添加以下注释:</span><div class="info" purpose="info"><p id="GUID-ED9444A2-01A1-4535-ACD9-85D394D0CF15"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Create a new geodatabase and dataset</code></pre></div></section></p></div></li><li purpose="step" id="ESRI_STEP_2553EDB14E35449BA323933A64FC6B9C"><span purpose="cmd">在 <span class="usertext">fcs = arcpy.ListFeatureClasses()</span> 行之前添加两个新行并添加以下注释:</span><div class="info" purpose="info"><p id="GUID-869C71E8-EC1E-4A02-BAAA-AD973BAB5949"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Create a list of feature classes in the workspace</code></pre></div></section></p><p id="GUID-14303863-2DFC-4DC3-94B0-256DFC8E077B"/></div></li><li purpose="step" id="ESRI_STEP_8E03F2C266564685A6140555BEAA6481"><span purpose="cmd">在 <span class="usertext">if sr.factoryCode == 2248:</span> 行之后,在同一行添加以下注释:</span><div class="info" purpose="info"><p id="GUID-B57DFE3B-DC15-48B1-B9D3-7C7572F6DCC2"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"> # WKID of target coordinate system</code></pre></div></section></p><p id="GUID-FEEABAF5-DA50-4134-8F75-B8CD80ADEC9D">您已添加用于解释代码的注释。</p><p id="GUID-97797A56-C62E-4FAD-9F91-7B7A906E4607">以下为完整代码:</p><p id="GUID-1449CE73-1816-4199-AA24-AFDD8285007C"><section class="codeblock padded-anchor" purpose="codeblock"><div class="codeblockbody"><pre><code class="other no-highlight"># Author: your name # Date: the date # Purpose: This script reads all the feature classes in a # geodatabase and copies them to a new feature dataset in # a new geodatabase. Feature classes not already in the # target coordinate system are projected. # Imports import arcpy import os # Variables for paths, outputs, workspaces mypath = "C:/Lessons/PythonWorkflow" gdb = "Transportation.gdb" new_gdb = "Metro_Transport.gdb" fds = "Metro_Network" arcpy.env.workspace = os.path.join(mypath, gdb) arcpy.env.overwriteOutput = True # Create a new geodatabase and dataset new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb) print(f"The geodatabase {new_gdb} has been created.") arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248) print(f"The feature dataset {fds} has been created.") # Create a list of feature classes in the workspace fcs = arcpy.ListFeatureClasses() for fc in fcs: desc = arcpy.da.Describe(fc) sr = desc["spatialReference"] new_fc = os.path.join(mypath, new_gdb, fds, fc) if sr.factoryCode == 2248: # WKID of target coordinate system arcpy.CopyFeatures_management(fc, new_fc) print(f"The feature class {fc} has been copied.") else: arcpy.Project_management(fc, new_fc, 2248) print(f"The feature class {fc} has been projected.")</code></pre></div></section></p><p id="GUID-BD890FD9-FCAA-4899-BE43-8C598177FB1E"><img purpose="img" placement="inline" alt="包含注释的最终代码" title="包含注释的最终代码" src="GUID-BAED6362-9AE0-440B-B96D-2BB318CEAD78-web.png" loading="lazy"/></p></div></li><li purpose="step" id="ESRI_STEP_A821CF7D8849445B875E21F426084B59"><span purpose="cmd">保存脚本。</span></li></ol></div></section></section><section class="wfsummary padded-anchor" id="GUID-1D55F0A3-1AFB-41AF-86C0-219043FC75CD" purpose="wfsummary"><p id="GUID-CF587956-6187-4143-B307-340812DBBA54">在本教程中,您学习了以下内容:</p><p id="GUID-4B091FC1-2660-47EE-8B28-D967CF2A630E"/><ul purpose="ul" id="UL_AAF754F5902746998BFD55157EDCBE8C"><li purpose="li" id="LI_3B934A35645F4908B52ED8D609994744"><span class="ph">Python</span> 脚本可用于自动化 GIS 工作流中的重复性任务。</li><li purpose="li" id="LI_E87FBB8AA76044F1BBF48B5B3F230189"><span class="ph">ArcPy</span> 包含多个用于创建数据集列表的函数。</li><li purpose="li" id="LI_2F660322FA9E4131A9002BE873B70654">通过使用 <span class="ph">Python</span> 代码列出和描述数据集,您可以在工作空间中创建详细的 GIS 数据集清单。 然后,您可以决定根据其特征以不同方式处理每个数据集。</li><li purpose="li" id="LI_C4EEEF0A2E144A958245F66034EFC0A9">要确保正确输出,必须谨慎处理路径和文件名。</li></ul><p id="GUID-C54E9849-001D-4B4E-B7B0-C46066FEBDB8">您也可能对由 <a target="_blank" class="xref xref" href="https://esripress.esri.com/display/index.cfm">Esri Press</a> 出版的 Paul A.Zandbergen 博士的<a target="_blank" class="xref xref" href="https://esripress.esri.com/display/index.cfm?fuseaction=display&websiteID=384&moduleID=0">适用于 <span class="ph">ArcGIS Pro</span> 的 <span class="ph">Python</span> 脚本</a>和<a target="_blank" class="xref xref" href="https://esripress.esri.com/display/index.cfm?fuseaction=display&websiteID=393&moduleID=0">适用于 <span class="ph">ArcGIS Pro</span> 的高级 <span class="ph">Python</span> 脚本</a>感兴趣。</p></section>