地图快速符号化的理论与实践

2020-07-31 03:55石全悦
安徽地质 2020年2期
关键词:符号化数据源图层

石全悦

(安徽省第一测绘院, 安徽合肥 230031)

0 引言

使用地图模板浏览或处理地理信息数据,省去了重新配图的时间,但是常常无差别的符号化设置形成一种错误的作业方法或思维习惯:流动水面和静止水面被错误地设置为相同的蓝色。随时随地设置地理要素的符号,甚至一键实现符号与属性匹配,是地图用户的需求。

1 属性字段自动匹配符号

属性值自动匹配符号库中的符号,可以节约大量的配图时间,也可以据此发现数据中的问题。要实现此功能,需要:有精心设计的符号库[1],符号美观,名称与属性项强关联;通过关联或增加属性字段的方式,确保某属性项的值与符号库中的符号名完全一致。

1.1 制作符号从统计GB值开始

符号是数据的图形显示。数据是千差万别的,但都有其国标代码GB,每一代码都要有专门的符号,需要多少种符号[2],都可以通过统计得到。统计方法如下:

def statistics_fd(fcsfilefolder,fieldname):

arcpy.env.workspace=fcsfilefolder

fcs=arcpy.ListFeatureClasses()

gblist=[]

for fc in fcs:

fieldList=[]

fields=arcpy.ListFields(fc)

for field in fields:

fieldList.append(field.name)

if fieldname in fieldList:

for row in arcpy.da.SearchCursor(fc,["SHAPE@",fieldname]):

if fc+" "+str(row[1])not in gblist:

gblist.append(fc+" "+str(row[1]))

else:

pass

return gblist

函数的返回值就是所要的统计结果,安徽不到600个地形要素国标分类码,制作符号库的工作不是从0开始,利用已有的符号,严格定义其名称如“810301稻田”。

1.2 通过“桥”字段匹配符号

图1中,符号的Value值,是国标码与中文名称的组合,这样有利于使用。但规范的数据是不含此类组合值的,这种桥梁作用的字段需要搭建——通过新建字段并赋值的方式或建立与设计的表连接的方式。新建字段方法,将会破坏原数据的属性结构,不可取;建立表连接方法是理想的选择。不需手动建立表连接,使用如下的语句,这种连接只瞬间存在,应在地图文档打开时,运行如下语句,并保存地图文档,才能存储这种关联关系。这样的好处是不改变原数据,仅在地图文档中添加关联关系。

biao=r"XXXXXSheet1$"

fc=r"XXXXVEGA"

AddJoin(fc,"GB",biao,"GB")

表中有GB字段和GBNAME组合字段,要素含有GB字段,以GB为桥构建要素与表的连接,再用GBNAME值匹配符号库中的符号。仅打开地图文档,才出现这种连接,也才时时保持属性与符号的匹配。移除关联,符号化效果消失。

图1 用属性值匹配符号库中的符号Figure 1.Match symbols in the symbol library with attribute values

1.3 符号应该体现使用者的需求

图2 是检查员的特色用图设置:①夸大道路端点目的是为检查员掌握道路的相交打断情况;②道路相交打断错误;③河流中心线,箭头表示流向;④水田符号及品字排列形式。不同的使用者需求有差异[3],符号化应有不同的版本:普通用户使用国标版,特殊用户使用符号化版。

图2 数据、符号、遥感影像Figure 2.Data,symbols and remote sensing images

1.4 符号化必不可少的文件

字体文件“Public_V2.0.ttf”及符号库“YWSymbol.style”,是地图文档符号化不可缺少的文件,连同存放它们的路径要记录到地图文档的description属性内。

mxd=arcpy.mapping.MapDocument("CURRENT")

mxd.description="E:Symbol_FontPublic_V2.0.ttfE:Symbol_FontYWSymbol.style"

可以手动拷贝,最好使用上述语句。以后使用者遇到一些问题,也容易找到答案。使用方法是,将Public_V2.0.ttf复制到Windows下font内,YWSymbol.style拷贝到用户方便的地方,再将软件的符号库路径指向此处;更安全的策略是,将原设备的字体文件拷贝到他处,地图任务结束后,还原以前的设置。这些动作可以通过创建相应的工具来实现。

2 地图文档自动生成

如果不采用自动生成地图文档方法,日常需要这样处理:将地图文档*.mxd指向的数据源改名,打开文档时,路径不正确,不显示数据及符号,需重新定位数据的路径,修改显示范围,另存地图文档,这样生成的地图文档基本可以使用,有时也会遇到较难解决的问题:比如若干个数据源,不能一次解决,需要多次修改数据源的路径,投影参数与数据源的揭示参数不一致,需要判断投影带的中央经线重新设置投影参数。

自动生成地图文档,也会遇到这些问题,只不过是通过程序的方式来解决,重要的是也可以解决空图层数据的加载问题,因为空图层总会破坏整图显示的愿望。

自动生成地图文档的思路是:准备字体、符号库文件,使用自动匹配等方法创建通用的地图文档,设计好图层组、图层,图层与数据层按同名方式命名。mxd模板的路径、mxd模板的名称、数据源文件的路径、新层文件的路径、新mxd的名称均按编程要求存放,shp、mdb、gdb格式的数据源方法几乎相同:导入地图文档文件、导入数据源中非空数据对应的图层组和图层,计算数据源中数据的范围,得到整个地图的范围值,并计算对应投影参数获取对应的引用文件,指定图层的数据源。

def create_mxd(self,template,templatefolder,sour-cefolder,newmxdlyrfolder):

L0=int(gkp.L2L0(L,3)[0])##计算投影带的中央经线

MapDocument(os.path.join(templatefolder,"%s.mxd"%L0))

df=arcpy.mapping.ListDataFrames(mxd,"Layers")[0]

df.extent=newExtent

result=GetCount_management(fc)

count=int(result.getOutput(0))

GroupLayer=ListLayers(mxd,"%s"%fc[:3],df)[0]

addLayer=Layer(fc)

AddLayerToGroup(df,targetGroupLayer,addLayer,"AUTO_ARRANGE")

replaceDataSource(os.path.join(mdb_folder,mdbname),"ACCESS_WORKSPACE")

findAndReplaceWorkspacePaths(template,os.path.join(mdbfolder,mdbname))

mxd.saveACopy(os.path.join(newmxdlyrfolder,"%s.mxd"%newtuming))

新生成的地图文档、数据源和工作空间,都经过程序的设置,确保用户打开文件时图形显示正常、工作空间正常。

3 应急态势图

属性能自动匹配符号、自动生成地图文档,制作应急图就有了基础。比如这次新冠疫情,美国的数据,每日都在更新,可以制作即时更新的疫情图。因为我国的数据涉及地图审查的原因,会给出版带来额外的工作,所以才使用美国的数据。基本步骤是:准备基础地图要素数据,制作地图文档,抓取网页数据,写数据到电子表格,关联表。

基 础 数 据 包 括 :states、usabln、neighcountry、landbnds、us_lakes、intrstat、counties、cities、us_rivers。应急内容主要涉及states属性数据。

选择可靠的网址

https://news.ifeng.com/c/special/7uLyp1412jw?code=USA&needpage=1&webkit=1

本文没有使用因发布疫情数据又火了一把的约翰斯·霍普金斯大学的数据,而是凤凰网的数据。主要语句如下:

wangzhi="https://news.ifeng.com/c/special/7uLyp 1412jw?code=USA&needpage=1&webkit=1"

response=urllib.request.urlopen(wangzhi)

txtfile=response.read().decode("utf-8")

可以将数据写入磁盘,也可以直接分析挖掘。数据格式如下:

str1={"siwang":"5426","sys_ ":"2020-03-05 10:49:03","name3":"新泽西州","zhongzheng_xianyou":"","quezhen_xianyou":"","quezhen_add":"待公布","quezhen":"100025","id":"","name2":"美国","name1":"国外","quezhen_jingwaishuru":"","yisi":"","sys_orderBy":"","quezhen_wzz":"","zhiyu":"","sys_publisher":"王宁1"}

使用正则表达式提取数据:matchObj=re.match('''{"siwang": (.*?), "sys_publishDateTime": (.*?),"name3":(.*?),"zhongzheng_xianyou":(.*?),"quezhen_xianyou":(.*?),"quezhen_add":(.*?),"quezhen":(.*?),"id":(.*?),"name2":(.*?),"name1":(.*?),"quezhen_jingwaishuru":(.*?),"yisi":(.*?),"sys_orderBy":(.*?),"quezhen_wzz":(.*?),"zhiyu":(.*?),"sys_publisher":(.*?)}''',str1,re.M|re.I)

所有的(.*?)均代表一个变量,共有16组数据:

siwang=matchObj.group(1),,,

sys_publisher=matchObj.group(16)

图3 快速符号化生成的2020年04月23日美国疫情图Figure 3.A rapidly symbolized map of the epidemic outbreak in the United States on April 23,2020

将获取的数据写入电子表格,再将表格与属性连接,桥字段为州名称,属性变化后符号化立即生效,就得到刚刚从网上爬取数据的疫情图(图3)。作者无意于赶潮,重点在于说明,通过属性与符号匹配技术、地图文档自动生成方法,可以与公布的数据同步生成应急图。

4 结语

属性与符号自动匹配实现地图符号化,为使用者节约了大量的时间。有差别的符号设置,使得在生产阶段严把质量关成为可能[4]。自动地图文档生成的功能,为第三方使用者带来便利。获取网络数据、使用地图快速符号理论,可以同步更新移动端地图显示。

猜你喜欢
符号化数据源图层
小学数学教学中渗透“符号化”思想的实践研究
为《飞舞的空竹龙》加动感
以假乱真窥探湿玻璃后的风景
一种面向传感云的数据源质量评估框架
利用属性集相关性与源误差的多真值发现方法研究
与众不同“跳出”画面更个性
基于HGAV的多源异构数据集成方法①
关于一阶逻辑命题符号化的思考
现代流行服饰文化视阈下的符号化消费
合拍片《风筝》的跨文化传播