提问 发文

如何制作下钻到镇街层级地图(自定义边界)

微微菌

| 2024-01-15 11:00 155 0 0

这里以边界类的地图组件为例,包括2D的基础平面地图和3D的3D边界地图。边界地图类的组件支持上传用户自定义的地图数据,以显示地图组件默认没有提供的地图层级,比如下钻到镇街级别,或者是展示一个自定义区域的边界数据。

Geojson

边界地图类的组件上传的地图数据是geojson,geojson通俗地讲是一种描述地图上的一些几何形状的方式,这些几何形状一般是多边形、折线等,可以用于展示一些行政区域的边界。geojson本身是一种json格式的文件,所以它可以使用geojson作为文件后缀,也可以使用json作为文件后缀,这种文件本质上只是json格式的文本而已。

关于geojson的具体格式,可以参阅一些网上的文档,比如https://www.jianshu.com/p/852d7ad081b3

geojson文件中,必然会有一个features项,它是一个数组,它表示了地图上的每个子区域。而每个featrues的子项都一个properties字段,这个字段的内容在geojson的标准中并未强制要求。但是在Easyv的组件中,必然要在properties右adcodename这两个字段,并且大小写也必须完全一致。adcode是用来表示每个区域的唯一id,name是用于展示在地图标签上。

上传自定义数据

以3D边界地图为例,在组件的配置项中可以找到能上传自定义数据的配置项,在“数据”一项中可以上传zip格式压缩包。

上传文件成功后,配置项界面(也就是数据那一栏)会有一行空白项。这里需要点击空白行展开文件列表,选中一个文件作为主地图的数据。之后便可以预览到该地图层级的效果。

压缩包文件要求

主地图

首先需要确定主地图。主地图是指组件加载完成后就显示的地图层级(可以理解为是最上层的地图区域),比如展示一个浙江省下所有区划的地图,主地图是浙江省,adcode是330000。如下图所示:

对于组件来说,地图压缩包里的主地图的文件名称并没有特别的要求(最好有一定的可读性),只要在上传文件的配置项里下拉选择该文件就行。

子级地图

如果需要点击某个区域下钻到该区域的地图,就需要把该区域的数据打包到上文所说的zip压缩包中。触发组件的下钻之后,它查找压缩包中所有文件,查找到以下钻区域的adcode为名称的文件时(忽略文件的扩展名),就加载该文件,并且把在组件上呈现该地图数据。

例如,上图的浙江省地图,点击下钻到杭州市,这时会自动从压缩包中查找名称为“330100”的文件(330100是杭州市的adcode),如果存在该文件,则展示杭州市的地图。

从上述加载过程可以得知,压缩包里的子级地图的数据在压缩包里必须是以该区域的adcode为名称的文件。

确认adcode

常见的adcode是6位的数字编码,如上文中的330100(杭州市),这种adcode只把中国的国、省、市的行政区域进行统一编码,所以它无法表示区县级的行政区域,而且中国以外的国家和地区也没有统一的adcode编码规范。还有另一种情况,如果业务上需要自定义区域时,比如划出3个城市作为高增长区域,这种在标准的行政区域上进行合并或删减形成的特殊区域也没有统一的adcode编码。

所以当业务上只需要表示国、省、市级别区域时,可以用统一的6为编码;如果是区县可能要使用一些所谓的9位编码;国外或者自定义区域需要自定义adcode

自定义adcode

理论上说,组件并不会去判断一个adcode和该行政区域是否是对应关系,甚至不会识别一个adcode是否合法,组件只是把它当做一个普通字符串来处理而已,可以看作是当做某个区域的唯一id。

所以只要一个adcode没有与同一地图体系(整个地图当前能够展示的所有区域)的其他区域的adcode重名,就可以认为是一个合法的adcode(不过QGIS等软件无法导出非数字的adcode)。但实际上为了具备一定的可读性和可维护性,最好adcode符合某种命名约定,例如在标准的6位adcode规范下进行拓展。

例如,这个附件📎330200-custom.zip中自定义了2个adcode,并把它们作为文件名称。(不保证附件中地图数据的准确性,仅作为示例)如下:

上文中说到,地图压缩包里的主地图的文件名称并没有特别的要求,所以这里主地图文件“330200-custom.geojson”的文件名称是“330200-custom”,这并不影响组件读取。

而两个自定义区域的文件是以“33020001”和“33020002”为文件名称,这两个名称是在主地图宁波市的adcode330200的基础上拓展而来的,就是在末尾加上“01”和“02”。(如果这两个adcode和某些编码规范下的乡镇重名了,也不影响,因为当前这个地图包的地图体系下并没有那两个可能存在的乡镇,并不会影响当前业务的下钻和展示)。

如果已经编码好了每个区域的adcode,并且也已经给数据文件进行了正确的命名,那还需要确保自定义区域父级的地图数据中,自身所对应的feature中的properties字段中的adcode和自定义编码的adcode完全一致,这是下钻是能索引到文件名的依据。所以需要父级的数据中,该自定义区域所对应的feature项的下的adcode与其地图数据的文件名称完全一致。

以上文的附件压缩包为例:自定义区域的文件是33020001,就需要在该区域的父级,也就是宁波市的地图数据中,修改其feature项下的adcode为33020001。(name也记得修改成需要展示的文字)如下所示:

下钻到镇街区县

组件默认没有提供区县级的地图数据,如果要下钻到区县,需要自行提供区县的边界数据,并按上文所说的方法上传到组件的配置项中。

需要注意的就是区县的数据文件名称需要按上文所说的规范进行命名,这样才能再下钻到该区县时,成功索引到该区县的数据。

上面的压缩包附件中展示了把宁波市的鄞州区的地图数据放到压缩包中,并以鄞州区的adcode“330212”为文件名称。330200-custom.geojson”使用的是标准的6位adcode编码,它子级中必然有“330212”为名的feature项。(参见geojson格式标准)

自定义区域

为了展示特殊业务下的自定义区域,可以使用QGIS等软件对geojson进行编辑,合并、裁剪甚至完全重绘地图区域,这方面的操作教程可以通过QGIS等软件的使用文档或教程来学习,这里只做最基本的演示,并不详细说明。

下面以QGIS为例演示一个合并区域的过程:

  1. 导入geojson到QGIS中
  2. 启用编辑模式

  1. 进入选择要素的操作模式

  1. 左键单击区域选中需要合并的区域(按住Shift多选)

  1. 合并区域

6.导出geojson

导出后按上文说的文件命名方式对区域文件进行命名,这样在下钻到该区域时就能读取到该文件。

示例大屏

上文附件压缩包已经上传到下面的这个大屏中,可以导入后直接预览到下钻后的效果。

收藏 0
分享
分享方式
微信

评论

游客

全部 0条评论

8810

文章

4.25W+

人气

11

粉丝

1

关注

官方媒体

轻松设计高效搭建,减少3倍设计改稿与开发运维工作量

开始免费试用 预约演示

扫一扫关注公众号 扫一扫联系客服

©Copyrights 2016-2022 杭州易知微科技有限公司 浙ICP备2021017017号-3 浙公网安备33011002011932号

互联网信息服务业务 合字B2-20220090

400-8505-905 复制
免费试用
微信社区
易知微-数据可视化
微信扫一扫入群