1.模块
ArcPy中的模块按照功能进行分类,主要包括:包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块 模块 (arcpy.sa) 以及 ArcGIS Network Analyst 扩展模块 模块 (arcpy.na)。
2.导入ArcPy
ArcPy存在于模块arcpy中,要想使用ArcPy,必须在使用时导入arcpy:
1 | `import arcpy` |
当然,还有一个必不可少的条件就是需要先打开Liscense。但是打开Liscense也不代表许可有效,我们还可以通过代码检查许可是否有效:
1 | `arcpy.CheckProduct("ArcInfo") == "Available"` |
ArcInfo是产品编码名称,指代于 ArcGIS for Desktop Advanced,CheckProduct返回的值是Available,则代表可以使用ArcGIS for Desktop Advanced。产品编码名称有如下值:
- ArcView(等效于 ArcGIS for Desktop Basic 许可)
- ArcEditor(等效于 ArcGIS for Desktop Standard 许可)
- ArcInfo(等效于 ArcGIS for Desktop Advanced 许可)
- Engine
- EngineGeoDB
- ArcServer
你可以通过**arcpy.ProductInfo()**来获取当前产品的编码名称。
3.环境-arcpy.env
环境主要是指对地理处理结果的一些附属参数,包括工作空间、范围、坐标系等等。这些参数与正常的工具参数是不不同的,环境的设置是全局性的。
环境设置是通过env来设置的,例如设置工作空间:
1 | `# 设置工作空间 arcpy.env.workspace = r"C:\Users\YaO\Documents\ArcGIS\Default.gdb"` |
这样,当读取数据或者创建数据时,如果仅仅指定了文件名,未指定文件所在的目录(文件夹)时,将会从arcpy.env.workspace所在设置的目录中进行进行读取。
arcpy.env有很多属性值,其和ArcGIS Desktop地理处理菜单下的环境设置是相对应的。你可以在https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-classes/env.htm看到完整的列表,常用一般有extent、workspace、overwriteOutput等。
4.常用函数
4.1.获取元数据-arcpy.Describe
ArcGIS官方对于arcpy.Describe定义是描述一个数据,其实就是获取数据的元数据,例如:数据名、投影、MBR范围等。其定义非常简单:
1 | `Describe(value)` |
只需要你给个value,arcpy九江为你返回一个关于该value相关方元数据信息。对于不同类型的value,其返回值的类型不同。关于返回值的类型,具体可以在https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-functions/arcinfo-item-properties.htm进行查看。
从Describe的返回值获取元数据,只需要访问其属性即可:
1 | `desc = arcpy.Describe(xxx) print(desc.name) print(desc.spatialReference.name) print(desc.extent.XMin)` |
4.2.获取所有字段-arcpy.ListFields
arcpy.ListFields是用来查看数据的所有字段名的,其定义如下:
1 | `ListFields(dataset, {wild_card}, {field_type})` |
1.
dataset——字符串,要查看字段的数据源
2.
wild_card——字符串,用来过滤字段名的字符串,可以使用通配符。
3.
field_type——字符串,显示字段的类型其值有以下类型:
-
All — 返回所有字段类型。这是默认设置。
-
BLOB —仅返回 BLOB 字段类型。
-
Date —仅返回日期字段类型。
-
Double —仅返回双精度字段类型。
-
Geometry —仅返回几何字段类型。
-
GlobalID —仅返回 GlobalID 字段类型。
-
GUID —仅返回 GUID 字段类型。
-
Integer —仅返回整型字段类型。
-
OID —仅返回 OID 字段类型。
-
Raster —仅返回栅格字段类型。
-
Single —仅返回单精度字段类型。
-
SmallInteger —仅返回短整型字段类型。
-
String —仅返回字符串字段类型。
引用自:https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-functions/listfields.htm
arcpy.ListFields返回的是Field对象列表,可以通过其name属性获取字段名,通过type属性获取字段类型。
4.3.获取工作空间内所有要素类-arcpy.ListFeatureClasses
arcpy.ListFeatureClasses用于列出工作空间中的要素类,因此在使用此函数前必须先设置arcpy.env.workspace,其定义如下:
1 | `ListFeatureClasses({wild_card}, {feature_type}, {feature_dataset})` |
1.
wild_card——字符串,用来过滤字段名的字符串,可以使用通配符。
2.
feature_type——字符串,要素类型,包括以下值:
-
Annotation —仅返回注记要素类。
-
Arc —仅返回弧(或线)要素类。
-
Dimension —仅返回尺寸要素类。
-
Edge —仅返回边要素类。
-
Junction —仅返回交汇点要素类。
-
Label — 仅返回标注要素类。
-
Line —仅返回线(或弧)要素类。
-
Multipatch —仅返回多面体要素类。
-
Node —仅返回节点要素类。
-
Point —仅返回点要素类。
-
Polygon —仅返回面要素类。
-
Polyline —仅返回线(或弧)要素类。
-
Region —仅返回区域要素类。
-
Route —仅返回路径要素类。
-
Tic —仅返回控制点要素类。
-
All — 工作空间中的所有数据集。这是默认值。
3.
feature_dataset——字符串,若指定,则限制返回到要素数据集的要素类。若留空,则在工作空间中将仅返回独立要素类。
4.4.删除利器-arcpy.Delete_management
如果我们需要删除shapefile,直接使用python来删除可能会比较麻烦。shapefile包括一组文件,至少包括主文件.shp、索引文件.shx、属性文件.dbf。因此,如果我们想要删除一个shapefile,就要把这些文件全部删除,通过python的os模块就需要一个一个文件的删除。如果使用arcpy.Delete_management来实现就会比较简单,使用arcpy.Delete_management仅需要指定.shp文件路径即可。arcpy.Delete_management的定义如下:
1 | `arcpy.Delete_management(out_data, data_type)` |
其中,in_data是指要删除的要删除数据,如果我们要删除某个shapefile,则只需要如下使用即可:
1 | `arcpy.Delete_management(r"x:\folder\a.shp")` |
如果in_data为目录,则整个目录都将被删除。arcpy.Delete_management还可以删除内存工作空间的的数据集:
1 | `arcpy.Delete_management("in_memory")` |
4.5.坐标系对象-arcpy.SpatialReference
对用空间数据而已,没有坐标系所有的几何坐标信息都没有意义。arcpy声明一个坐标系使用arcpy.SpatialReference函数:
1 | `SpatialReference({item})` |
item有三种可选类型的值:
1.
坐标系名,例如arcpy.SpatialReference('WGS 1984')
2.
投影文件 (.prj),例如arcpy.SpatialReference(r"x:\folder\a.prj")
3.
使用坐标系工厂代码(或权限代码)代码,例如:arcpy.SpatialReference(4326)
关于第三点,个人觉得这个代码就是EPSG代码,使用4326、3857、4490分别声明一个坐标系,然后获取其name属性,得到如下结果:
1 | `>>> arcpy.SpatialReference(4326).name u'GCS_WGS_1984' >>> arcpy.SpatialReference(3857).name u'WGS_1984_Web_Mercator_Auxiliary_Sphere' >>> arcpy.SpatialReference(4490).name u'GCS_China_Geodetic_Coordinate_System_2000'` |
而4326、3857、4490则正是WGS 1984坐标系、Web墨卡托投影和中国大地2000坐标系。EPSG代码则可以在epsg.io上进行搜索。
此外,如果我们再使用arcpy的工具时,如果想要指定一个坐标系与现有数据的坐标系一致,可以直接将现有的数据赋值过去,arcpy可以这个数据中获取到坐标系,例如:
1 | `arcpy.CreateFeatureclass_management(dir_name, out_name=new_shp_name, geometry_type='Point', spatial_reference= r'x:\folder\a.shp')` |