arcpy.mapping常用四大件-StyleItem

by 李远祥

StyleItem 笔者将其归类到arcpy.mapping的四大件当中,主要是因为它的独特之处,就是其能力是直接读取.style文件的。前面介绍的三大件,分别是对地图文档、图层、地图整饰元素进行操作,现在再加上能够读取和使用.style符号,基本上就能构成了完整的自动化制图体系。

arcgis 的.style文件,就是我们常说的样式库文件,主要是用来保存符号样式、整饰元素样式等的文件。ArcMap有个普遍的特性,就是样式符号一旦读取之后,就可以脱离.style文件使用,所有的修改都与.style无关了,这也是导致很多人对于.style比较陌生。其实在严谨的GIS制图流程中,符号库是要先于数据整理、组织等工作之前开展的,所有的符号修改也是要先在符号库中修改,修改完成后再重新再图层中应用。但由于ArcMap允许没有符号脱离符号库生成(其实也不算脱离,只是保存在默认的符号库中),所以对于非专业制图人员来说,很多标准和规范没有得到很好的执行。

StyleItem对象的作用是用来读取粒度更加细的符号样式,它能够识别出样式库中所有的样式类型,譬如颜色、图例项、标记符号和比例尺等,它基本上是要结合Layer和MapsurroundElement 使用,通过前者获取到图层或者整饰元素,然后对其应用样式。StyleItem只有三个属性,分别是itemName、itemCategory和styleFolderName ,全部都是只读属性,可以看出Esri对其定位是获取符号,而非制作符号(谁也不会天真到使用代码的方式去创建符号吧,毕竟有可视化界面styleManager去完成符号设计)。要能够使用这三个属性,就必须知道其对应在样式管理器中的具体部分。如下图所示,基本上可以知道这三个属性所对应的部分

在制作的时候,文件夹和符号名称都很好理解,唯独这【类别】的设置,有点不明确。这里的【类别】是不能创建的,只能在符号新建的时候或者重命名的时候,进行修改,修改的方式也只能是纯文本输入,没有所谓的下拉框选择的操作,所以,一旦输入错误,符号就有可能分在不同的类别当中。下图就是在符号创建完成之后,通过点击【类别】一列进行重新定义类别的操作

为什么会有【类别】的东西,看看下面最简单的命名方式吧,ArcGIS的符号名称是可以相同的,那么怎样才能精确查找到符号?那就需要【类别】进行配合操作了。如下图,符号名称都未【钻孔】,这种方式是可以存在的。

当然,本章并不是讨论arcgis符号库是怎么命名的,但要了解清楚StyleItem 的运作方式,必须掌握其符号库组织的特性。上述的着一些细节,恐怕很多骨灰级的ArcGIS用户都不知道。接下来就看看StyleItem 是如何获取符号库中的符号了。通过帮助检索的方式,可以看到关于其调用的方式说明少之极少,如下图

点开每一个帮助,其代码可以看看,均没有说明如何引用外部符号库,官方的代码如下

import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrFile = arcpy.mapping.Layer(r"C:\Project\Data\Rivers.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "TOP")
lyr = arcpy.mapping.ListLayers(mxd, 'Rivers', df)[0]
styleItem = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", "NewDefaultLegendStyle")[0]
legend = arcpy.mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT")[0]
legend.updateItem(lyr, styleItem)
del mxd

很明显,这种方式只是调用了默认的符号库,如果要指定符号库的符号的话,还是需要使用arcpy.mapping.ListStyleItems 方法来获取,可以查看一下

ListStyleItems (style_file_path, style_folder_name, {wildcard})的用法,从这个方法来看,是可以指定符号库路径的,顺便再看看其结果,是一个数组,所以实例代码中使用了数据的第一个对象。很明显,这对应上面所说的符号命名方式是可以重叠的,如果想精确获取到符号,也就需要使用StyleItem 的itemCategory 属性了。

接下来可以感受一下如果通过arcpy.mapping的方式去指定渲染的符号了,下图是一个监测设施图层,使用了红色圆点来表示,如图

现在需要将其符号改为【水文测站】的水文站符号,其对应的符号库中已经有相同的“水文测站”的名称,如下图

其中已经在类别在分为【水位站】和【水文站】两个类别。现在可以看看代码怎么操作了。

#coding=gbk
import arcpy
styleItems = arcpy.mapping.ListStyleItems(r"C:\Users\lazy\Desktop\1\water.style", "Marker Symbols", "水文测站")
for style in styleItems:
    if style.itemCategory=="水文站".decode('gbk'):
        print style.itemName
del mxd

非常惋惜的是目前arcpy.mapping 还没有能力可以直接修改图层的样式符号,就算能读取这些样式文件,也无法对图层进行设置。唯一一个可以设置的是图例,这在帮助文档里面已经说明得非常具体,如果不留意帮助,可能还一直在寻找这种修改符号的方法。而且最让人无奈的是这个说明是在ListStyleItems 方法中说明,有点让人啼笑皆非。

那可以看看以下代码,最终实现的是修改图例的样式,这些样式只是包括图例的布局、字体配置(当然不包括符号了,符号是图层关联过来的)

#coding=gbk
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Users\lazy\Desktop\水利符号库\水利模型\水利数据模型.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyr = arcpy.mapping.ListLayers(mxd, '', df)[3]
styleItems = arcpy.mapping.ListStyleItems(r"C:\Users\lazy\Desktop\1\water.style", "Legend Items", "水文测站")
for style in styleItems:
    if style.itemCategory=="水文站".decode('gbk'):
        #更新图层符号
        legend = arcpy.mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT")[0]
        legend.updateItem(lyr, style)
mxd.save()
del mxd

最终的效果就是明显替换了图例部分,让图例的字体变粗了,这个效果就是可以在样式管理器中设计的了。

总结:StyleItem还处理幼儿阶段,能够实现的功能还是非常有限,不过相信随着ArcMap的完善,会逐步将这些功能补上,毕竟现在已经可以看到其操作符号库的方法了,并且可以修改图例的布局,相信很快就会覆盖其他的符号设置功能。

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

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

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

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

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

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

    arcpy.mapping常用四大件-Layer by 李远祥 图层是地图里面非常重要的组成,几乎所有的制图显示都与图层有关.首先它是连接数据与符号渲染的重要桥梁,其次在出版地图中,图层又与图例关联在 ...

  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. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

随机推荐

  1. 下标脚本(Swift)

    下标脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问集合(collection),列表(list)或序列(sequence的快捷 ...

  2. Android系统属性SystemProperties分析

    下面这几个博客总结的不错,有空看下: http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html http://blog.csdn.n ...

  3. 利用 gperftools 对nginx mysql 内存管理 性能优化

    利用 gperftools 对nginx 与 mysql  进行 内存管理  性能优化 降低负载. Gperftools 是由谷歌开发.官方对gperftools 的介绍为: These tools ...

  4. iOS10适配——相机,通讯录,麦克风等权限设置

    崩溃:[access] This app has crashed because it attempted to access privacy-sensitive data without a usa ...

  5. [Unity AssetBundle]Asset资源处理

    什么是AssetBundle 在很多类型游戏的制作过程中,开发者都会考虑一个非常重要的问题,即如何在游戏运行过程中对资源进行动态的下载和加载.因此,Unity引擎引入了AssetBundle这一技术来 ...

  6. 转化秒数为正规的时间格式{NSString格式的秒数转成NSDate格式后再以NSString形式输出)

    -(NSString*)changeNumToTime:(NSString*)str { NSDate *date = [NSDate dateWithTimeIntervalSince1970:[s ...

  7. ucos系统初始化及启动过程

    之前在ucos多任务切换中漏掉了一个变量, OSCtxSwCtr标识系统任务切换次数 主要应该还是用在调试功能中 Ucos系统初始化函数为OSInit(),主要完成以下功能 全局变量初始化 就绪任务表 ...

  8. X-001 FriendlyARM Tiny4412 uboot移植前奏

    版权声明:本文为博主原创文章,转载请注明出处 开发环境:win7 64位 + VMware12 + Ubuntu14.04 64位 工具链:linaro提供的gcc-linaro-6.1.1-2016 ...

  9. MySQL临时表与派生表(简略版)

    MySQL临时表与派生表 当主查询中包含派生表,或者当select 语句中包含union字句,或者当select语句中包含一个字段的order by 子句(对另一个字段的group by 子句)时,M ...

  10. 深度残差网(deep residual networks)的训练过程

    这里介绍一种深度残差网(deep residual networks)的训练过程: 1.通过下面的地址下载基于python的训练代码: https://github.com/dnlcrl/deep-r ...