arcpy.mapping常用四大件-Layer
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 arcpylyrFile = arcpy.mapping.Layer(r"C:\Project\Data\Streets.lyr")for lyr in arcpy.mapping.ListLayers(lyrFile):if lyr.name.lower() == "highways":lyr.showLabels = Truelyr.saveACopy(r"C:\Project\Data\StreetsWithLabels.lyr")del lyrFile
但实际上,我们更多的希望直接修改的是mxd文档,所以,获取图层的方式就是不能采用lyr的方式了,而是采用dataframe进入,当然,那还需要配合ListDataFrames获取dataframe,通过ListLayers获取图层列表,代码如下
#coding=gbkimport arcpymxd = 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 = Truemxd.save()del mxd
可见,对于修改图层的设置,都是相对简单的。其他的诸如name、maxScale、minScale 、visible、transparency、definitionQuery 这些可以读写的属性,都可以直接进行设置了。
例如对图层标注进行更深层次的设置,前面提及到的labelClasses属性,虽然不能对其进行整体的替换赋新的labelClasses对象,但labelClasses本身的属性还是可以进行修改的,例如要将第一个图层的标注设置为由CITY_NAME_CNTRY_NAME 这样由两个字段组合显示,则可以通过labelClasses的expression进行修改,这个expression在labelClasses中却是可读写的属性哦。如下代码
#coding=gbk##修改label的显示字段import arcpymxd = arcpy.mapping.MapDocument(r"C:\PythonTest\change.mxd")df = arcpy.mapping.ListDataFrames(mxd, "图层")[0]#对第一个图层进行修改lyr = arcpy.mapping.ListLayers(mxd, "", df)[0]lyr.showLabels = Truelyr.labelClasses[0].expression = '[CITY_NAME] +"_"+[CNTRY_NAME]'#保存结果mxd.save()
由此可见,上面提及到的Layer的属性,并不是传统的只能获取信息的只读模式,只是说禁止对该项属性进行重新赋值对象,但属性对象内部的可读写设置还是可以生效的。这就给Layer带来了非常多的可设置方式了。例如原来是使用了Name作为唯一值进行渲染的,现在采用dis字段作为唯一值,通过arcpy代码也是很好的制作,如下代码

处理代码如下
#coding=gbkimport arcpymxd = 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的更多相关文章
- arcpy.mapping常用四大件-StyleItem
arcpy.mapping常用四大件-StyleItem by 李远祥 StyleItem 笔者将其归类到arcpy.mapping的四大件当中,主要是因为它的独特之处,就是其能力是直接读取.styl ...
- arcpy.mapping常用四大件-MapsurroundElement
arcpy.mapping常用四大件-MapsurroundElement by 李远祥 在arcpy.mapping 中,除了数据入口MapDocument.图层Layer之外,另一重要的角色就是M ...
- arcpy.mapping常用四大件-MapDocument
arcpy.mapping常用四大件-MapDocument by 李远祥 点开arcpy.mapping的帮助,可以看到其有限的几个类,看起来东西不是很多,但却是非常的使用.由于arcpy定位就是粗 ...
- 【281】◀▶ arcpy.mapping 常用类说明
arcpy.mapping 教程入门 arcpy.mapping 指导原则 按字母顺序排序的 arcpy.mpping 类列表 按字母顺序排序的 arcpy.mpping 函数列表 按字母顺序排序的 ...
- 【282】◀▶ arcpy.mapping 常用函数说明
arcpy.mapping 教程入门 arcpy.mapping 指导原则 按字母顺序排序的 arcpy.mpping 类列表 按字母顺序排序的 arcpy.mpping 函数列表 按字母顺序排序的 ...
- arcpy.mapping实战-专题图制图自动化
arcpy.mapping实战-专题图制图自动化 by 李远祥 最初对arcpy.mapping感兴趣是因为一次大规模的专题地图调整的需要,由于某某单位利用ArcEngine编写的专题图出图系统,出现 ...
- 使用arcpy.mapping模块批量出图
出图是项目里常见的任务,有的项目甚至会要上百张图片,所以批量出土工具很有必要.arcpy.mapping就是ArcGIS里的出图模块,能快速完成一个出图工具. arcpy.mapping模块里常用 ...
- 按字母顺序排序的 arcpy.mapping 类列表
arcpy.mapping 类可使用地图文档 (.mxd) 或图层文件 (.lyr) 中的不同对象类型的各种方法和属性.此文档可专门用作快速参考.有关详细信息,请使用链接跳转至各帮助页面. arcpy ...
- 使用arcpy.mapping 更新和修复数据源
来自:https://blog.csdn.net/gisinfo/article/details/6675390 在许多情况下,您都可能需要修复数据源或重定向数据源至其他位置.然而,如果是在每个相关的 ...
随机推荐
- lvs(+keepalived)、haproxy(+heartbeat)、nginx 负载均衡的比较分析
目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实现的负载均衡的作用,keepalived和heartbeat都是提高高可用性的,避免单点故障.那么他们为什么这么搭配,而又有什么 ...
- mysql--学生课程成绩表
创建表student: CREATE TABLE `student` ( `sid` INT(11) NOT NULL AUTO_INCREMENT, `sname` VARCHAR(20) NOT ...
- Nginx 在configure时的参数
Nginx 使用 Unix 下常用的 './configure && make && make install' 过程来编译安装. configure 脚本确定系统所具 ...
- Elasticsearch基础教程
Reference: http://blog.csdn.net/cnweike/article/details/33736429 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概 ...
- 3)Java学习笔记:内部类
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- JS拖动技术--- 关于setCapture
<script type="text/javascript"> <!-- window.onload=function(){ objDiv = documen ...
- Add Strings Leetcode
Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...
- codeforces 755D. PolandBall and Polygon
D. PolandBall and Polygon time limit per test 4 seconds memory limit per test 256 megabytes input st ...
- PHP分页类,支持自定义样式,中间5页
<?php //namespace Component; /** * 2016-3-27 * @author ankang */ class Page { private $ShowPage; ...
- 清除delphi 控件DBgrid 的记录
http://blog.csdn.net/windhaunting/article/details/4751560 1.TTable(DBGrid1.DataSource.DataSet).Empty ...