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. POJ 1696 Space Ant

    极角排序 每次选择一个最外围的没选过的点,选择的时候需要利用极角排序进行选择 #include<cstdio> #include<cstring> #include<ve ...

  2. java工程师联通XX面试题目

    什么是“长连接”和“短连接”? 所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接解释2长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据 ...

  3. Classification of text documents: using a MLComp dataset

    注:原文代码链接http://scikit-learn.org/stable/auto_examples/text/mlcomp_sparse_document_classification.html ...

  4. (简单) POJ 3169 Layout,差分约束+SPFA。

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  5. 五、Hive

    一.Hive 1.1 Hive简介 1.2 Hive说明 1.3Hive的体系架构 来自为知笔记(Wiz)

  6. 无法访问 ASP 兼容性模式

    <%@ Page Title="" Language="C#" MasterPageFile="../theme/classic/content ...

  7. laravel安装excel功能

    原文安装链接:https://github.com/Maatwebsite/Laravel-Excel 代码如下: if ($rows = DB::connection('glist')->ta ...

  8. iOS开发——生成条形码,二维码

    - (void)viewDidLoad { [super viewDidLoad]; self.imageView.image = [self generateBarCode:@"15248 ...

  9. 【转】20条Linux命令面试问答

    问:1 如何查看当前的Linux服务器的运行级别? 答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别. 问:2 如何查看Linux的默认网关? 答: ...

  10. pageX,clientX,screenX,offsetX区别

    pageX/pageY:鼠标相对于整个页面的X/Y坐标.注意,整个页面的意思就是你整个网页的全部,比如说网页很宽很长,宽2000px,高3000px,那pageX,pageY的最大值就是它们了.特别说 ...