前言:
ArcMap中的python环境是2.x,ArcGISPro的Python环境是3.x,3.x系列对中文字符的支持更好,如果用独立的python编辑器(例如:pycharm)使用中文字符时,不需要在脚本中去声明编码格式;同时测试时发现python3.x运行时速度要快很多。另外在pycharm中如何切换python版本,如下图:
1、缩放至图层
import arcpy
aprx = arcpy.mp.ArcGISProject(r"current")
m = aprx.listMaps()[0]
lyr = m.listLayers("北京各区县")[0]
lyt = aprx.listLayouts("Layout")[0]
mf = lyt.listElements("mapframe_element", "Map Frame")[0]
mf.camera.setExtent(mf.getLayerExtent(lyr, False, True))
import arcpy
aprx = arcpy.mp.ArcGISProject(r"D:\temp\pro\currentproject\Mapping\Mapping3.aprx")
m = aprx.listMaps()[0]
lyr = m.listLayers("北京各区县_1")[0]
lyt = aprx.listLayouts("Layout")[0]
mf = lyt.listElements("mapframe_element", "Map Frame")[0]
mf.camera.setExtent(mf.getLayerExtent(lyr, False, True))
aprx.saveACopy(r"D:\temp\pro\currentproject\Mapping\Mapping4.aprx")
del aprx
其中listElements()函数的解释如下:
listElements ({element_type}, {wildcard})
参数 | 说明 | 数据类型 |
element_type | 代表用于过滤已返回元素列表的元素类型的字符串。
(默认值为 None) | String |
wildcard | 通配符基于元素名称且不区分大小写。星号 (*) 和字符的组合可用于帮助限制生成的结果。 (默认值为 None) | String |
效果图:
参考链接:
https://pro.arcgis.com/zh-cn/pro-app/arcpy/mapping/camera-class.htm
https://pro.arcgis.com/zh-cn/pro-app/arcpy/mapping/layout-class.htm
2、图层符号化
arcmap中的符号是只读的,但是arcgispro中的符号是可以改写的,也就是arcmap中arcpy不能更换图层的符号化方法,但是arcgispro中的arcpy可以。那么如何实现呢?下述例子,讲述了如何更换图层的符号化方法。
import arcpy
myproject = arcpy.mp.ArcGISProject(r"E:\03 资料\python资料大全\python公开课资料\Python 数据处理与制图\demos\demo11\new.aprx")
maps = myproject.listMaps()
m = maps[1]
print(m.name)
for lyr in m.listLayers():
if lyr.isFeatureLayer:
sym = lyr.symbology
if hasattr(sym, 'renderer'):
if sym.renderer.type == 'SimpleRenderer':
sym.updateRenderer('GraduatedColorsRenderer')
sym.renderer.breakCount = 10
lyr.symbology = sym
mylayer = m.listLayers("主要公路4m")[0]
mysym = mylayer.symbology
colorreb=myproject.listColorRamps()[0]
if hasattr(mysym, 'renderer'):
# if mysym.renderer.type == 'SimpleRenderer':
mysym.updateRenderer('GraduatedColorsRenderer')
mysym.renderer.classificationField = 'Shape_Length'
mysym.renderer.breakCount = 20
mysym.renderer.colorRamp = colorreb
mylayer.symbology = mysym
myproject.saveACopy(r"E:\03 资料\python资料大全\python公开课资料\Python 数据处理与制图\demos\demo11\new111.aprx")
上述例子是将aprx中的第二个地图视图中的图层的符号化方法由默认的简单渲染更改为分级色彩,同时设置了分割数量,并且对“主要公路4m”图层进行单独处理,将其符号化的分类字段设置为shape_length,并且将色带设置为第一个色带。
3、对图层中的不同字段进行IDW插值
#2020-1-19
#对图层中的不同字段进行IDW插值
#
# -*-coding:utf-8-*-
import arcpy
from arcpy import env
env.workspace = r"D:\GPTOOL\空间插值气象站点数据\test.gdb"
inputFeaClsCName="气象数据201706"
outputRasterPath="D:/GPTOOL/output"
# 字段列表
fieldList = arcpy.ListFields(inputFeaClsCName)
# 遍历污染指标
for fld in fieldList:
# 判断图层要素记录的条数,如果少于3条则提示不能进行空间差值操作;
# 如果多余或者等于3条,那么可以进行空间插值操作
featureRecord = arcpy.GetCount_management(inputFeaClsCName)
featureRecordCount = int(featureRecord.getOutput(0))
if featureRecordCount <3 :
print(str(fld.name) + "图层" + "的要素记录少于3个,不能进行空间差值......")
break
if fld.name.upper() == "OBJECTID" or fld.name.upper() == "SHAPE" or fld.name.upper() == "SHAPE_LENGTH" or fld.name.upper() == "SHAPE_AREA"or fld.name == "sheng"or fld.name== "stationid"or fld.name == "name":
continue
else:
# 将当前遍历出的污染指标赋值给zField,用此作为空间插值的Z值
zField = fld.name
outLayer = "outLPI" + str(zField)
outRaster = outputRasterPath+ "/"+str(zField) + ".tif"
cellSize = 3
power = 2
# Set variables for search neighborhood
majSemiaxis = 250
minSemiaxis = 250
angle = 0
maxNeighbors = 15
minNeighbors = 10
sectorType = "ONE_SECTOR"
searchNeighbourhood = arcpy.SearchNeighborhoodStandard(majSemiaxis, minSemiaxis,
angle, maxNeighbors,
minNeighbors, sectorType)
# Check out the ArcGIS Geostatistical Analyst extension license
arcpy.CheckOutExtension("GeoStats")
# Execute IDW
arcpy.IDW_ga(inputFeaClsCName, zField, outLayer, outRaster, cellSize, power, searchNeighbourhood, "")
print("ok.......")
4、批量添加字段:将其它图层(图层A、B)的字段添加到另一图层(图层C)属性表中
https://blog.csdn.net/gislaozhang/article/details/104042653
5、Python工具箱中使用值表(GPValueTable)
https://blog.csdn.net/gislaozhang/article/details/104687007
6、二维矢量拉伸成三维
数据需要有z值
import arcpy
aprx = arcpy.mp.ArcGISProject("CURRENT")
# aprx = arcpy.mp.ArcGISProject("CURRENT")
for m in aprx.listMaps():
print("Map: " + m.name)
for lyr in m.listLayers():
print(" " + lyr.name)
if lyr.name=="汉街":
print("ok....")
lyr.extrusion('BASE_HEIGHT',"100")