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. 高效判断奇偶性,利用位运算符&

    这种位运算判断奇偶性,在程序和数据库里面都是可以用的 public static bool isOdd(i) { return (i&1)!=0 } 最小奇数是:1   最小偶数是:0   所 ...

  2. 基于Apache搭建Nagios图形监控

    基于apache 的稍微简单一点么?实验一下子就OK了... 环境: System: [root@losnau etc]# cat /etc/issueRed Hat Enterprise Linux ...

  3. 从内存中加载DLL Delphi版(转)

    源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...

  4. 一、什么是hadoop?

    一.什么是hadoop 1. 背景 Hadoop为分布式文件系统和计算的基础框架系统,其中包含hadoop程序,hdfs系统等.   2. 名词解释 1.Hadoop, Apache开源的分布式框架. ...

  5. POJ 1995 Raising Modulo Numbers

    快速幂取模 #include<cstdio> int mod_exp(int a, int b, int c) { int res, t; res = % c; t = a % c; wh ...

  6. Leetcode题1

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  7. eclipse快速定位java对应的class

    当前设置值,只能定位class文件 设置eclipse External Tools Configurations... Program --> new New 创建viewclass.bat文 ...

  8. Windows Server 2012 安装sqlserver2008 小记

    1.拷贝大文件被阻止   解决方案:把大文件压缩成小文件... 据说关闭防火墙会好点,没试验过. 2.安装第一步,提示没有安装.net framework 3.5 sp1 ,使用服务器管理器,添加角色 ...

  9. S3C2440的SPI解析

    位串行数据的频率.如果只希望发送,则接收数据可以保持伪位(dummy).此外如果只希望接收,则需要发送伪位'1'数据 使用SPI主要需要以下寄存器 选择SPI模式,中断模式,查询模式等SCK选择,主从 ...

  10. 使用SSH搭建用户注册登录系统

    [转]http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html 什么是SSH? SSH对应 struts spring hibernatestruts ...