Arcpy点点滴滴学习教程
- 第1章 ArcPy简介
- 1.1什么是 ArcPy?
ArcPy 是一个以成功的 arcgisscripting 模块为基础并继承了 arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。
该包提供了丰富纯正的 Python 体验,具有代码自动完成功能(输入关键字和点即可获得该关键字所支持的属性和方法的弹出列表;从中选择一个属性或方法即可将其插入),并针对每个函数、模块和类提供了参考文档。
在 Python 中使用 ArcPy 的另一个主要原因是,Python 是一种通用的编程语言。Python 是一种支持动态输入的解释型语言,适用于交互式操作以及为称为脚本的一次性程序快速制作原型,同时其具有编写大型应用程序的强大功能。用 ArcPy 编写的 ArcGIS 应用程序的优势在于,可以使用由来自多个不同领域的 GIS 专业人员和程序员组成的众多 Python 小群体开发的附加模块。
- 1.2 ArcPy 快速浏览
利用 ArcPy 可访问地理处理工具和其他函数、类和模块,使用它们可快速轻松地创建简单或复杂工作流。使用以 ArcPy 编写的 ArcGIS 应用程序和脚本的优势在于,可以访问并使用由来自多个不同领域的 GIS 专业人员和程序员开发的大量 Python 模块。
一般来说,ArcPy 按工具、环境、函数、类和模块进行组织。
例1.1 执行缓冲区工具
arcpy.Buffer_analysis("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")
讯享网
以下是另一个运行工具的示例。该示例使用的是数据管理工具箱和转换工具箱中的工具。向输入 streets 要素类添加一个字段并计算该字段,然后将要素类加载到 ArcSDE 企业级地理数据库中。
例1.2 执行多个工具
讯享网arcpy.AddField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "TEXT") arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON_9.3") arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
执行地理处理工具时,工具的结果会返回到 result 对象中。通常,该对象是由工具生成或更新的输出数据集的路径。在其他情况下,它可能会包含其他类型的值,如数值或布尔值。如果工具的输出是多值参数,则这些值可在列表中以列表的形式返回。
以下代码示例显示了如何捕获返回值以及这些值的具体内容:
返回输出要素类的路径,该结果可用作其他函数的输入;返回要素数目。
例1.3 从工具获取结果
result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS") print result arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers") result = arcpy.GetCount_management("streets_50m_of_rivers") print result.getOutput(0)
可通过 env 类来获得属性形式的环境设置。这些属性可用于检索和设置当前环境值。下面是如何使用环境值的示例:
例1.4 设置工作空间环境
讯享网 arcpy.env.workspace = "c:/data/Portland.gdb" arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS") arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets").getOutput(0) if arcpy.env.cellSize != 30: arcpy.env.cellSize = 30
以下示例代码显示的是获得数据的属性:
例1.5 使用函数
import arcpy # prints True print arcpy.Exists("c:/data/Portland.gdb/streets") # prints NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet sr = arcpy.Describe("c:/data/Portland.gdb/streets").spatialReference print sr.name
例1.6 使用类
讯享网import arcpy spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
例如,arcpy.sa 模块中的工具将使用 Spatial Analyst 工具箱中的工具,但被配置为支持“地图代数”。因此,执行 arcpy.sa.Slope 与执行 Spatial Analyst 工具箱中的坡度工具的作用是相同的。
第2章 使用ArcPy准备工作
2.1 导入 ArcPy
在导入 ArcPy 之后,可以运行随 ArcGIS 安装的标准工具箱中的所有地理处理工具。
例2.1 导入ArcPy
Importing arcpy
import arcpy
模块为通常包含函数和类的 Python 文件。有一系列模块支持 ArcPy,包括制图模块(arcpy.mapping)、Spatial Analyst 模块 (arcpy.sa) 和Geostatistical Analyst 模块 (arcpy.ga)。
要导入整个模块,请使用导入模块:
例2.2 导入模块
Import only arcpy.mapping
讯享网import arcpy.mapping
在很多情况下,用户可能不想使用整个模块或无需使用整个模块。如果只导入某一模块的一部分,可以使用 from-import 语句。在下例中,将导入 env 类(env 类包含所有地理处理环境)。现在无需以 arcpy.env 的形式访问环境,而可以将其简化为 env。
例2.3 导入部分模块
# Import env from arcpy and set the workspace environment from arcpy import env env.workspace = "c:/data"
遵循相同的思路,有时用户可能需要注意:如何对模块或模块的一部分进行标识以使脚本更具可读性,以及对于首选项来说默认名称可能过长。在上述任一情况下,均可以使用 from-import-as 的形式。与先前的示例相同,下面的示例中也将导入 env 类,但会指定 ENV 作为 env 类的名称:
例2.4 使用别名
讯享网# Import env from arcpy as ENV and set the workspace environment from arcpy import env as ENV ENV.workspace = "c:/data"
模块的内容将被直接导入到命名空间中,这表示用户随后可以直接使用所有这些内容,而无需为它们添加前缀。使用此方法存在一些风险。具有相同名称的其他对象、变量、模块等将被覆盖,另外在使用大型模块时,命名空间可能会变得异常拥挤和杂乱。此方法可能导致在阅读脚本时出现不确定或难以阅读的情况。
但是在某些情况下,from-import-* 可以简化代码,例如,在使用 ArcGIS Spatial Analyst 扩展模块的 sa 模块的情况下。sa 模块的优势之一在于,可以在一行中嵌套多个类和函数以生成输出栅格对象。
例2.5 直接导入
# Import arcpy and the sa module import arcpy from arcpy import sa arcpy.CheckOutExtension("spatial") # Get input parameters inRaster1 = arcpy.GetParameterAsText(0) inRaster2 = arcpy.GetParameterAsText(1) inRaster3 = arcpy.GetParameterAsText(2) outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))
环境可作为环境类中的读/写属性进行访问,方法为 arcpy.env.<环境名称>。还可以利用 Python 的 from-import 语句简化代码,而不必为每个环境名称都添加 arcpy.env 前缀。
例2.6 设置环境值
讯享网import arcpy from arcpy import env # Set the workspace environment setting# env.workspace = "c:/St_Johns/data.gdb" # Set the XYTolerance environment setting# env.XYTolerance = 2.5 # Calculate the default spatial grid index, divide in half, then # set the spatial grid 1 environment setting# result = arcpy.CalculateDefaultGridIndex_management("roads") env.spatialGrid1 = float(result.getOutput(0)) / 2 # Clip the roads by the urban area feature class# arcpy.Clip_analysis("roads","urban_area","urban_roads")
例2.7 获取和设置环境值
import arcpy from arcpy import env # Check the current raster cell size and make sure it is a certain size # for standard output# env.workspace = "c:/avalon/data" if env.cellSize < 10: env.cellSize = 10 elif env.cellSize > 20: env.cellSize = 20 arcpy.HillShade_3d("island_dem", "island_shade", 300)
设置环境值时要注意拼写和大小写。将值指定给 arcpy.env.Workspace 与设置 arcpy.env.workspace(注:arcpy.env.workspace 是正确的格式)是不同的。
例2.8 处理临时数据
讯享网import arcpy inputFC = arcpy.GetParameterAsText(0) clipFC = arcpy.GetParameterAsText(1) outputFC = arcpy.GetParameterAsText(2) # Use scratchGDB environment to write intermediate data# tempData = arcpy.CreateScratchName(workspace=arcpy.env.scratchGDB) bufferResult = arcpy.Buffer_analysis(inputFC, tempData, "50 METERS") arcpy.Clip_analysis(clipFC, bufferResult, outputFC)
可使用ResetEnvironments 函数恢复默认环境值,或者可以使用ClearEnvironment 函数重置特定环境。
例2.9 重新设置环境
# Reset geoprocessing environment settings arcpy.ResetEnvironments() # Reset a specific environment setting arcpy.ClearEnvironment("workspace")
表2-1 env常用属性
属性
说明
数据类型
cellSize
(读写)
支持“像元大小”环境设置的工具可以设置在操作时使用的输出栅格像元大小或分辨率。默认输出分辨率由最粗糙的输入栅格数据集决定。
String
extent
(读写)
支持“输出范围”环境的工具只会处理落入此设置中所指定范围内的要素或栅格。
String
mask
(读写)
支持“掩膜”环境的工具只会考虑运行过程中落入分析掩膜范围内的像元。
String
nodata
(读写)
支持 NoData 环境设置的工具将仅处理其中 NoData 有效的栅格
String
spatialGrid1
spatialGrid2
spatialGrid3
(读写)
遵循“输出空间格网 1、2 和 3”环境的工具将创建具有指定空间索引格网的要素类(如果要素类支持空间索引格网)。
Double
tileSize
(读写)
支持“分块大小”环境的工具用于为存储在数据块中的栅格设置分块大小。
String
workspace
(读写)
支持“当前工作空间”环境设置的工具将指定的工作空间用作地理处理工具输入和输出的默认位置。
String
XYDomain
(读写)
支持“输出 XY 属性域”环境的工具可为输出地理数据集的 x,y 属性域设置特定范围。
String
XYResolution
(读写)
支持此环境的工具可将 x,y 分辨率应用到输出地理数据集中。
String
XYTolerance
(读写)
支持此环境的工具会覆盖在地理数据库内创建的地理数据集上的默认 x,y 容差。
String
使用 ArcGIS for Desktop Basic 或 Standard 许可时,脚本应将产品设置为 Basic 或 Standard。同样,使用 Engine 或 EngineGeoDB 许可时,脚本应将产品设置为 Engine 或 EngineGeoDB。如果未明确设置许可,将根据首次访问 ArcPy 工具、函数或类时的最高可用许可等级初始化许可。
每种工具都将执行检查以确保具有相应的许可。如果不具有所需的许可,工具将运行失败。为避免脚本在执行到一半时失败,可以在脚本开头执行检查,以尽早发现失败。
注意:只有在独立脚本中才必须设置产品和扩展模块。如果从 Python 窗口运行工具或者使用脚本工具,产品已在应用程序内进行设置,激活的扩展模块取决于“扩展模块”对话框。
例2.10 检查ArcGIS for Desktop Advanced 许可。
讯享网import sys import arcpy arcpy.env.workspace = "c:/data/world.gdb" if arcpy.CheckProduct("ArcInfo") == "Available": arcpy.PolygonToLine_management("Lakes", "LakeLines") else: msg = 'ArcGIS for Desktop Advanced license not available' print(msg) sys.exit(msg)
下面的示例将执行一些 ArcGIS 3D Analyst 工具,并将 Desktop 产品许可设置为 ArcGIS for Desktop Basic,因为执行扩展模块中的工具时不需要 ArcGIS for Desktop Advanced 的许可。如果未明确设置 ArcGIS for Desktop Basic 的许可,并且无可用的 ArcGIS for Desktop Advanced 许可,则脚本将失败,因为运行扩展模块工具需要 Desktop 许可。
例2.11 检查ArcGIS 3D Analyst 扩展模块许可
class LicenseError(Exception): pass # Set desktop license used to ArcGIS for Desktop Basic# import arcview import arcpy from arcpy import env try: if arcpy.CheckExtension("3D") == "Available": arcpy.CheckOutExtension("3D") else: # Raise a custom exception # raise LicenseError env.workspace = "D:/GrosMorne" arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300) arcpy.Aspect_3d("WesternBrook", "westbrook_aspect") except LicenseError: print "3D Analyst license is unavailable" except: print arcpy.GetMessages(2) finally: # Check in the ArcGIS 3D Analyst 扩展模块 # arcpy.CheckInExtension("3D")
第3章 Python调用地理处理工具
3.1 地理处理工具
1、地理处理
地理处理适合于各类使用 ArcGIS 的用户。无论是初学者还是高级用户,地理处理都可能是日常使用 ArcGIS 的重要组成部分。地理处理的基本目的是提供用于执行分析和管理地理数据的工具和框架。地理处理所提供的建模和分析功能使得 ArcGIS 成为一个完整的地理信息系统。
地理处理提供了大量成套工具,用于执行从简单的缓冲区和面叠加到复杂的回归分析和影像分类等各项 GIS 任务。执行自动操作的任务可以是普通任务 - 例如,将大量数据从一种格式转换为另一种格式。也可以是很有创造性的任务,这些任务使用一序列操作对复杂的空间关系进行建模和分析 - 例如,通过交通网络计算**路径、预测火势路径、分析和寻找犯罪地点的模式、预测哪些地区容易发生山体滑坡或预测暴雨事件造成的洪水影响。
最常用的 GIS 工具可自动执行一些以往手动完成的任务,例如,通过在一张地图上方叠加另一张地图来编译新地图,或者以物理方式将地图剪切成表示特定研究区域的各个部分,然后更改其投影。在此类手动执行的任务中,有些任务操作起来非常困难和复杂,以至于它们阻碍了地理知识和数据的宣传普及,而它们也是发明 GIS 的主要动力。
· 叠加分析和邻域分析
这两个常用的工具集可以回答两个最基本的地理问题:什么在什么之上?以及什么在什么附近?
· 表面分析
地理现象不仅仅局限于离散的点、线和面,还包括在地球表面(或正在研究的任何星球或物体)上连续变化的数据,例如,高程、坡度、降雨量和温度等。这种连续数据称为表面并用栅格和 TIN 进行建模。
· 空间统计数据和非空间统计数据
地理学中有这样一条公理:事物的距离越近,其相似程度越高。该公理不仅为用来发现和表征地理模式且功能强大的空间统计工具奠定了基础,而且还为标准的非空间统计工具(如最小值、最大值、总和、频率、均值和标准差)奠定了基础。
· 表管理
ArcGIS 将数据存储在易于访问的表中,并且大部分工作流都包括某种表管理操作,例如,添加或删除字段、创建表间关系或根据包含坐标的列创建要素。
· 选择和提取
GIS 数据集包含的数据通常远超出需求,而一组常见的任务可用于从较大且较复杂的数据集中减去数据或提取数据。
工具都储存在工具箱中。ArcGIS 提供了数百种工具,并将它们进行了分类并放到了十余个工具箱中,这些工具功能丰富、涉及领域广泛。
图3-1 ArcGIS 提供的工具箱
要执行工具,首先必须找到该工具,方法是在搜索 窗口中搜索该工具或在目录 窗口中浏览到该工具。
图3-2 搜索工具
要从目录 窗口或 ArcToolbox 窗口中打开工具对话框,请双击该工具,或右键单击并选择打开。
图3-3 打开工具
工具对话框打开后,填入工具的参数。各工具自己都有唯一一组参数。有些参数为必需参数,只有填入这些参数(即,它们必须具有值)后工具才可执行。其他参数为可选参数,也就是说,可以将这些参数留空或接受其默认值。工具具有输入和输出参数。输入参数通常是现有数据集或选项,它们控制着工具的功能。输出参数通常是工具创建的新数据集。对于输出数据集参数,在您输入一个或多个输入参数后,将自动创建输出数据集名称和位置。
图3-4 模型构建器
在模型构建器中,添加工具,打开其对话框,填入参数,然后单击确定按钮。如果单击确定后,工具并未执行,那么必须运行模型,该工具才能执行。这样可将多个工具串联在一起,可以一次性执行所有相关工具。
模型是自动处理工作的方式。创建模型时,保留可以使用不同输入数据多次执行的数据处理工作流。使用模型可自动处理无数的任务。
图3-6 Python窗口
虽然与使用工具对话框相比,该工作显得有些多余(谁也不愿意输入成批的代码),但使用 Python 和 Python 窗口具有很多优势:
· 可以使用逻辑语句(如 if-then-else)进行条件执行或使用 for 循环遍历数据集,也可访问 Python 数据结构(如字典和列表)。
· 可以访问标准 Python 模块中的功能来对字符串、数学或文件和文件夹进行操作。下图中,glob 模块被用于浏览系统文件夹中的所有文件。
· Python 具有丰富的可用于操纵和变换数据的第三方模块。
· 加载 ArcPy 站点包(在下图中通过 import 语句进行加载)时,可以访问所有地理处理工具以及许多用于逐行读取要素、描述数据或与 ArcMap 交互的其他函数。例如,在下图中,使用 ArcPy mapping模块向当前地图中添加图层。
图3-7 代码示例
3.3 通过 Python 使用工具
1、工具参数与调用
每个地理处理工具都具有一组固定的参数,这些参数为工具提供执行所需的信息。工具通常包含多个输入参数以定义一个或多个数据集,这些数据集一般用于生成新的输出数据。参数具有几个重要属性:
· 每个参数具有一种或多种特定的数据类型,如要素类、整型、字符串或栅格。
· 参数为输入值或输出值。
· 参数需有值,或为可选。
· 各个工具参数都具有唯一的名称。
在 Python 中使用工具时,必须正确设置工具的参数值,以便在脚本运行时工具可以执行。一旦提供了一组有效的参数值,工具即准备好执行。参数将被指定为字符串或对象。
字符串是唯一标识参数值的简单文本,如数据集的路径或关键字。在下面的代码示例中,为缓冲区工具定义了输入和输出参数。请注意,工具名称要追加其工具箱的别名。在该示例中,两个字符串变量用于定义输入和输出参数,以便对工具的调用更容易阅读。
例3-1 使用字符串作为参数
讯享网import arcpy roads = "c:/base/data.gdb/roads" output = "c:/base/data.gdb/roads_Buffer" # Run Buffer using the variables set above and pass the remaining # parameters in as strings arcpy.Buffer_analysis(roads, output, "distance", "FULL", "ROUND", "NONE")
对于部分参数(如空间参考),还可以指定对象。在下面的代码示例中,使用其可选“坐标系”参数的SpatialReference 对象执行 创建要素类工具。
例3-2 使用对象作为参数
import arcpy in_workspace = "c:/temp" output_name = "rivers.shp" # Create a spatial reference object spatial_ref = arcpy.SpatialReference('North America Equidistant Conic') # Run CreateFeatureclass using the spatial reference object arcpy.CreateFeatureclass_management( in_workspace, output_name, spatial_reference=spatial_ref)
大部分地理处理工具同时包含必选参数和可选参数。通常,在许多情况下都存在多个不需要进行指定的可选参数。有两种方法可以处理这些未使用的参数。一个方法是保持所有可选参数有序,然后将您不需要的参数引用为空字符串 “”、井号 “#” 或类型为 None 的参数。另一种方法是使用关键字参数,并使用参数名称来分配值。使用关键字参数可以跳过未使用的可选参数或以不同的顺序指定它们。
例3-3 使用空字符串跳过可选参数
讯享网import arcpy arcpy.AddField_management("schools", "school_id", "LONG", "", "", "", "", "NON_NULLABLE")
例3-4 使用关键字参数跳过可选参数
import arcpy arcpy.AddField_management("schools", "school_id", "LONG", field_is_nullable="NON_NULLABLE")
下面的示例说明了如何在执行地理处理工具后获取结果对象的输出。
例3-5 获取结果对象的输出
讯享网import arcpy arcpy.env.workspace = "c:/city/data.gdb" # Geoprocessing tools return a result object of the derived # output dataset. result = arcpy.CopyFeatures_management("roads", "urban_roads") # A print statement will display the string # representation of the output. print result # A result object can be indexed to get the output value. # Note: a result object also has a getOutput() method that # can be used for the same purpose. result_value = result[0]
如果为结果对象建立索引或使用其 getOutput() 方法,那么返回值为 Unicode 字符串。当使用派生输出参数运行诸如获取计数(提供表中的记录数)或计算默认拓扑容差(提供拓扑容差值)之类的工具时,需要重点考虑这一点。要将 Unicode 字符串转换为所需类型,可使用 int() 或 float() 等内置 Python 函数。
注:派生参数不需要用户的交互,并且不会在工具对话框上或作为 Python 中的工具的参数出现。输出参数通常是“派生”类型。
例3-6 派生输出参数
import arcpy import types arcpy.env.workspace = "c:/base/data.gdb" # Many geoprocessing tools return a result object of the derived # output dataset. result = arcpy.GetCount_management("roads") result_value = result[0] # The result object's getOutput method returns values as a # unicode string. To convert to a different Python type, use # built-in Python functions: str(), int(), long(), float() count = int(result_value) print count print types.TypeType(count)
如果创建的输出仅为大型工作流的一个中间阶段,那么输出参数可以省略,以便工具为输出创建唯一路径和名称。可以通过将输出设置为“#”或“None”来完成此操作,或如果输出是所使用的最后一个参数,则可以完全跳过此操作。在每种情况中,返回值都是新数据源的完整路径。
例3-7 输出参数的省略
讯享网import arcpy arcpy.env.workspace = "c:/city/data.gdb" result = arcpy.CopyFeatures_management("roads", "#") result = arcpy.CopyFeatures_management("roads", "") result = arcpy.CopyFeatures_management("roads")
例3-8 工具调用方式
import arcpy in_features = "c:/temp/rivers.shp" # Tools can be accessed as functions on the arcpy module arcpy.GetCount_management(in_features) # Or from modules matching the toolbox name arcpy.management.GetCount(in_features)
通过模块使用工具时,有时可能要注意标识模块的方式,以便脚本具有更好的可读性。在这种情况下,可以使用格式 from - import - as。
例3-9 标识模块的方式
讯享网# Clean up street centerlines that were digitized without # having set proper snapping environments import arcpy from arcpy import edit as EDIT from arcpy import management as DM streets = "c:/data/streets.gdb/majorrds" streets_copy = "c:/output/Output.gdb/streetsBackup" DM.CopyFeatures(streets, streets_copy) EDIT.TrimLine(streets, "10 Feet", "KEEP_SHORT") EDIT.ExtendLine(streets, "15 Feet", "EXTENSION")
3.4 示例:如何按照字段列表创建FeatureClass ?
1、创建Workspace
“工作空间”工具集包含一系列可创建 ArcGIS 所使用的数据存储结构的工具。这些结构包括工作空间、文件、两种类型的地理数据库、要素数据集和一个 ArcSDE 连接文件。
Shapefiles是文件类型的空间数据存储格式,从而在“工作空间”工具集中选用“CreateFolder”工具来完成这一目标。
CreateFolder_management (out_folder_path, out_name)
out_folder_path:要创建文件夹的磁盘位置。数据类型为Folder
out_name: 要创建的文件夹。数据类型为String
例3-10 CreateFolder
# Import system modules import arcpy from arcpy import env # Set workspace env.workspace = "C:/data" # Set local variables out_folder_path = "C:/output" out_name = "folder1" # Execute CreateFolder arcpy.CreateFolder_management(out_folder_path, out_name) 如果想创建文件地理数据库,则需调用“CreateFileGDB”工具。 CreateFileGDB_management (out_folder_path, out_name, {
out_version}) n out_folder_path:将创建文件地理数据库的位置(文件夹)。数据类型为Folder n out_name:要创建的文件地理数据库的名称。数据类型为String
例3-11 CreateFileGDB
讯享网# Import system modules import arcpy # Set local variables out_folder_path = "C:/output" out_name = "fGDB.gdb" # Execute CreateFileGDB arcpy.CreateFileGDB_management(out_folder_path, out_name)
要素类是具有相同几何类型的要素的集合:点、线、多边形或注记。 要素类可与其他要素类一起存储在地理数据库中的要素数据集内,也可作为独立要素类存储在地理数据库中。此外,要素类还可存储在 shapefile 中,或者与具有不同几何的其他要素类一起存储在 coverage 中。
要想在 ArcSDE 地理数据库、文件地理数据库或个人地理数据库中创建空要素类;在文件夹中此工具将创建 shapefile。要使用“CreateFeatureclass”工具。
CreateFeatureclass_management (out_path, out_name, {
geometry_type}, {
template}, {
has_m}, {
has_z}, {
spatial_reference}, {
config_keyword}, {
spatial_grid_1}, {
spatial_grid_2}, {
spatial_grid_3})
out_path:创建输出要素类所在的 ArcSDE 地理数据库、文件地理数据库、个人地理数据库或文件夹。此工作空间必须已经存在。数据类型为:Workspace;Feature Dataset
out_name:要创建的要素类的名称。数据类型为String
geometry_type:要素类的几何类型,可设置为“POINT”、“MULTIPOINT”、“POLYGON”、 “POLYLINE”。数据类型为String
例3-12 CreateFeatureclass
讯享网# Name: CreateFeatureclass_Example2.py # Description: Create a feature class to store the gnatcatcher habitat zones # Import system modules import arcpy from arcpy import env # Set workspace env.workspace = "C:/data" # Set local variables out_path = "C:/output" out_name = "habitatareas.shp" geometry_type = "POLYGON" template = "study_quads.shp" has_m = "DISABLED" has_z = "DISABLED" # Use Describe to get a SpatialReference object spatial_reference = arcpy.Describe("C:/workspace/studyarea.shp").spatialReference # Execute CreateFeatureclass arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, template, has_m, has_z, spatial_reference)
添加字段是指向表或要素类表、要素图层、栅格目录和/或带属性表的栅格添加新字段。“AddField”工具。
AddField_management (in_table, field_name, field_type, {
field_precision}, {
field_scale}, {
field_length}, {
field_alias}, {
field_is_nullable}, {
field_is_required}, {
field_domain})
n in_table:要添加指定字段的输入表。该字段将被添加到现有输入表,并且不会创建新的输出表。可将字段添加到 ArcSDE 的要素类、文件或个人地理数据库的要素类、coverage、shapefile、栅格目录、独立表、带属性表的栅格和/或图层。
Ø TEXT —名称或其他文本特性。
Ø FLOAT —特定范围内含小数值的数值。
Ø DOUBLE —特定范围内含小数值的数值。
Ø SHORT —特定范围内不含小数值的数值;编码值。
Ø LONG —特定范围内不含小数值的数值。
Ø DATE —日期和/或时间。
Ø BLOB —影像或其他多媒体。
Ø RASTER —栅格影像。
Ø GUID —GUID 值
例3-12 AddField
讯享网# Name: AddField_Example2.py # Description: Add a pair of new fields to a table # Import system modules import arcpy from arcpy import env # Set environment settings env.workspace = "C:/data/airport.gdb" # Set local variables inFeatures = "schools" fieldName1 = "ref_ID" fieldPrecision = 9 fieldAlias = "refcode" fieldName2 = "status" fieldLength = 10 # Execute AddField twice for two new fields arcpy.AddField_management(inFeatures, fieldName1, "LONG", fieldPrecision, "", "", fieldAlias, "NULLABLE") arcpy.AddField_management(inFeatures, fieldName2, "TEXT", "", "", fieldLength)
4、完整程序
函数的一般形式与工具类似;它接受参数(可能需要也可能不需要)并返回某些结果。非工具函数的返回值可以为各种类型 - 从字符串到地理处理对象。工具函数会始终返回结果对象,并提供地理处理消息支持。
工具参数通常使用简单文本字符串来定义。数据集名称、路径、关键字、字段名称、容差、域名可通过带引号的字符串指定。对于需要多个属性的较复杂参数,难以使用简单字符串对其进行定义。这种情况下可使用类(例如,SpatialReference、ValueTable 和 Point 类)来定义这些字符串,而不必输入复杂的长文本字符串。
4.1 列出数据并描述数据
1、ListWorkspaces
列出所设置的工作空间中的所有工作空间。可以为工作空间名称和工作空间类型指定搜索条件,从而限制所返回的列表。 必须先设置工作空间环境,之后才能使用多个列表函数。
ListWorkspaces ({wild_card}, {workspace_type})
wild_card :通配符,可限制返回的结果。如果未指定任何通配符,则会返回所有值。
workspace_type :工作空间类型,有六种可能。
Ø Access —Only personal geodatabases will be selected.
Ø Coverage —Only coverage workspaces will be selected.
Ø FileGDB —Only file geodatabases will be selected.
Ø Folder —Only shapefile workspaces will be selected.
Ø SDE —Only ArcSDE databases will be selected.
Ø All —All workspaces will be selected. (默认值为 All)
import arcpy arcpy.env.workspace = "c:/data" # List all file geodatabases in the current workspace workspaces = arcpy.ListWorkspaces("*", "FileGDB") for workspace in workspaces: # Compact each geodatabase arcpy.Compact_management(workspace)
4.4 消息和错误处理
4.5 示例:添加Feature至FeatureClass
要将 NumPy 数组转换为表和要素类,数组必须为结构化数组。结构化数组包括用来在 ArcGIS 表和要素类中将数据映射至字段的多个字段(或结构体)。
讯享网import numpy array = numpy.array([(.383, .782), (.493, .216)], numpy.dtype([('X', '>f8'),('Y', '>f8')]))
一经创建,结构化 NumPy 数组即可转换为要素类或表。
创建数组的 dtype 取决于输入表的字段类型或要素类。
字段类型
NumPy dtype
单精度
numpy.float32
双精度
numpy.float64
SmallInteger
numpy.int32
整型
numpy.int32
OID
numpy.int32
GUID
<U64
字符串
<u1、<u10 等
numpy提供了loadtxt函数进行文本文件加载,该功能不仅能实现数据加载,而且能按照dtype将数据按照要求进行标准化,如dtype为结构化数据类型,则加载后的数据直接为结构化数组。
numpy.loadtxt(fname, dtype=<type ‘float’>, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
loadtxt函数要求文本文件每一行必须包含同样数量的值。
fname : 文件或字符串
将要读取的文本文件,或者该文件的文件名
dtype : 数据类型, 可选参数
结果数组的数据类型,缺省情况下为float。若其为结构化数据,结果数组将是1维数组,文本文件中的每一行将成为该数据中的一个元素。此时,文本文件中数据的列数必须与数据类型中的字段数相同。
comments : 字符串, 可选参数
用于标识注释文字的字符,缺省值为‘#’。
delimiter : 字符串, 可选参数
用于分隔文本文件数值的分隔符,缺省情况下为空格,根据文本文件中数据格式,可以设置为诸如‘,’等。
skiprows : 整数, 可选参数
读取文件时跳过文件头上的skiprows 行,缺省值为 0。
usecols : 数值序列, 可选参数
Which columns to read, with 0 being the first. For example, usecols = (1,4,5) will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read.
NumPyArrayToFeatureClass将 NumPy 结构化数组转换为点要素类。
NumPyArrayToFeatureClass (in_array, out_table, shape_fields, {spatial_reference})
参数
说明
数据类型
in_array
NumPy 结构化数组。
数组必须包含字段名称和 numpy dtype。
NumPyArray
out_table
The output point feature class to which the records from the NumPy array will be written.
String
shape_fields
[shape_fields,…]
A list (or tuple) of field names used to create the feature class’ geometry. Coordinates are specified in the order of x, y, z, and m. z-coordinate and m-value fields are optional.
Assuming field names of x, y, z, and m in a numpy array, feature classes could be constructed as below.
String
spatial_reference
要素类的空间参考。可以使用SpatialReference 对象或等效字符串来指定。
(默认值为 None)
SpatialReference
shape_fields使用示例:
import arcpy # Create a feature class with x,y fields arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y")) # Create a feature class with x,y,z fields arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z")) # Create a feature class with x,y,m fields arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "", "m")) # Create a feature class with x,y,z,m fields arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z", "m"))
5.2 da中的Cursor
5.3 编辑会话与事务
数据文件内容为:
0.000,0.500
1.000,1.500
2.000,2.500
3.000,3.500
4.000,4.500
5.000,5.500
6.000,6.500
7.000,7.500
8.000,8.500
9.000,9.500
10.000,10.500
11.000,11.500
使用Python编写以下程序:
讯享网import numpy import arcpy dtype=[('x', '>f8'), ('y', '>f8')] coords=numpy.loadtxt("d:\\coords.txt",dtype,delimiter=",")
此时,coords是读入数据文件的内容,即按照dtype的样式,将数据文件的数据描述为形式为x,y的坐标对。
array([(0.0, 0.5), (1.0, 1.5), (2.0, 2.5), (3.0, 3.5), (4.0, 4.5), (5.0, 5.5), (6.0, 6.5), (7.0, 7.5), (8.0, 8.5), (9.0, 9.5), (10.0, 10.5), (11.0, 11.5)], dtype=[('x', '<f8'), ('y', '<f8')]) out = "d:\\out.shp" arcpy.da.NumPyArrayToFeatureClass(coords,out,("x","y"))
按照x,y坐标对,将coords输出为d:\out.shp。将其加载到ArcMap窗口,即可显示坐标内容。
记住,loadtxt中要将dtype设置为正确的形式才能将数据正确读入。上述数据在numpy中输出方式如下:
讯享网numpy.savetxt("d:\\out.txt", coords, fmt="%.3f", delimiter=",")
若数据文件中包含有除x,y之外的信息,则需要重新构造dtype以适应数据文件中的记录内容。
第6章 制图模块(arcpy.mapping)
6.1 arcpy.mapping 简介
1、什么是 arcpy.mapping?
Arcpy.mapping 是作为 ArcPy 站点包一部分的一个 Python 脚本模块。随 ArcGIS for Desktop 一同安装,并对所有许可均可用。其设计初衷主要是用于操作现有地图文档 (.mxd) 和图层文件 (.lyr) 的内容。此外,还提供自动执行导出和打印的函数。Arcpy.mapping 可用于自动执行地图生产;它扩展了数据驱动页面的功能,同时,因其包含导出至 PDF 文档、创建和管理 PDF 文档的函数,而为构建完整地图册所必需。最后,可将 arcpy.mapping 脚本发布为地理处理服务,并将脚本功能提供给 Web 应用程序。
通过描述 arcpy.mapping 执行的一些方案来了解其功能将会更容易些。以下是 arcpy.mapping 脚本可完成的众多方案中的一小部分:
创建有关地图文档中所含信息(如数据框坐标系、图层数据源、数据源损坏的图层或布局元素位置)的报告。
更新、修复或替换地图文档或图层文件中的图层数据源。
更新图层符号系统而无需实际打开地图文档。
查找并替换文件夹内所有地图文档中的文本字符串。
将地图文档保存至之前的 ArcGIS 版本以便分发。
更新地图文档元数据(例如,关键字、摘要和描述)。
使用地图导出命令批量创建地理数据,例如由数据框中要素列表驱动的一系列 GeoTIFF 图像。
自动创建和管理要通过 ArcGIS for Server 发布的地图服务。
构建多种 PDF 地图册:
Ø 含标题页、多个地图页面以及任意数量含辅助内容(如表格式报表和联系人列表)的附加页面的专题或时态地图册。
Ø 基于数据驱动页面输出的参考地图册。
mxd = arcpy.mapping.MapDocument("C:/Project/Watersheds.mxd") arcpy.mapping.ExportToPDF(mxd, "C:/Project/Output/Watersheds.pdf")
Arcpy.mapping 不是 ArcObjects 的替代品,而是作为其支持的不同情景的一种备选方案。对于细粒度开发和应用程序自定义来说,ArcObjects 仍是必不可少的,而 arcpy.mapping 主要用于自动处理现有地图文档和图层文件的内容。
6.2 在ArcMap环境中使用arcpy.mapping
1、Python 窗口
要学习 arcpy.mapping,首先应从 Python 窗口着手。Python 窗口是 ArcMap 框架的一部分,它所提供的自动完成功能使您能够轻松读取函数参数的名称和顺序。以下步骤显示了如何设置 Python 窗口,以实现令人满意的最终用户体验并使其与本文档中的屏幕截图一致。
步骤:
在 ArcMap 中打开一个新的空地图文档。
单击地理处理 > Python。
在 Python 窗口的代码窗格(具有 >>> 字符)中单击。会有一些帮助文本出现在右侧的帮助窗格中。
右键单击代码窗格并选择帮助放置 > 底部。帮助即会出现在代码窗格的下方。
现在输入以下语句(请注意,Python 区分大小写):
讯享网arcpy.mapping.ExportToPDF()
Python 窗口应如下图所示。第一个必需参数称为 map_document,处于高亮显示状态。如果输入一个逗号,则第二个参数会变为高亮显示。只有两个必需参数:map_document 和 out_pdf。可选参数使用大括号 {} 括起。
右键单击代码窗格,然后单击全部清除以清除代码窗格。
引用地图文档的方法有两种。第一种方法是通过提供 .mxd 文件的路径在磁盘上进行引用。如果要构建将在 ArcGIS 环境外部运行的脚本,则必须使用地图文档的路径对其进行引用。第二种方法是引用当前加载至 ArcMap 应用程序中的地图文档(在这种情况下,指的是 untitled.mxd)。在 ArcMap 内的 Python 窗口中进行操作时,引用当前加载的地图文档十分方便,因为在应用程序中可直接看到对地图文档执行的更改。以下步骤将介绍如何引用当前加载至 ArcMap 中的地图文档。
步骤:
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
mxd = arcpy.mapping.MapDocument("CURRENT")
MapDocument 函数为称为 mxd 的变量返回一个 MapDocument 对象参考。字符串 CURRENT 是用于引用当前已加载地图文档的关键字。也可以在此处提供地图文档的路径来代替 CURRENT。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
讯享网 mxd.author = "YOUR NAME GOES HERE"
将打开 MapDocument 对象具有一个称为 author 的属性。只需将其值设置为字符串即可。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
mxd.save()
由于该地图文档未保存,因此会出现一个对话框提示您提供路径和文件名。save() 方法不具有任何参数,但由于它是一个方法,因此仍必须加上左、右括号。事实上,如果要处理的是已经存在的地图文档,并不需要处理弹出的保存对话框。要验证地图文档的保存位置,请尝试以下操作:
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
讯享网 print mxd.filePath
代码窗格中会打印出路径:
在 Python 窗口中,输入以下内容:
arcpy.mapping.AddLayer(
自动完成功能显示有两个必需参数。第一个参数是对地图文档中数据框的引用。第二个参数是对要添加的图层的引用。该图层可以是地图文档或图层文件中的图层。第三个参数是可选参数,用于控制内容列表中图层的放置。由于这是第一个也是仅有的一个图层,可以忽略第三个参数并使用其默认值。
添加该图层之前,需要引用相应的对象。首先将引用数据框。
在 Python 窗口中,输入以下内容,完成输入后按 ENTER:
讯享网 df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
ListDataFrames 函数需要引用地图文档和通配符过滤器(可选)。可以提供数据框的全名以进行搜索。还可以输入类似 “lay*” 的内容。
所有 ArcPy 列表函数将返回 Python 列表对象。在列表中返回的这些项目从零开始,这表示列表中的第一个项目的索引值为 0,第二个项目为 1,依此类推,一直到 n-1。由于要让 df 变量引用 DataFrame 对象而不是 Python 列表对象,因此必须在函数后追加索引号。在函数末尾追加 [0] 会返回列表中的第一个数据框。在这里,将返回列表中仅有的数据框。如果在地图文档中对数据框进行唯一命名并使用相应的通配符值分隔项目,应始终返回仅有一个项目的列表,而索引 [0] 将会起到作用。如果在地图文档中有两个数据框,并且不想通过 wildcard 值引用第二个数据框,则需要在函数末尾加上 [1],例如,df2 = arcpy.mapping.ListDataFrames(mxd)[1]。
接下来,在使用 AddLayer 函数之前需要引用图层文件。引用图层文件的过程与通过提供 .mxd 完整路径引用图层文档的过程相同,所不同的是需使用 Layer 函数而非 MapDocument 函数。
在 Python 窗口中输入以下内容,完成输入后按 ENTER。注意:路径很可能与以下示例不同。
lyrFile = arcpy.mapping.Layer(r"C:\Project\data\Rivers.lyr")
在以上步骤中,创建了对现有图层文件的引用,该引用存储在名为 lyrFile 的变量中。
请注意,路径字符串的前面有一个小写 r。这是 Python 中的特殊字符,代表 raw。这表示要按原样解释该字符串并忽略字符串中的其他任何特殊字符。
所有必需的变量参考即已创建完毕。接下来将使用 AddLayer 函数将图层文件添加至当前地图文档。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
讯享网arcpy.mapping.AddLayer(df, lyrFile)
该图层应已添加到内容表和数据视图中,Python 窗口应如下图所示:
在 Python 窗口中输入以下内容,完成输入后按 ENTER。路径很可能与以下示例不同。
arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc1.pdf")
有很多参数与 ArcMap 中的设置一致。仅有两个必需参数:map_document 和 out_pdf。
已在指定位置创建了 PDF 文档,Python 窗口应如下图所示:
在 Python 窗口中,输入以下内容:
讯享网lyrFile.
输入点之后,请注意 Layer 对象上的所有不同属性和方法。使用 lyrFile 变量,可更改地图文档中的这些属性,在调用 save() 方法时,会将这些更改保存至磁盘上的图层文件 (.lyr)。
并非所有可能的图层属性都可用于 Layer 对象,只有那些对于地图自动化情景最常见的图层属性才可用。可通过创作图层文件中的属性以及使用 arcpy.mapping UpdateLayer 函数来修改更多属性。
大多数情况下,地图文档中已经具有图层。在以下这些步骤中,将假定图层已在地图文档中,再次对其进行引用。在地图文档中引用图层与引用数据框非常相似。
在 Python 窗口中,按 Backspace 删除当前文本,输入以下内容,然后按 ENTER:
lyr = arcpy.mapping.ListLayers(mxd)[0]
ListLayers 函数需要提供地图文档参考。该函数有两个附加参数:一个用于执行通配符搜索,另一个用于指定数据框。由于只有一个图层和一个数据框,因此不必提供其他参数。同样,语句结尾仍需要加上 [0] 索引值,以便返回 Layer 对象而不是 Python 列表对象。
使用新的 lyr 变量,可更新某些图层属性。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
讯享网lyr.name = "Some New Name" lyr.visible = False
运行后不会立即看到更改。不是所有的属性更改或方法都会自动更新应用程序。这是有意设计成这样的,目的在于避免应用程序经常刷新。使用 CURRENT 引用 ArcMap 中当前加载的地图文档时,有时需要刷新内容列表或活动视图(数据视图或布局视图)。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
arcpy.RefreshTOC() arcpy.RefreshActiveView()
内容列表和数据视图将刷新。注:如果在 ArcMap 外部运行独立脚本,则不需要这些附加函数。
Python 窗口应如下图所示:
在 Python 窗口中输入以下三行,在每行后面按 ENTER:
讯享网 lyr.visible = True arcpy.RefreshTOC() arcpy.RefreshActiveView()
在 ArcMap 中,以图形方式选择图层中的一个或多个要素。然后,创建存储所选要素范围的变量,并将该范围应用于所引用的 DataFrame 对象的 extent 参数。
在 Python 窗口中输入以下两行,在每行后面按 ENTER:
lyrExtent = lyr.getSelectedExtent() df.extent = lyrExtent
Python 窗口应如下图所示:
在 Python 窗口中输入以下内容,完成输入后按 ENTER。提供的路径很可能与以下示例不同。
讯享网arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc2.pdf")
Python 窗口应如下图所示:
新建 PDF 文档并追加两页
arcpy.mapping 模块包含一些 PDF 文档管理函数,这对于创建多页文档十分理想。例如,完整的地图册除包含数据驱动页面生成的标准参考地图页面以外,往往还包含一些其他页面。arcpy.mapping 的使用对于构建完整地图册来说是必要的步骤。
教程本部分将模拟多页报告的创建过程。首先要新建一个 PDF 文档,然后追加在先前步骤中创建的 PDF。假设这些 PDF 文档只是构成地图册的单个文档。例如,Doc1.pdf 可以是表示标题页和内容列表等的多页 PDF。第二个 PDF 文档可以是将所有数据驱动页面地图页面导出至单个多页 PDF 的结果。
第一步是新建 PDF 文档。
在 Python 窗口中输入以下内容,完成输入后按 ENTER:
PDFdoc = arcpy.mapping.PDFDocumentCreate(r"C:\Project\Final.pdf")
称为 PDFdoc 的变量引用内存中的 PDFDocument 对象。只有在保存并关闭文档后,该变量才会存在于磁盘中。
在 Python 窗口中输入以下三行,在每行后面按 ENTER:
讯享网 PDFdoc.appendPages(r"C:\Project\Doc1.pdf") PDFdoc.appendPages(r"C:\Project\Doc2.pdf") PDFdoc.saveAndClose()
前两行分别将每个 PDF 追加至新建的 PDF 文档中。最后一行是提交更改并在磁盘上创建最终 PDF。
已在指定位置创建了 PDF 文档,Python 窗口应如下图所示:
以下提供一些 arcpy.mapping 应用的简单示例:
替换图层的数据源。
遍历一系列数据框范围,查找并替换文本值,然后将页面布局导出至 PDF。
通过将 PDF 文档追加到最终产品的方式构建完整的地图册。
注:可对现有地图文档或图层文件执行更改,然后使用 MapDocument 或 Layer 对象上的 saveACopy 方法将这些更改保存至一个新文件。
常见的一种情景是创作一个不含图层的模板地图文档,然后使用 arcpy.mapping AddLayer、AddLayerToGroup 或 InsertLayer 函数向地图文档添加图层。如果图例元素已事先创作为自动将新项目添加到图例,则会自动出现图例项。
另一种常见情景涉及含对开页面的地图册。左侧和右侧页面各偏移一定的距离,以便为装订留出空间。该情景需要有两个地图文档:一个是左侧页面,另一个是右侧页面。使用 Arcpy.mapping 脚本逻辑将所有单个页面合到一起,形成最终的多页 PDF 输出。请参阅创建包含对开页面的地图册,该文档详细介绍了此情景并提供了 arcpy.mapping 代码示例。
mxd = arcpy.mapping.MapDocument("CURRENT") riverLyr = arcpy.mapping.ListLayers(mxd, "Rivers")[0] titleTxt = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "title")[0]
页面布局元素有一个独立属性,称为元素名称。可在元素的属性 对话框内的大小和位置 选项卡中对其进行设置。
数据框、图层和表不像页面布局元素那样具有独立的名称属性。它们的名称基于内容列表中显示的标注。理想情况下,将为同一地图文档内的所有数据框、图层和表给定唯一名称。如果出现需要有重复名称又不能将二者混淆的情况,那么您需要创作地图文档以使用其他属性进行区分。
以下代码显示了如何使用 Layer 对象的 description 属性对数据框“County Maps”中具有相同名称“Streets”的图层进行区分的示例。
讯享网mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd") df = arcpy.mapping.ListDataFrames(mxd, "County Maps")[0] for lyr in arcpy.mapping.ListLayers(mxd): if lyr.name == "Streets": if lyr.description == "1:10000": lyr.visible = True if lyr.description == "1:": lyr.visible = False
在以下示例中,结果布局将基于当前数据框比例显示不同样式的比例尺。如果比例大于 1:25,000,则比例尺单位将以米计。如果比例大于或等于 1:25,000,则比例尺单位将以千米计。
mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd") m_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "m scale bar")[0] km_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "km scale bar")[0] df = arcpy.mapping.ListDataFrames(mxd, "Main DF")[0] if df.scale < 25000: m_scale.elementPositionX = 5 #on the page km_scale.elementPostitionX = 15 #off the page else: m_scale.elementPositionX = 15 #off the page km_scale.elementPostitionX = 5 #on the page

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127281.html