很多时候,人们想知道如何使用ArcGIS API for Python更新图层符号。在快速搜索帖子和文档后,你可能会发现有很多方法可以实现这一点,但你不确定如何继续。如果你读到这一页,我希望一切都能变得更有意义。在这篇文章中,我将介绍:
- 如何更新层符号在一个网络地图
- 如何更新层符号在一个层项
- 如何在功能服务层上更新符号
如果上面这些看起来都一样,不要担心——很快,#1、#2和#3之间的区别就会变得清晰,你会更好地意识到什么时候应该选择一种方法而不是另一种方法。
注意:虽然我正在说明如何更新符号,但您可以应用相同的概念来更新/配置其他属性,如弹出窗口、标签等。我鼓励您在以下独立脚本的基础上进行构建,或者只使用您需要的部分!
如何在Web Map中更新层符号
假设你在ArcGIS Online/Portal for ArcGIS的内容中添加了这个地图服务:https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer
你将项目添加到Web Map中,在一段时间内它满足了你的需求:

但是有一天,您决定不太喜欢橙色,如果您可以更好地可视化每个县的总人口,您将更多地使用Web Map。
过了一段时间,你确定了所附的符号<年代pan style="font-family: courier new, courier, monospace;">webmaplyr.json.它有点长,所以我不会把它包括在这里——这很好,因为你可能不想在你的脚本中定义JSON,更喜欢从文件中读取。
注意:
如果您不知道从哪里开始生成自己的JSON,请不要烦恼。首先创建一个Web Map,就像你想要的那样(应用样式、标签、选项等)。从那里,你可以去(where<年代trong>itemID是Web Map的项目id):
或者,你也可以使用ArcGIS API获取JSON,只需几行代码:
从arcgis<年代pan class="keyword token">进口地理信息系统<年代pan class="keyword token">进口json康涅狄格州<年代pan class="operator token">=地理信息系统<年代pan class="punctuation token">(“https://machine.domain.com/portal”,“admin”,“密码”)项<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.得到<年代pan class="punctuation token">(<itemID<年代pan class="operator token">>)item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))
下面的脚本说明了如何从文件中读取准备好的JSON并将其应用到Web Map:
从arcgis<年代pan class="keyword token">进口地理信息系统<年代pan class="keyword token">进口json<年代pan class="punctuation token">,sys<年代pan class="keyword token">defsearch_item(康涅狄格州<年代pan class="punctuation token">,layer_name<年代pan class="punctuation token">):search_results<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.搜索<年代pan class="punctuation token">(layer_name<年代pan class="punctuation token">,item_type<年代pan class="operator token">=“网站地图”)proper_index<年代pan class="operator token">=[我<年代pan class="keyword token">为我<年代pan class="punctuation token">,年代<年代pan class="keyword token">在列举<年代pan class="punctuation token">(search_results<年代pan class="punctuation token">)如果“””+layer_name<年代pan class="operator token">+“””在str<年代pan class="punctuation token">(年代<年代pan class="punctuation token">)]found_item<年代pan class="operator token">=search_results<年代pan class="punctuation token">[proper_index<年代pan class="punctuation token">[0]]get_item<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.得到<年代pan class="punctuation token">(found_item<年代pan class="punctuation token">.id<年代pan class="punctuation token">)返回get_item<年代pan class="keyword token">defupdate_wm_layerdef(项<年代pan class="punctuation token">):item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()打印("******************* 最初的定义 *********************")打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))与开放<年代pan class="punctuation token">(“/道路/ / webmaplyr.json”)作为json_data<年代pan class="punctuation token">:数据<年代pan class="operator token">=json<年代pan class="punctuation token">.负载<年代pan class="punctuation token">(json_data<年代pan class="punctuation token">)item_properties<年代pan class="operator token">={“文本”:json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(数据<年代pan class="punctuation token">)}项<年代pan class="punctuation token">.更新<年代pan class="punctuation token">(item_properties<年代pan class="operator token">=item_properties<年代pan class="punctuation token">)new_item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()打印("*********************** 新定义 **********************")打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(new_item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))def主要():康涅狄格州<年代pan class="operator token">=地理信息系统<年代pan class="punctuation token">(“https://machine.domain.com/portal”,“admin”,“密码”)项<年代pan class="operator token">=search_item<年代pan class="punctuation token">(康涅狄格州<年代pan class="punctuation token">,“wm_lyrsym”)update_wm_layerdef<年代pan class="punctuation token">(项<年代pan class="punctuation token">)如果__name__<年代pan class="operator token">= =“__main__ ':sys<年代pan class="punctuation token">.退出<年代pan class="punctuation token">(主要<年代pan class="punctuation token">())
脚本运行后,你会得到如下结果:

如何更新Portal/ArcGIS在线项目符号:
这里的区别很微妙。在选项#1中,正在更新的项是Web Map。这里,正在更新的项目是功能/地图图像服务层。该服务可能是您发布到ArcGIS Online/Portal for ArcGIS的内容,也可能是您作为项目添加到内容中的地图/功能服务。
如果您所需要做的只是更改Web Map中的样式,那么选项#1很好,但也许您需要更改组织中某个项目的样式。由于这个项目被许多人使用(并且交付成果偶尔提供给组织外部的涉众),您希望标准化它的外观。
在这个例子中,我使用了与之前相同的Map Service (https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer),并对符号执行类似的更新,只是对Layer项本身。
注意,这个例子更具体地说明了符号的更新方式:
Layer_def = item_data[<年代pan style="color: #690;">“层”] [<年代pan style="color: #ff0000;">3.] [<年代pan style="color: #690;">“layerDefinition”]
- 在这里,您可以看到只有索引3上的层被更新了(县)-服务中的其他所有内容都保持不变。
- 审查<年代pan style="font-family: courier new, courier, monospace;">drawingInfo.json你可以看到渲染器从Single symbol更新为Classified。
你可能想知道为什么包括这个:
其他:
打印(<年代pan style="color: #690;">“目前还没有层定义…正在创建一个…”)
create_layer_def(项)
- 默认情况下不一定要创建层定义。让我们假设我只是把地图服务作为一个项目添加到我的内容中——这个ArcGIS Online/Portal for ArcGIS项目没有附加层定义。
- 如果将项目添加到Web Map,做一个简单的符号更改,并保存该层,这将生成一个层定义。
- complete.json包含应用于整个项目(全部4层)的层定义。
从arcgis<年代pan class="keyword token">进口地理信息系统<年代pan class="keyword token">进口json<年代pan class="punctuation token">,sys<年代pan class="keyword token">defsearch_layer(康涅狄格州<年代pan class="punctuation token">,layer_name<年代pan class="punctuation token">):search_results<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.搜索<年代pan class="punctuation token">(layer_name<年代pan class="punctuation token">,item_type<年代pan class="operator token">=‘*’)proper_index<年代pan class="operator token">=[我<年代pan class="keyword token">为我<年代pan class="punctuation token">,年代<年代pan class="keyword token">在列举<年代pan class="punctuation token">(search_results<年代pan class="punctuation token">)如果“””+layer_name<年代pan class="operator token">+“””在str<年代pan class="punctuation token">(年代<年代pan class="punctuation token">)]found_item<年代pan class="operator token">=search_results<年代pan class="punctuation token">[proper_index<年代pan class="punctuation token">[0]]get_item<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.得到<年代pan class="punctuation token">(found_item<年代pan class="punctuation token">.id<年代pan class="punctuation token">)返回get_item<年代pan class="keyword token">defupdate_layer_def(项<年代pan class="punctuation token">):item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()如果item_data<年代pan class="keyword token">是不没有一个<年代pan class="punctuation token">:layer_def<年代pan class="operator token">=item_data<年代pan class="punctuation token">[“层”][3.][“layerDefinition”]打印("******************* 最初的定义 *********************")打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))与开放<年代pan class="punctuation token">(“/道路/ / drawingInfo.json”)作为json_data<年代pan class="punctuation token">:数据<年代pan class="operator token">=json<年代pan class="punctuation token">.负载<年代pan class="punctuation token">(json_data<年代pan class="punctuation token">)layer_def<年代pan class="punctuation token">[“drawingInfo”]=数据<年代pan class="comment token">#设置item_properties以包含所需的更新item_properties<年代pan class="operator token">={“文本”:json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(item_data<年代pan class="punctuation token">)}项<年代pan class="punctuation token">.更新<年代pan class="punctuation token">(item_properties<年代pan class="operator token">=item_properties<年代pan class="punctuation token">)new_item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()打印("*********************** 新定义 **********************")打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(new_item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))其他的:打印(“目前还没有层定义…正在创建一个…”)create_layer_def<年代pan class="punctuation token">(项<年代pan class="punctuation token">)defcreate_layer_def(项<年代pan class="punctuation token">):与开放<年代pan class="punctuation token">(“/道路/ / complete.json”)作为json_data<年代pan class="punctuation token">:数据<年代pan class="operator token">=json<年代pan class="punctuation token">.负载<年代pan class="punctuation token">(json_data<年代pan class="punctuation token">)item_properties<年代pan class="operator token">={“文本”:json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(数据<年代pan class="punctuation token">)}项<年代pan class="punctuation token">.更新<年代pan class="punctuation token">(item_properties<年代pan class="operator token">=item_properties<年代pan class="punctuation token">)item_data<年代pan class="operator token">=项<年代pan class="punctuation token">.get_data<年代pan class="punctuation token">()打印("********************* 创建定义 ************************")打印(json<年代pan class="punctuation token">.转储<年代pan class="punctuation token">(item_data<年代pan class="punctuation token">,缩进<年代pan class="operator token">=4,sort_keys<年代pan class="operator token">=真正的))def主要():康涅狄格州<年代pan class="operator token">=地理信息系统<年代pan class="punctuation token">(“https://machine.domain.com/portal”,“admin”,“密码”)项<年代pan class="operator token">=search_layer<年代pan class="punctuation token">(康涅狄格州<年代pan class="punctuation token">,“earl_api_usalyraw”)update_layer_def<年代pan class="punctuation token">(项<年代pan class="punctuation token">)如果__name__<年代pan class="operator token">= =“__main__ ':sys<年代pan class="punctuation token">.退出<年代pan class="punctuation token">(主要<年代pan class="punctuation token">())
如何更新特性服务符号:
在最后一个例子中,我演示了如何在功能服务层上更新符号。在幕后,这个方法实际上只是执行这个操作:更新定义(功能层)-ArcGIS REST API:服务目录| ArcGIS for Developers
那么,这里的区别是什么,什么时候使用这种方法?
- 这只适用于功能服务。
- 当您希望对功能服务层进行高级更新时,您可能需要使用这种方法。这可以用来全面标准化功能服务层的外观——不需要做任何客户端修改,将功能服务添加到ArcGIS在线/ ArcGIS Web Map门户的人将看到与开发人员在应用程序中使用服务相同的东西。
在这个例子中,我发布了一个包含两层的Hosted Feature Service:
- 美国各州/加拿大各省
- 北美主要铁路
原来的功能服务是这样的:

这个例子的JSON不是很长。我只是对States/Provinces图层的颜色和宽度做了一些改变:
{“drawingInfo”:{“渲染”:{“类型”:“简单”,“象征”:{“类型”:“esriSFS”,“风格”:“esriSFSSolid”,“颜色”:[202,46,204,105],“大纲”:{“类型”:“esriSLS”,“风格”:“esriSLSSolid”,“颜色”:[10,10,210,55],“宽度”:0.5}}},“scaleSymbols”:真正的,“透明”:0,“labelingInfo”:零}}
在这个场景中,因为我们更新的是一个Feature Service,而不是我们需要使用的项<年代pan style="font-family: courier new, courier, monospace;">arcgis.features.
从arcgis<年代pan class="keyword token">进口地理信息系统<年代pan class="keyword token">从arcgis<年代pan class="punctuation token">.特性<年代pan class="keyword token">进口FeatureLayerCollection<年代pan class="keyword token">进口json<年代pan class="punctuation token">,sys<年代pan class="keyword token">defsearch_layer(康涅狄格州<年代pan class="punctuation token">,layer_name<年代pan class="punctuation token">):search_results<年代pan class="operator token">=康涅狄格州<年代pan class="punctuation token">.内容<年代pan class="punctuation token">.搜索<年代pan class="punctuation token">(layer_name<年代pan class="punctuation token">,item_type<年代pan class="operator token">=功能层的)proper_index<年代pan class="operator token">=[我<年代pan class="keyword token">为我<年代pan class="punctuation token">,年代<年代pan class="keyword token">在列举<年代pan class="punctuation token">(search_results<年代pan class="punctuation token">)如果“””+layer_name<年代pan class="operator token">+“””在str<年代pan class="punctuation token">(年代<年代pan class="punctuation token">)]found_item<年代pan class="operator token">=search_results<年代pan class="punctuation token">[proper_index<年代pan class="punctuation token">[0]]方法<年代pan class="operator token">=FeatureLayerCollection<年代pan class="punctuation token">.fromitem<年代pan class="punctuation token">(found_item<年代pan class="punctuation token">)返回方法<年代pan class="keyword token">defupdate_layer_def(层<年代pan class="punctuation token">):与开放<年代pan class="punctuation token">(“/道路/ / hosted_drawinfo_lyr.json”)作为json_data<年代pan class="punctuation token">:数据<年代pan class="operator token">=json<年代pan class="punctuation token">.负载<年代pan class="punctuation token">(json_data<年代pan class="punctuation token">)层<年代pan class="punctuation token">.经理<年代pan class="punctuation token">.update_definition<年代pan class="punctuation token">(数据<年代pan class="punctuation token">)打印("******************* 更新的定义 **********************")打印(层<年代pan class="punctuation token">.属性<年代pan class="punctuation token">)def主要():康涅狄格州<年代pan class="operator token">=地理信息系统<年代pan class="punctuation token">(“https://machine.domain.com/portal”,“admin”,“密码”)方法<年代pan class="operator token">=search_layer<年代pan class="punctuation token">(康涅狄格州<年代pan class="punctuation token">,“layerdef”)层<年代pan class="operator token">=方法<年代pan class="punctuation token">.层<年代pan class="punctuation token">[1]打印(层<年代pan class="punctuation token">.属性<年代pan class="punctuation token">)update_layer_def<年代pan class="punctuation token">(层<年代pan class="punctuation token">)如果__name__<年代pan class="operator token">= =“__main__ ':sys<年代pan class="punctuation token">.退出<年代pan class="punctuation token">(主要<年代pan class="punctuation token">())
更新结果:

关于如何更新层符号的概述到此结束。希望通过本指南,您可以很好地了解如何在您的组织中实现类似的工作流!