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 在许多情况下,您都可能需要修复数据源或重定向数据源至其他位置.然而,如果是在每个相关的 ...
随机推荐
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- CI框架学习——检查用户名与密码是否合法(二)
检查用户名与密码是否合法 步骤一.编写用户登录的窗体见下面内容 步骤二.编写数据库校验方法 $username = $_POST["username"]; # ...
- hadoop+海量数据面试题汇总(二)
何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储.处理.操作.何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存. 那解决办法呢 ...
- iOS 的三种自建证书方法https请求相关配置
如果你的app服务端安装的是SLL颁发的CA,可以使用系统方法直接实现信任SSL证书,关于Apple对SSL证书的要求请参考:苹果官方文档CertKeyTrustProgGuide 这种方式不需要在B ...
- Objective C HMAC-MD5
- (NSString*) HMACWithSecret:(NSString*) secret andString:(NSString *)str { unsigned long encode = C ...
- 怎样判断iOS App是通过哪种途径启动的?
http://www.cnblogs.com/daguo/p/3759514.html - (BOOL)application:(UIApplication *)application didFini ...
- BCB实现BMP图片的RGB分解(转)
源:BCB实现BMP图片的RGB分解 1.打开BMP图片文件,在Image控件中显示: if(dlgOpen1->Execute()) { edt1->Text=dlgOpen1-> ...
- 企业证书APP发布流程
企业发布app的 过程比app store 发布的简单多了,没那么多的要求,哈 但是整个工程的要求还是一样,比如各种像素的icon啊 命名规范啊等等. 下面是具体的流程 1.修改你的 bundle i ...
- iOS中UITextField 使用全面解析
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...
- Max Sum of Rectangle No Larger Than K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...