1. 项目背景与需求分析
张雪机车作为国内新兴的摩托车品牌,近年来在全国范围内快速扩张经销网络。随着门店数量突破300家,传统的Excel表格管理方式已经无法满足业务需求。市场部门经常遇到这些问题:
- 无法直观判断区域覆盖是否合理
- 难以评估新店选址与现有门店的辐射范围重叠情况
- 跨区域调货时缺乏地理距离参考
- 向投资人展示扩张成果时缺乏视觉冲击力
我们决定采用QGIS这款开源地理信息系统软件,将全国门店数据转化为空间可视化地图。相比商业GIS软件,QGIS具有以下优势:
- 完全免费且开源,没有版权风险
- 支持Windows/macOS/Linux全平台
- 丰富的插件生态(超过1000个官方插件)
- 可直接处理CSV、Excel等常见业务数据格式
提示:QGIS最新LTR(长期支持)版本为3.34,建议企业用户选择此版本而非最新开发版,确保稳定性。
2. 数据准备与清洗
2.1 原始数据获取
我们从ERP系统导出了包含以下字段的CSV文件:
code复制门店编号,门店名称,省份,城市,地址,经度,纬度,开业日期,月均销量,店员人数
关键问题发现:
- 15%的门店缺少经纬度坐标
- 部分地址存在"XX路XX号"与"XX路XX号XX大厦"的不一致格式
- 新开门店的月均销量字段为空值
2.2 数据清洗流程
使用Python的pandas库进行预处理:
python复制import pandas as pd
# 读取原始数据
df = pd.read_csv('stores_raw.csv', encoding='gbk')
# 坐标缺失处理
def fill_missing_coords(row):
if pd.isna(row['经度']):
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="store_locator")
location = geolocator.geocode(row['地址'])
row['经度'], row['纬度'] = location.longitude, location.latitude
return row
df = df.apply(fill_missing_coords, axis=1)
# 统一地址格式
df['地址'] = df['地址'].str.replace(r'(\w+路\d+号).*', r'\1', regex=True)
# 保存清洗后数据
df.to_csv('stores_clean.csv', index=False)
注意:使用地理编码API时需注意请求频率限制,建议添加time.sleep(1)避免被封禁。
3. QGIS基础环境配置
3.1 软件安装建议
针对不同操作系统推荐以下版本:
- Windows:QGIS 3.34.5 LTR(通过OSGeo4W安装器)
- macOS:QGIS 3.34.5(从官网dmg安装)
- Ubuntu:qgis 3.34.5+dfsg-1~ubuntu1(官方PPA源)
安装后需要配置:
- 中文界面:Settings → Options → Locale → 选择中文
- 坐标系预设:Settings → Options → CRS → 默认选择EPSG:4326(WGS84)
- 插件管理:安装QuickMapServices插件获取在线底图
3.2 项目文件结构
建议采用以下目录结构:
code复制/project
├── /data
│ ├── stores_clean.csv # 门店数据
│ └── china_border.shp # 中国边界矢量数据
├── /output
│ ├── heatmap.tif # 热力图输出
│ └── stores_map.pdf # 最终成果图
└── stores_project.qgz # QGIS工程文件
4. 空间数据导入与处理
4.1 CSV数据图层化
- 通过"图层"→"添加图层"→"添加文本数据图层"导入CSV
- 关键参数设置:
- 文件编码:GBK(处理中文地址)
- X字段:经度
- Y字段:纬度
- 几何图形CRS:EPSG:4326
4.2 空间参考统一化
所有图层需要统一到相同坐标系:
python复制# 通过PyQGIS代码批量处理
for layer in QgsProject.instance().mapLayers().values():
if layer.crs().authid() != 'EPSG:4547':
params = {
'INPUT': layer,
'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:4547'),
'OUTPUT': 'memory:'
}
reprojected = processing.run("native:reprojectlayer", params)['OUTPUT']
QgsProject.instance().addMapLayer(reprojected)
4.3 数据可视化设计
4.3.1 基础点位图
采用渐变色分类渲染:
- 月销量<50:红色圆点(半径5mm)
- 50≤销量<200:橙色圆点(半径7mm)
- 销量≥200:绿色圆点(半径9mm)
设置方法:
- 右键图层 → 属性 → 符号化
- 选择"分级"渲染类型
- 值字段选择"月均销量"
- 设置分类模式和符号样式
4.3.2 热力图生成
使用Heatmap插件生成销量密度图:
- 插件 → 管理并安装 → 搜索"Heatmap"
- 设置参数:
- 半径:20公里
- 像素大小:500
- 衰减系数:0.8
- 输出为GeoTIFF格式
5. 高级空间分析技巧
5.1 服务半径分析
使用"矢量"→"研究工具"→"缓冲区"功能:
- 输入图层:门店点位
- 距离:根据城市等级设置:
markdown复制
| 城市级别 | 半径(km) | 颜色 | |----------|----------|---------| | 一线城市 | 15 | #FF0000 | | 二线城市 | 25 | #FFA500 | | 其他 | 35 | #FFFF00 | - 输出样式:50%透明度的填充
5.2 竞品对比分析
叠加竞争对手门店数据后,使用"矢量"→"空间查询"工具:
- 找出我方门店5公里范围内有竞品的区域
- SQL查询语句:
sql复制SELECT a.门店编号, b.竞品名称 FROM 我们的门店 AS a, 竞品门店 AS b WHERE ST_Distance(a.geometry, b.geometry) < 5000 - 结果导出为新的CSV文件供市场部分析
6. 成果输出与优化
6.1 打印布局设计
创建专业级输出图纸:
- 项目 → 新建打印布局
- 添加以下元素:
- 主地图(占版面的70%)
- 图例(右侧竖排)
- 比例尺(左下角)
- 公司Logo(右上角)
- 动态标签(自动显示生成日期)
6.2 交互式地图发布
通过QGIS2Web插件生成网页版地图:
- 设置弹出窗口内容:包含门店照片、联系方式等
- 选择Leaflet作为输出框架
- 自定义CSS美化界面:
css复制.store-popup { max-width: 300px; font-family: "Microsoft YaHei"; } .high-sales { background-color: #e6ffe6; }
6.3 性能优化技巧
当处理全国数据时:
- 创建空间索引:
python复制processing.run("native:createspatialindex", {'INPUT':'stores_layer'}) - 按省份设置图层可见性范围
- 对销量字段建立属性索引
7. 常见问题解决方案
7.1 中文乱码处理
在Layer Properties → Source → Data Source Encoding选择:
- GBK(对于Windows生成的文件)
- UTF-8(对于macOS/Linux生成的文件)
7.2 坐标偏移修正
当发现点位偏移时:
- 确认所有图层CRS一致
- 检查CSV中的坐标是否WGS84格式
- 使用"矢量"→"地理处理工具"→"重投影图层"转换坐标系
7.3 插件冲突处理
典型冲突场景:
- QuickMapServices与Google Maps插件
- 多个热力图插件同时安装
解决方法:
- 通过"插件"→"管理并安装"→"已安装"禁用冲突插件
- 重置QGIS设置:删除
~/.local/share/QGIS目录(Linux/macOS)
8. 项目成果应用
最终可视化成果在张雪机车内部应用于:
-
市场决策支持
- 识别华东地区覆盖空白(图例显示5个潜在城市)
- 发现成都门店过密(3家店服务半径重叠率达40%)
-
供应链优化
- 建立基于地理距离的调货模型
- 将平均配件配送时间缩短18%
-
投资人汇报
- 动态展示2019-2023年扩张路径
- 用热力图直观显示核心销售区域
这套方案后续还被应用于:
- 售后服务网点规划
- 骑行路线热点分析
- 区域营销效果评估
实际部署时,我们建议:
- 每月更新一次数据版本
- 建立标准的QGIS工程模板
- 培训区域经理使用基础查看功能
- 将核心分析流程写成PyQGIS脚本自动化运行
