【Arcpy】基于Python的arcgis编程秘籍

管理地图文档和图层

打开地图文档

import arcpy.mp as map
#打开工程文件
aprx=map.ArcGISProject("CURRENT")
#读取地图
Mxd=aprx.listMaps()[0]
#修改地图名称
Mxd.name="Crime Project"
#保存副本
aprx.saveACopy("Crime_copy.aprx")

获取地图内的图层列表

#获取地图内的图层列表
layers=Mxd.listLayers()
for lyr in layers:
    print(lyr.name)

添加要素

import arcpy.mp as map
#打开工程文件
aprx=map.ArcGISProject("CURRENT")
#读取地图
Mxd=aprx.listMaps()[0]
#添加底图
Mxd.addBasemap("中国地图彩色版")
#添加shp图层
Mxd.addDataFromPath("D:\个人资料\Arcpy\ProgrammingPro\Databases\Trippville_GIS.gdb\\Floodplains")
#添加lyrx图层文件
lyr = map.LayerFile(r"D:\个人资料\Arcpy\ProgrammingPro\Databases\Zoning.lyrx")
Mxd.addLayer(lyr)

自动化制图

符号系统

简单符号系统

读取某一要素,为简单符号;改变其颜色、轮廓和尺寸

import arcpy.mp as map
try:
    aprx = map.ArcGISProject("CURRENT")
    for m in aprx.listMaps("Map"):
        for lyr in m.listLayers("Parcels"):
            if lyr.isFeatureLayer:
                sym = lyr.symbology
                #按名称设置
                sym.renderer.symbol.applySymbolFromGallery("机场跑道")
                #改变颜色
                sym.renderer.symbol.color ={'RGB': [255, 255, 190, 25]}
                #轮廓颜色
                sym.renderer.symbol.outlineColor ={'CMYK': [25, 50, 75, 25, 100]}
                #尺寸
                sym.renderer.symbol.size = 1.0
                lyr.symbology = sym
except Exception as e:
    print("Error: " + e.args[0])

渐变符号系统

1,列出工程已有的色带

aprx = arcpy.mp.ArcGISProject('CURRENT')
#列出色带名称
for cr in aprx.listColorRamps():
    print(cr.name)

2,设置分级色彩

import arcpy.mp as map
try:
    aprx=map.ArcGISProject("CURRENT")
    for m in aprx.listMaps("Map"):
        for lyr in m.listLayers("Parcels"):
            if lyr.isFeatureLayer:
                sym=lyr.symbology
                #设置渲染器
                sym.updateRenderer("GraduatedColorsRenderer")
                #渲染字段
                sym.renderer.classificationField = 'ACRES'
                #分类方法
                sym.renderer.classificationMethod ='NaturalBreaks'
                #类数
                sym.renderer.breakCount = 5
                sym.renderer.colorRamp =aprx.listColorRamps("热点图:深品红-黄")[0]
                lyr.symbology = sym
except Exception as e:
    print("ERROE:"+e.arg[0])

唯一值符号系统

import arcpy.mp as map
try:
    aprx=map.ArcGISProject("CURRENT")
    for m in aprx.listMaps("Streets and Railroads"):
        for lyr in m.listLayers("Street_Centerlines"):
            if lyr.isFeatureLayer:
                sym=lyr.symbology
                #设置渲染器
                sym.updateRenderer("UniqueValueRenderer")
                #渲染字段
                sym.renderer.fields = ['Condition']
                #读取每个字段,赋予不同的颜色
                for grp in sym.renderer.groups:
                    for itm in grp.items:
                        if itm.label == "Poor":
                            itm.symbol.color = {"RGB":[255, 0, 0, 100]}
                        elif itm.label == "Fair":
                            itm.symbol.color = {"RGB":[0, 92, 230, 100]}
                        elif itm.label == "Good":
                            itm.symbol.color = {"RGB":[38, 115, 0, 100]}
                lyr.symbology = sym
except Exception as e:
    print("ERROE:"+e.arg[0])

格式化标注

import arcpy
#导入当前工程文件
p = arcpy.mp.ArcGISProject('CURRENT')
#引用工程中的单个页面布局
m = p.listMaps("Crime Project")[0]
#引用页面布局中的't_x5'图层
l = m.listLayers('Building_Permits')[0]
sym = l.symbology
#渲染器:栅格类用colorizer 矢量类用renderer

#设置符号小数点
Labels=sym.renderer.classBreaks
for i in range(len(Labels)):
    #label获取并设置分类间隔的标注。
    L=Labels[i].label.split(" - ")
    Label=str(round(float(L[0]),3))+" - "+str(round(float(L[1]),3))
    Labels[i].label=Label

#修改要素符号
l.symbology = sym

布局管理

修改布局范围

 #读取图层
 lyr= m.listLayers('Burglaries_2009')[0]
 #更新布局视图范围
 mf =lyt.listElements('MAPFRAME_ELEMENT')[0]
 mf.camera.setExtent(mf.getLayerExtent())

缩放到所选要素

 #从fc中选择要素
 arcpy.SelectLayerByAttribute_management(fc, "NEW_SELECTION", "格网ID = " + str(i))
 
 #读取布局
 lyt = aprx.listLayouts("Park Layout")[0]
 #读取布局中地图框
 mf = lyt.listElements("MAPFRAME_ELEMENT")[0]
 
 #缩放至选择的要素
 mf.zoomToAllLayers(True)

#平移
#读取MAP地图中的要素
parcelLyr = m.listLayers("Parcels")[0]
#平移要素
ext = mf.getLayerExtent(parcelLyr,True)
mf.panToExtent(ext)

#导出JPEG,DPI400,高清格式
lyt.exportToJPEG(outFile,400,8,100,True)

修改标注

 #修改标题
 title = layout.listElements("TEXT_ELEMENT", "标题")[0]
 title.text = "%s边界图" % name[0:3]
 #修改下标日期
 day_title = layout.listElements("TEXT_ELEMENT", "日期")[0]
 day_title.text = "%s年%s月%s日制" % (datetime.today().year, datetime.today().month, datetime.today().day)

修改图例

可以先修改图例的文本符号,大小、字体;后面批量操作可以直接继承

import arcpy
#导入当前工程文件
p = arcpy.mp.ArcGISProject('CURRENT')
#读取布局
lyt = p.listLayouts()[0]
#读取布局中图例
legend = lyt.listElements()[0]
legend.title 
#修改图例项的可见性
for itm in legend.items:
  itm.patchHeight = 16
  itm.patchWidth = 30
itm
  if itm.name != 'Building_Permits':
    itm.visible = False

自动制图

如下代码,是对’t_x5’图层制图的;只需加个循环即可对所有要素进行批量输出。

import arcpy
#导入当前工程文件
p = arcpy.mp.ArcGISProject('CURRENT')
#引用工程中的单个页面布局
m = p.listMaps('地图')[0]
#引用页面布局中的't_x5'图层
l = m.listLayers('t_x5')[0]
sym = l.symbology
#渲染器:栅格类用colorizer 矢量类用renderer
#修改色带,分类方法,分类数,直接中文
sym.updateRenderer('GraduatedColorsRenderer')
sym.renderer.colorRamp =p.listColorRamps("预测")[0]
sym.renderer.classificationMethod="EqualInterval"
sym.renderer.breakCount=4

#符号类型
print(sym.renderer.type)
#分类字段
print(sym.renderer.classificationField)
#分为几类
print(sym.renderer.breakCount)
#色带名称,空值,名称不会随渲染器或着色器保留
print(sym.renderer.colorRamp.name)


#设置符号小数点
Labels=sym.colorizer.classBreaks
for i in range(len(Labels)):
    L=Labels[i].label.split(" - ")
    Label=str(round(float(L[0]),3))+" - "+str(round(float(L[1]),3))
    Labels[i].label=Label

#修改要素符号
l.symbology = sym

#获取当前布局
lyt = p.listLayouts("布局")[0]
#导出图片
lyt.exportToPNG("A.png", 300)

你可能感兴趣的:(Arcpy,arcgis)