159_模型_Power BI 地理分析之形状地图

2023-10-27

159_模型_Power BI 地理分析之形状地图

声明以下地图元素仅供学习交流所用,如需地图公开使用请提前做好报审工作。

一、背景

当企业的体量达到一定体量的时候,保持稳定的增长是非常重要的事情。本案例展示如何用 Power BI 的形状地图来寻求业务的增长。

我们先来看结论:

  • 省级市场共计:34 个,已开拓:34 个;占比:100.0%。

  • 地市级市场共计:370 个,已开拓:214 个;占比:57.8%。

  • 区县级市场共计:2875 个,已开拓:356 个;占比:12.4%。

其实从这个三条结论来看,市场层级越下沉,其实我们的空白市场越多;当然要业务能支撑这样的规模才行。

通过三张图,就让各大区领着各自团队回去开会,制定一个空白市场开发的计划及相应的配套预算。

Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/159-full.html

159-1

159-2

159-3

二、模型设计

1、地图数据

要分析从 省份>地市>区县 三个层级的地理业务数据,首先要准备的是 省份、地市、区县 三个层级的地理数据。

数据获取可以从阿里云的 DataV.GeoAtlas(https://datav.aliyun.com/portal/school/atlas/area_selector) 获取。

159-4

简单的数据获取直接从这里获取即可,但是我们需要的 省份、地市、区县 三级的数据,那么我们就是用 Python 获取这部分数据。

数据拿到以后还要做相应的清洗,清洗不必要的字段信息;这里获取的数据是 GeoJSON 格式;但是 Power BI 的形状地图(https://docs.microsoft.com/zh-cn/power-bi/visuals/desktop-shape-map)需要使用的是 TopoJSON 格式数据。

GeoJSON 转换为 TopoJSON 我们使用开源的工具 mapshaper (https://github.com/mbloch/mapshaper) 转换即可。数量不是特别多的话可以使用可视化的方式转换将 GeoJson 格式数据导入到 https://mapshaper.org/ 导出即可。

159-5

如果无法打开网站还可以在本地搭建服务,依赖 Node.js ,命令行安装即可。

npm install -g mapshaper

安装好以后,通过命令启动服务;在本地运行 mapshaper Web 界面

mapshaper-gui

也可以通过命令行的方式来进行 GeoJSON 转换为 TopoJSON ; -i 是输入 GeoJSON 路径; -o 是输出 TopoJSON 路径。

mapshaper -i D:\Desktop\map\map_data\geo\country\L0_L1_country.json -o D:\Desktop\map\map_data\topo\country\L0_L1_country.json format=topojson

更多的信息可以参考:https://github.com/mbloch/mapshaper

Python 配合 mapshaper 可以批量地拆分和转换 GeoJSON 数据。

以上工作笔者已经做好了,只需要在附件中获取清洗好的现成数据即可。

159-6

topo中有三个文件 country、province、city 文件夹中的内容命令规则如下,其中 adcode 代表地区的编码。

这样可满足合并和拆分的地图数据的需求。

# L0-全国 L1-省份 L2-地市 L3-区县 文件夹 文件命名规则
1 country L0_L1_country
2 country L0_L2_country
3 country L0_L3_country
4 province L1_L2_province_adcode
5 province L1_L3_province_adcode
6 city L2_L3_city_adcode

2、区域维度数据

如下图,从大区>省份>城市>区县 四个维度的数据分别都整理好了,同时兼容了直辖市、特区、县级市以及湾湾的层级数据。

159-7

3、模型关系

数据基本介绍,请在之前的文章中查阅(https://jiaopengzi.com/1435.html)。

159-8

三、度量值及可视化

1、度量值

159-9

Ⅰ、基础的业务度量值:0001_销售金额。

0001_销售金额 = 
SUM ( 'T05_订单子表'[F_06_产品销售金额] ) / 10000 

Ⅱ、市场占有结论语句度量值:Map_Area_Count ;L1-L3分别代表省份、地市、区县。

Map_Area_Count_L1 = 
VAR Table_ID =
    VALUES ( 'D01_省份表'[F_02_省ID] )
VAR Table_All =
    ADDCOLUMNS ( Table_ID, "@value", [0001_销售金额] )
VAR Table_Sale = FILTER( Table_All ,[@value] <> BLANK())
VAR FZ =
    COUNTROWS ( Table_Sale )
VAR FM =
    COUNTROWS ( 'D01_省份表' )
VAR Format_1 =
    FORMAT ( DIVIDE ( FZ, FM, BLANK () ), "#0,0.0%" )
RETURN
    "省级市场共计:" & FM & "个,已开拓:" & FZ & "个;占比:" & Format_1

Ⅲ、数据向下钻取后标题名称:Map_Area_Title ;L1-L2分别代表省份、地市。

Map_Area_Title_L1 = SELECTEDVALUE('D01_省份表'[F_05_省简称2])

Ⅳ、数据向下钻取后,形状地图的色彩饱和度度量值:Map_Drill ;L2-L3分别代表地市、区县。这里需要兼容一个形状地图不显示没有数据的区域,那么我们需要构造下钻后的所有区域的数据,没有的数据就是 0 。

Map_Drill_L2 = 
VAR PARENT_ID =
    SELECTEDVALUE ( 'D02_城市表'[F_01_省ID] )
VAR TABLEY =
    ADDCOLUMNS (
        'D02_城市表',
        "@VALUE",
            VAR p = [F_01_省ID]
            RETURN
                IF ( p = PARENT_ID, '00_Measure'[0001_销售金额] + 0, '00_Measure'[0001_销售金额] )
    )
VAR TABLEZ =
    FILTER ( TABLEY, [F_01_省ID] = PARENT_ID )
RETURN
    SUMX ( TABLEZ, [@VALUE] )

Ⅴ、由于 Power BI 目前是图例来显示数据的多少的,我们用 SVG 构造一个图例:SVG_Html_Legend ;L1-L3分别代表省份、地市、区县。

SVG_Html_Legend_L1 = 
VAR table_all =
    CALCULATETABLE ( 'D01_省份表', ALL ( 'D01_省份表'[F_02_省ID] ) )
VAR table_add =
    ADDCOLUMNS ( table_all, "@value", [0001_销售金额] )
VAR value_max =
    FORMAT ( MAXX ( table_add, [@value] ), "#,0" )
VAR value_min =
    FORMAT ( MINX ( table_add, [@value] ), "#,0" )
VAR value_ac =
    FORMAT ( [0001_销售金额], "#,0" )
VAR FM =
    MAXX ( table_add, [@value] ) - MINX ( table_add, [@value] )
VAR FZ =
    MAXX ( table_add, [@value] ) - [0001_销售金额]
VAR path_y = 160 * FZ / FM + 20
VAR TF0 =
    HASONEVALUE ( 'D01_省份表'[F_02_省ID] )
VAR TF1 =
    HASONEFILTER ( 'D01_省份表'[F_04_省简称1] ) 
VAR SVG_start_image = "data:image/svg+xml;utf8," //SVG 图像类型头部。
VAR SVG_start_html = "<svg id='jiaopengzi' width='100' height='200' viewBox='0 0 100 200' xmlns='http://www.w3.org/2000/svg' version='1.1'>" //SVG html类型头部。
VAR SVG_end = "</svg>"//SVG 结束标签。
VAR SVG_defs = "
	<defs>
		<linearGradient id='jiaopengzi-linear' x1='0%' y1='100%' x2='0%' y2='0%'>
			<stop offset='0%' stop-color='#FFFFDD' />
			<stop offset='100%' stop-color='#C19220' />
		</linearGradient>
	</defs>
" 
VAR SVG_content_0 = "
	<rect x='0' y='20' width='32' height='160' fill='url(#jiaopengzi-linear)' />
	<g fill='#1E2F56' font-family='Microsoft Yahei' font-size='10' text-anchor='start' font-weight='bold'>
		<text x='32' y='20' dominant-baseline='text-after-edge'>" & value_max & "</text>
		<text x='32' y='180' dominant-baseline='text-before-edge'>" & value_min & "</text>
	</g>
"// 当没有筛选的时候,path 中间的 text 不出现。
VAR SVG_content_1 = "
	<rect x='0' y='20' width='32' height='160' fill='url(#jiaopengzi-linear)' />
	<path fill='red' stroke='' d='M0 0 L-10 -5 L-10 5 Z' transform='translate(32," & path_y & ")' />
	<g fill='#1E2F56' font-family='Microsoft Yahei' font-size='10' text-anchor='start' font-weight='bold'>
		<text x='32' y='20' dominant-baseline='text-after-edge'>" & value_max & "</text>
		<text x='32' y='" & path_y & "' dominant-baseline='middle'>" & value_ac & "</text>
		<text x='32' y='180' dominant-baseline='text-before-edge'>" & value_min & "</text>
	</g>
"
VAR SVG_content1 =
    IF ( TF0 * TF1, SVG_content_1, SVG_content_0 )
VAR SVG_content =
    SWITCH ( TRUE (), TF0 && TF1, SVG_content_0, TF0, SVG_content_1, SVG_content_0 )
VAR SVG_html = SVG_start_html & SVG_defs & SVG_content & SVG_end
VAR SVG_image = SVG_start_image & SVG_html
RETURN
    SVG_html

Ⅵ、最后在形状地图工具提示中增加区域层级显示。

Tips_Org_Map = 
VAR L0 =
    CALCULATE ( SELECTEDVALUE ( 'D00_大区表'[F_02_大区] ), 'D03_区县表' )
VAR L1 =
    CALCULATE ( SELECTEDVALUE ( 'D01_省份表'[F_05_省简称2] ), 'D03_区县表' )
VAR L2 =
    CALCULATE ( SELECTEDVALUE ( 'D02_城市表'[F_03_城市] ), 'D03_区县表' )
VAR L3 =
    SELECTEDVALUE ( 'D03_区县表'[F_03_区县] )
VAR TF1 =
    HASONEVALUE ( 'D01_省份表'[F_05_省简称2] )
VAR TF2 =
    HASONEVALUE ( 'D02_城市表'[F_03_城市] )
VAR TF3 =
    HASONEVALUE ( 'D03_区县表'[F_03_区县] )
VAR ORG =
    SWITCH (
        TRUE (),
        TF3,
            L0 & "|" & L1 & "|" & L2 & "|" & L3,
        TF2,
            L0 & "|" & L1 & "|" & L2,
        TF1,
            L0 & "|" & L1,
        L0 & "|" & L1
    )
RETURN
    ORG

2、可视化

我们重点介绍案例中的形状地图,其它的内容可以在附件中查看。

159-10

在设置视觉对象格式下面,打开地图设置,映射类型选择:自定义地图;添加上文提到的 TopoJSON 格式的地图,投影根据自身需要选择,一般选择 Mercator 。

注意这里的映射字段,形状地图 TopoJSON 数据清洗过后,只有两个关键字段,一个 adcode 另外一个是 name ,我们使用 adcode 作为唯一表示,因为 name 可能会重复。

省市县分别对应到我们的维度表里面省市县的 ID 。

159-11

图例,根据条件创建度量值,使用三方视觉对象 HTML Content 制作最大值和最小值的颜色过渡图例,当选中地图元素可以显示具体位置。

159-12

在形状地图中可以钻取到下层数据。

159-13

下钻后的页面以及度量值关系,区县的数据同理。

159-14

四、总结

1、形状地图目前还是预览的状态,必须在 Power BI Desktop 中启用。 若要启用“形状地图”,请选择“文件”>“选项和设置”>“选项”>“预览功能”,然后选中“形状地图视觉对象”复选框。

2、目前形状地图还有很多不灵活的地方,比如不能在地图上显示文本标签,地图填充颜色还是写死的,不能通过 DAX 来动态驱动。

3、当前区县一级的 TopoJson 比较大,使用的时候及时保存,避免不要的麻烦。

4、由于历史原因,当前地图数据对于湾湾的数据只有一个大致的,没有更细粒度的数据。更细粒度的数据应该在不远的将来可以使用了。

附件下载

https://jiaopengzi.com/2816.html

视频课

https://jiaopengzi.com/all-course

by 焦棚子

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

159_模型_Power BI 地理分析之形状地图 的相关文章

  • ESP8266 NodeMCU 擦除闪存执行出厂重置

    在本教程中 我们将了解如何在 Windows Linux 和 MacOS 中使用 esptool py 命令行实用程序擦除 ESP8266 的闪存 并讨论为什么以及何时需要执行此操作 与任何电子设备一样 有时您可能需要将 ESP8266 重
  • 学校报名登记收缴费用小程序开发制作

    报名登记收缴费用小程序 适合培训机构 幼儿园 小学 高中 初中 大学等学校 报名登记小程序 微信扫码登记 手机端登记报名信息 数据发送至管理后台 管理员可查阅数据列表 完成了学生报名信息收集 审核 修改 复审 收费 等多项复杂功能 收费可以

随机推荐

  • 蜣螂优化(DBO)算法附MATLAB代码

    目录 一 蜣螂优化 DBO 算法灵感来源 二 蜣螂优化 DBO 算法设计 三 蜣螂优化 DBO 算法MATLAB部分代码 四 运行结果 蜣螂优化 Dung Beetle Optimizer DBO 算法是2022年11月27日提出的 大家可
  • Sentinel服务熔断和降级

    还记得我们前所说的服务降级吗 也就是说我们需要在整个微服务调用链路出现问题的时候 及时对服务进行降级 以防止问题进一步恶化 那么 各位是否有思考过 如果在某一时刻 服务B出现故障 可能就卡在那里了 而这时服务A依然有大量的请求 在调用服务B
  • 29. Divide Two Integers

    这题 Given two integers dividend and divisor divide two integers without using multiplication division and mod operator Re
  • UnityVR--机械臂场景5-记录角度自动旋转

    机械臂已经能够在示教模式下单步旋转了 下一步 我们可以将每个关节旋转的角度记录下来 让机械臂自动旋转到指定位置 1 在UI画布上增加两个按钮 recordButton和AutoButton 一个用来记录每个节点旋转的角度 另一个让机械臂自动
  • 【算法修炼】优先队列

    优先队列 一 最后一块石头的重量 简单 二 数组中两元素的最大乘积 简单 三 根据字符出现频率排序 中等 四 找到和最大的长度为k的子序列 简单 优先队列 也称为堆 Heap 它可以在保证队列的结构下 对队列的内部元素进行排序 可以按照某个
  • Windows上通过CMake编译COLMAP源码操作步骤

    COLMAP源码 https github com colmap colmap 最新的稳定版本位于master分支 最新的开发版本位于dev分支 这里使用master分支进行编译 commit id为1555ff0 官方推荐使用vs2019
  • 高速计数器学习

    S7 1200 CPU 提供了最多 6 个 1214C 高速计数器 其独立于 CPU 的扫描周期进行计数 可测量的单相脉冲频率最高为 100KHz 双相或 A B 相最高为 30KHz 除用来计数外还可用来进行频率测量 高速计数器可用于连接
  • LeetCode刷题复习

    内容参考CyC大佬的LeetCode复习指南 算法思想复习 在考虑更优解时 先从数据状况入手 一般C 1s可以运行 1 0 7 1 0 8 10 7 10 8 107 108次 看有何特点可以利用 如有序 回文 重复 推公式等 1 1双指针
  • spring boot 如何配置Logback

    在 Spring Boot 项目中 Logback 是默认的日志框架 要配置 Logback 你需要创建一个名为 logback spring xml 的配置文件并将其放在项目的 src main resources 目录下 以下是一个详细
  • Unity设置物体旋转角度误区

    小白欢迎评论 共同探讨 共同进步 第一篇Unity的博文 这篇很短 接下来会陆续更新笔记本上之前记得坑 在这里有一个小误区 一般新手都非常容易出的错误 设置物体位置我们都是给transform position赋值 那么问题来了 设置物体的
  • ubuntu 12.04新安装好后需要进行的包升级和清理工作

    根据这么多次的操作经验 我发现 ubuntu系统在新安装好后需要进行一些包的升级和清理工作 不然的话 后续安装各种软件都不顺畅 会出现各种各样的问题 需要进行的包升级和清理工作其实很简单 只需要执行以下两条命令即可 apt get f in
  • 视觉slam g2o 编译出现 Cmake Error:By not providing “FindG2O.cmake““G2OConfig.cmake“ in CMAKE_MODULE_PATH错误

    第一步 这时需要在cmakelist文件中更改几行代码 代码如下 将LIST APPEND CMAKE MODULE PATH PROJECT SOURCE DIR cmake list APPEND CMAKE MODULE PATH X
  • Datawhale 李宏毅机器学习 Task2

    一 回归的定义和举例 定义 Regression 就是找到一个函数 function 通过输入特征 x 输出一个数值 Scalar 举例 股市预测 输入 过去10年股票的变动 新闻咨询 公司并购咨询等 输出 预测明天股市的平均值 自动驾驶
  • 【牛客网】BC146 添加逗号

    一 题目描述 牛客网题目链接 添加逗号 牛客题霸 牛客网 描述 对于一个较大的整数 N 1 lt N lt 2 000 000 000 比如 980364535 我们常常需要一位一位数这个数字是几位数 但是如果在这 个数字每三位加一个逗号
  • 在区块链里打模组化新概念,ALL要彻底实现技术融合并不容易!

    点击上方 蓝色字 可关注我们 编辑 铅笔盒 在今年的达沃斯论坛上 区块链与AI 3D打印等技术一起被列为第四次科技革命的重要技术 有人质疑加密货币 但几乎没有人否认区块链 可以预见接下来的一段时间所有焦点都将聚集在这个行业 区块链技术并不成
  • lua基础——基本语法

    类型 lua是动态类型语言 即变量的类型可以变 通过type可以测试给定变量的类型 下面是例子 python view plain copy print type helloworld
  • OLED拼接屏,有这5大优势,让其在会议商业及影院中常用

    OLED拼接屏是一种高端的显示屏 它由多个OLED屏幕拼接而成 可以实现更大尺寸的显示效果 在北京 OLED拼接屏已经被广泛应用于商业展示 会议室 电影院等场所 成为了展示和传播信息的重要工具 OLED拼接屏的优势 在于其高清晰度 高亮度
  • pandoc markdown 转 word

    安装 https www pandoc org installing html pandoc f markdown t html test md pandoc f html t docx o output docx
  • 软件设计师---下午题2

    下午题2 实体 弱实体 子实体 属性 复合属性 主键属性 联系 两个实体之间的联系 三个实体之间的联系 问题1 问题2 关系模式和主外键 一对一联系转换 一对多联系转换 多对多联系转换 三个实体的联系转换 实体和子实体的转换关系模式 实体
  • 159_模型_Power BI 地理分析之形状地图

    159 模型 Power BI 地理分析之形状地图 声明以下地图元素仅供学习交流所用 如需地图公开使用请提前做好报审工作 一 背景 当企业的体量达到一定体量的时候 保持稳定的增长是非常重要的事情 本案例展示如何用 Power BI 的形状地