地图快速符号化的理论与实践
2020-07-31石全悦
石全悦
(安徽省第一测绘院, 安徽合肥 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]。自动地图文档生成的功能,为第三方使用者带来便利。获取网络数据、使用地图快速符号理论,可以同步更新移动端地图显示。