arcpy.mapping常用四大件-Layer

by 李远祥

图层是地图里面非常重要的组成,几乎所有的制图显示都与图层有关。首先它是连接数据与符号渲染的重要桥梁,其次在出版地图中,图层又与图例关联在一起,当然,图层最重要的就是组织数据,数据的分类、上下叠加、标注的显示等等,全部都跟图层扯上关系。在arcpy.mapping 中,Layer是一个非常重要的类型,如果说MapDocument 是arcpy.mapping 的首要入口,那么Layer就是坐在mapping里面的VIP了。

在arcpy.mapping 中,Layer有两个地方可以进入,一是通过MapDocument –>dataFrame,二是直接通过.lyr文件进入。一般来说,第一种情况比较常用,基本上是针对某个地图文档某个或者多个图层进行自动化修改,其表现为细节修改。而通过lyr进入图层,更多的是希望通过在桌面软件完成某类图层的配置,然后整体更新或者插入到地图文档中,其表现为为粗放式修改。

想要知道Layer能做什么,最简单的就是看看它的属性和方法。属性是最常用的方式,通过查看起属性,基本上可以知道跟Layer关联的对象和功能有一些。关于Layer的属性和方法,只需要查看Esri官方帮助就行了,具体关于Layer的帮助,这里不列出来,连接地址点击这里。Layer的属性基本上可以是跟【图层属性】的标签页对应,包括数据源信息(datasetName、dataSource、workspacePath 均为只读)、标注(labelClasses、showLabels 均为只读)、常规属性如名称、可见比例等(name、maxScale、minScale 均为读写)、图层过滤(definitionQuery 读写)、图层类型判断(isFeatureLayer、isGroupLayer、isNetworkAnalystLayer、isRasterizingLayer、isRasterLayer、isServiceLayer 均为只读)、符号系统(symbology、symbologyType 均为只读)、时态(time 只读)。当然,这只是粗劣的分类,还有一些比较常用的就是visible、transparency 。

方法其实也不多,就是简单几个诸如获取图层范围(getExtent )、选择集合范围(getSelectedExtent 、setSelectionSet )、设置数据源(findAndReplaceWorkspacePath 、replaceDataSource )、保存图层(save 、saveACopy )、更新图层操作(updateLayerFromJSON )等,方法比属性要少得多,这也跟arcpy粗粒度的定位是有关的,但尽管如此,这些方法和属性也就基本覆盖了图层的所有操作了。

接下来可以看看官方的例子,通过.lyr文件去查找名为Highways图层,并修改让标注显示

import arcpy
lyrFile = arcpy.mapping.Layer(r"C:\Project\Data\Streets.lyr")
for lyr in arcpy.mapping.ListLayers(lyrFile):
    if lyr.name.lower() == "highways":
        lyr.showLabels = True
        lyr.saveACopy(r"C:\Project\Data\StreetsWithLabels.lyr")
del lyrFile

但实际上,我们更多的希望直接修改的是mxd文档,所以,获取图层的方式就是不能采用lyr的方式了,而是采用dataframe进入,当然,那还需要配合ListDataFrames获取dataframe,通过ListLayers获取图层列表,代码如下

#coding=gbk
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\PythonTest\change.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "图层")[0]
#对第一个图层进行修改
lyrs=arcpy.mapping.ListLayers(mxd, "", df)
for layer in lyrs:
    if layer.name.lower() == "highways":
        layer.showLabels = True
mxd.save()
del mxd

可见,对于修改图层的设置,都是相对简单的。其他的诸如name、maxScale、minScale 、visible、transparency、definitionQuery  这些可以读写的属性,都可以直接进行设置了。

例如对图层标注进行更深层次的设置,前面提及到的labelClasses属性,虽然不能对其进行整体的替换赋新的labelClasses对象,但labelClasses本身的属性还是可以进行修改的,例如要将第一个图层的标注设置为由CITY_NAME_CNTRY_NAME 这样由两个字段组合显示,则可以通过labelClasses的expression进行修改,这个expression在labelClasses中却是可读写的属性哦。如下代码

#coding=gbk
##修改label的显示字段
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\PythonTest\change.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "图层")[0]
#对第一个图层进行修改
lyr = arcpy.mapping.ListLayers(mxd, "", df)[0]
lyr.showLabels = True
lyr.labelClasses[0].expression  = '[CITY_NAME] +"_"+[CNTRY_NAME]'
#保存结果
mxd.save()

由此可见,上面提及到的Layer的属性,并不是传统的只能获取信息的只读模式,只是说禁止对该项属性进行重新赋值对象,但属性对象内部的可读写设置还是可以生效的。这就给Layer带来了非常多的可设置方式了。例如原来是使用了Name作为唯一值进行渲染的,现在采用dis字段作为唯一值,通过arcpy代码也是很好的制作,如下代码

处理代码如下

#coding=gbk
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\PythonTest\change.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "图层")[0]
lyr = arcpy.mapping.ListLayers(mxd,"",df)[1]
if lyr.symbologyType == "UNIQUE_VALUES":
  lyr.symbology.valueField = "Dis"
  lyr.symbology.addAllValues()
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
mxd.save()
del mxd

再来看最终的执行结果,已经按照dis进行了唯一值的重新渲染。

symbologyType不过类似这类型的设置可要注意了,为什么要先判断一下symbologyType ,那是因为前面也交代过,symbologyType和symbology对于Layer来说,都是只读的属性,所以,图层的渲染类型是不能再Layer这里修改的,但能够修改这些固定类型下的属性。所以,如果要做唯一值渲染,那就必须图层本身就是采用了唯一值渲染。其他的渲染模式设置也是一样,只能在设定的渲染模式下修改,而不能直接更改渲染模式。例如图层本身就是单一符号渲染的,是不能修改为唯一值渲染的。估计很多人对这种设置不能理解,包括笔者在内,开放渲染类型的修改其实并不困难,也不知道Esri在这方面到底是怎么个想法。

还有就是isFeatureLayer、isGroupLayer、isNetworkAnalystLayer、isRasterizingLayer、isRasterLayer、isServiceLayer 这几个判读图层类型的属性,看起来没起多大的作用,实际上在跟一些操作方法进行对接的时候,能够很好的控制一些这些操作能否执行。例如使用了ListLayers 方法去获取图层列表,就会将所有的图层都获取过来,如果需要设置数据源的话,组合图层是没有改方法的,不加判断的情况下,会导致程序直接报错而崩溃。所以,不要小看了这些非常细微的判读属性,它们对于逻辑操作是有极大的作用的。

总结:

在Layer对象里面,基本上能够对图层的设置做一些细微的调整,以达到ArcMap界面的一些常规修改。修改的部分更多的集中在其属性部分,而非其方法。所以,要用好Layer对象,还需要了解其关联的属性对象的一些设置很实用。

arcpy.mapping常用四大件-Layer的更多相关文章

  1. arcpy.mapping常用四大件-StyleItem

    arcpy.mapping常用四大件-StyleItem by 李远祥 StyleItem 笔者将其归类到arcpy.mapping的四大件当中,主要是因为它的独特之处,就是其能力是直接读取.styl ...

  2. arcpy.mapping常用四大件-MapsurroundElement

    arcpy.mapping常用四大件-MapsurroundElement by 李远祥 在arcpy.mapping 中,除了数据入口MapDocument.图层Layer之外,另一重要的角色就是M ...

  3. arcpy.mapping常用四大件-MapDocument

    arcpy.mapping常用四大件-MapDocument by 李远祥 点开arcpy.mapping的帮助,可以看到其有限的几个类,看起来东西不是很多,但却是非常的使用.由于arcpy定位就是粗 ...

  4. 【281】◀▶ arcpy.mapping 常用类说明

    arcpy.mapping 教程入门 arcpy.mapping 指导原则 按字母顺序排序的 arcpy.mpping 类列表 按字母顺序排序的 arcpy.mpping 函数列表 按字母顺序排序的 ...

  5. 【282】◀▶ arcpy.mapping 常用函数说明

    arcpy.mapping 教程入门 arcpy.mapping 指导原则 按字母顺序排序的 arcpy.mpping 类列表 按字母顺序排序的 arcpy.mpping 函数列表 按字母顺序排序的 ...

  6. arcpy.mapping实战-专题图制图自动化

    arcpy.mapping实战-专题图制图自动化 by 李远祥 最初对arcpy.mapping感兴趣是因为一次大规模的专题地图调整的需要,由于某某单位利用ArcEngine编写的专题图出图系统,出现 ...

  7. 使用arcpy.mapping模块批量出图

      出图是项目里常见的任务,有的项目甚至会要上百张图片,所以批量出土工具很有必要.arcpy.mapping就是ArcGIS里的出图模块,能快速完成一个出图工具. arcpy.mapping模块里常用 ...

  8. 按字母顺序排序的 arcpy.mapping 类列表

    arcpy.mapping 类可使用地图文档 (.mxd) 或图层文件 (.lyr) 中的不同对象类型的各种方法和属性.此文档可专门用作快速参考.有关详细信息,请使用链接跳转至各帮助页面. arcpy ...

  9. 使用arcpy.mapping 更新和修复数据源

    来自:https://blog.csdn.net/gisinfo/article/details/6675390 在许多情况下,您都可能需要修复数据源或重定向数据源至其他位置.然而,如果是在每个相关的 ...

随机推荐

  1. Java笔记(二)

    10.   public protected default private 同一个类中 √ √ √ √ 同一个包中 √ √ √   子类 √ √     不同包中 √       11. 线程: s ...

  2. sublime C++ build system配置体验

    近期准备实习,于是终于步入了sublime的阵营,sublime确实性感. 在配置win7下C++编译运行集成环境的时候遇到点问题,于是接触了一下JSON格式,最后终于自己搞定了.. 参考文档:htt ...

  3. [Unity Quaternion]四元数Quaternion的计算方式

    什么是Quaternion四元数 1843年,William Rowan Hamilton发明了四元数,但直到1985年才有一个叫Ken Shoemake的人将四元数引入计算机图形学处理领域.四元数在 ...

  4. Nutch是个不错的选择

    对搜索引擎的理解:我们并没有google 的源代码,因此学习搜索引擎Nutch是个不错的选择.了解一个大型分布式的搜索引擎如何工作是一件让人很受益的事情.在写 Nutch的过程中,从学院派和工业派借鉴 ...

  5. iOS设置状态栏的字体颜色

    设置statusBar的[前景色部分] 1.plist设置statusBar 在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),这里可以设置 ...

  6. mysql 隔离级别与锁

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  7. 手机端 H5上传头像

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. java实现——008旋转数组的最小数字

    public class T008 { public static void main(String[] args) { int[] num = { 3, 4, 5, 1, 2 }; System.o ...

  9. VS2013 opencv2.4.8

    [转]http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html vs2010+opencv2.4.0:http://www ...

  10. CreateForm(

    /// <summary> /// 打开新的子窗体 /// </summary> /// <param name="strName">窗体的类名 ...