模块
ArcPy中的模块按照功能进行分类,主要包括:包括数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块 模块 (arcpy.sa) 以及 ArcGIS Network Analyst 扩展模块 模块 (arcpy.na)。
导入ArcPy
ArcPy存在于模块arcpy中,要想使用ArcPy,必须在使用时导入arcpy:
import arcpy
当然,还有一个必不可少的条件就是需要先打开Liscense。但是打开Liscense也不代表许可有效,我们还可以通过代码检查许可是否有效:
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()来获取当前产品的编码名称。
环境-arcpy.env
环境主要是指对地理处理结果的一些附属参数,包括工作空间、范围、坐标系等等。这些参数与正常的工具参数是不不同的,环境的设置是全局性的。
环境设置是通过env
来设置的,例如设置工作空间:
# 设置工作空间
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等。
常用函数
获取元数据-arcpy.Describe
ArcGIS官方对于arcpy.Describe
定义是描述一个数据,其实就是获取数据的元数据,例如:数据名、投影、MBR范围等。其定义非常简单:
Describe(value)
只需要你给个value,arcpy九江为你返回一个关于该value相关方元数据信息。对于不同类型的value,其返回值的类型不同。关于返回值的类型,具体可以在https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-functions/arcinfo-item-properties.htm进行查看。
从Describe的返回值获取元数据,只需要访问其属性即可:
desc = arcpy.Describe(xxx)
print(desc.name)
print(desc.spatialReference.name)
print(desc.extent.XMin)
获取所有字段-arcpy.ListFields
arcpy.ListFields
是用来查看数据的所有字段名的,其定义如下:
ListFields(dataset, {wild_card}, {field_type})
- dataset——字符串,要查看字段的数据源
- wild_card——字符串,用来过滤字段名的字符串,可以使用通配符。
- 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属性获取字段类型。
获取工作空间内所有要素类-arcpy.ListFeatureClasses
arcpy.ListFeatureClasses
用于列出工作空间中的要素类,因此在使用此函数前必须先设置arcpy.env.workspace
,其定义如下:
ListFeatureClasses({wild_card}, {feature_type}, {feature_dataset})
- wild_card——字符串,用来过滤字段名的字符串,可以使用通配符。
- feature_type——字符串,要素类型,包括以下值:
- Annotation —仅返回注记要素类。
- Arc —仅返回弧(或线)要素类。
- Dimension —仅返回尺寸要素类。
- Edge —仅返回边要素类。
- Junction —仅返回交汇点要素类。
- Label — 仅返回标注要素类。
- Line —仅返回线(或弧)要素类。
- Multipatch —仅返回多面体要素类。
- Node —仅返回节点要素类。
- Point —仅返回点要素类。
- Polygon —仅返回面要素类。
- Polyline —仅返回线(或弧)要素类。
- Region —仅返回区域要素类。
- Route —仅返回路径要素类。
- Tic —仅返回控制点要素类。
- All — 工作空间中的所有数据集。这是默认值。
- Annotation —仅返回注记要素类。
feature_dataset——字符串,若指定,则限制返回到要素数据集的要素类。若留空,则在工作空间中将仅返回独立要素类。
删除利器-arcpy.Delete_management
如果我们需要删除shapefile,直接使用python来删除可能会比较麻烦。shapefile包括一组文件,至少包括主文件.shp、索引文件.shx、属性文件.dbf。因此,如果我们想要删除一个shapefile,就要把这些文件全部删除,通过python的os模块就需要一个一个文件的删除。如果使用
arcpy.Delete_management
来实现就会比较简单,使用arcpy.Delete_management
仅需要指定.shp文件路径即可。arcpy.Delete_management
的定义如下:arcpy.Delete_management(out_data, data_type)
其中,in_data是指要删除的要删除数据,如果我们要删除某个shapefile,则只需要如下使用即可:
arcpy.Delete_management(r"x:\folder\a.shp")
如果in_data为目录,则整个目录都将被删除。
arcpy.Delete_management
还可以删除内存工作空间的的数据集:arcpy.Delete_management("in_memory")
坐标系对象-
arcpy.SpatialReference
对用空间数据而已,没有坐标系所有的几何坐标信息都没有意义。arcpy声明一个坐标系使用
arcpy.SpatialReference
函数:SpatialReference({item})
item有三种可选类型的值:
坐标系名,例如
arcpy.SpatialReference('WGS 1984')
- 投影文件 (.prj),例如
arcpy.SpatialReference(r"x:\folder\a.prj")
- 使用坐标系工厂代码(或权限代码)代码,例如:
arcpy.SpatialReference(4326)
关于第三点,个人觉得这个代码就是EPSG代码,使用4326、3857、4490分别声明一个坐标系,然后获取其name属性,得到如下结果:
>>> 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可以这个数据中获取到坐标系,例如:
arcpy.CreateFeatureclass_management(dir_name, out_name=new_shp_name, geometry_type='Point', spatial_reference= r'x:\folder\a.shp')