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对象,还需要了解其关联的属性对象的一些设置很实用。

时间: 2024-10-13 03:19:44

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

arcpy.mapping常用四大件-MapsurroundElement

by 李远祥 在arcpy.mapping 中,除了数据入口MapDocument.图层Layer之外,另一重要的角色就是MapsurroundElement.MapsurroundElement直接关系的就是地图的整饰元素.只要凑齐上述的这三大件,ArcGIS的制图自动化基本上就可以实现了. 地图的整饰元素有很多,例如文本(标题及其他说明).图例.比例尺.指北针.图片.外加图形等.利用arcpy.mapping 的MapsurroundElement类,可以做到对这些元素的布局进行精确的排布.

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

by 李远祥 最初对arcpy.mapping感兴趣是因为一次大规模的专题地图调整的需要,由于某某单位利用ArcEngine编写的专题图出图系统,出现了一些小问题,导致地图整饰元素的位置出现了误差.由于最终的生产任务已经到了尾声才发现一些问题,所以需要在出图系统之外使用ArcMap进行修改,这样针对上千幅成果文档进行修改,是个不小的工作量.后来决定使用arcpy.mapping,使用Python进行递归查询mxd文档,最终实现自动化修改和重新出图.虽然当时只是使用了很少的功能,基本上就是对整饰元

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对

arcpy.mapping-认识arcpy.mapping

by 李远祥 ArcMap提供了强大的地图制图功能,在实际的工作中,只要涉及到专题地图和地图册的制作,难免会遇到非常多的出图工作和地图图面元素的调整,这部分的工作虽然简单,但基本上是繁琐的重复操作,这些操作不单是耗时长,而且容易出错,往往需要打开ArcMap界面进行多次的操作.而对于一些数据量比较大的地图来说,通过ArcMap界面来逐个调整,很容易会因为调整过程中地图的刷新带来卡机或软件等待响应. 虽然可视化交互操作是大众基础,但面对巨量的重复劳动或界面操作时,显然不太人性.具备一定ArcGIS

MVC输出字符串常用四个方式

var s = new MvcHtmlString("1"); var s1 = "1";//@Html.Raw(s1); var s2 = MvcHtmlString.Create("1"); var s3 = "1";//@String.fomart(s3); 要MVC的Razor视图输出字符串的常用几个方式 记录下 感谢群里朋友

关于检索关键字的常用四种方法

在前端开发过程中,我们经常会遇到关于检索关键词的问题.遇到这类问题,我们通常会用下面的四个方法来解决检索关键词的问题: 1.检索一个固定的关键词: 1.1 String.prototype.indexOf()-->indexOf() 方法返回指定值在字符串对象中首次出现的位置.从 fromIndex 位置开始查找,如果不存在,则返回 -1. 语法: str.indexOf(searchValue[, fromIndex]) 参数: searchValue 一个字符串表示被查找的值. fromIn

java常用四种排序源代码

选择排序 public class ChooseSort { publicstatic voidmain(String[] args) { int[]x = { 2, 332, 16, 575, 203, 4, 23, 11, 345, 32 }; ChooseSort cs = new ChooseSort(); cs.selectSort(x); for(int i = 0; i < x.length; i++) { System.out.print(x[i] + "  ")

php 常用四种排序 冒泡,选择,插入,快排

---恢复内容开始--- 1冒泡排序.  [为描述方便,例子全面为升序排列] 简述:假设数组有10个数字,从左向右.依次比较,如果前者大于后者,则两两交换.每一轮将冒泡一个最大数出来,依次循环,完成排序 流程描述:-- 第一次  a[0] 与 a[1]  比如果 a[0] > a[1]  则 a[0] 与 a[1] 交换,然后 a[1] 与 a[2] 交换,依次到  a[8] 与 a[9]  交换.  此轮过后  a[9] 必为  a[0-9]  中的最大值. 第二次(此时 a[9]以是最大值)

Chromium网页Graphics Layer Tree创建过程分析

在前面一文中,我们分析了网页Render Layer Tree的创建过程.在创建Render Layer的同时,WebKit还会为其创建Graphics Layer.这些Graphics Layer形成一个Graphics Layer Tree.Graphics Layer可看作是一个图形缓冲区,被若干Render Layer共用.本文接下来就分析Graphics Layer Tree的创建过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 网页的Re