ArcPy分析安然产品有哪些?空间分布图制作(附:练习数据)
引言
本文围绕ArcPy分析安然产品有哪些?空间分布图制作(附:练习数据)这个任务,演示如何用 ArcPy 读取产品点位数据、统计产品类别、生成空间分布结果,并输出一张可用于汇报或课程作业的空间分布图。
很多 GIS 初学者会遇到类似问题:手里有一份企业门店、产品销售点、项目点或样本点数据,想知道“有哪些类别”“每类有多少”“分别分布在哪里”。如果只在 ArcGIS Pro 里手动点工具,步骤容易漏;如果用 ArcPy 脚本处理,则可以把统计、制图和导出结果固定成可复用流程。

背景
在空间数据分析中,“产品有哪些”通常不是一个纯表格问题,而是一个属性统计 + 空间表达问题。比如练习数据中可能包含以下字段:
- Product:产品名称或产品类别。
- Company:企业或品牌名称,例如安然相关产品记录。
- City 或 Region:行政区或市场区域。
- Longitude、Latitude:经纬度坐标。
- Sales 或 Count:销售量、数量或样本数。
如果数据已经是点要素类,例如 Shapefile、File Geodatabase Feature Class 或 GeoPackage 图层,可以直接用 ArcPy 读取。如果数据是 Excel 或 CSV,需要先转换为空间点图层。
本文示例默认练习数据已经整理为点要素类,路径类似:
D:GIS_Practiceenran_productsenran_products.gdbproduct_points
字段中包含产品类别字段 Product。如果你的字段名不同,只需要在脚本中替换对应字段即可。
原理
ArcPy 分析安然产品有哪些,核心可以拆成三个步骤。
- 读取属性字段:通过
arcpy.da.SearchCursor遍历产品字段。 - 统计唯一类别和数量:用 Python 字典或
collections.Counter汇总每种产品出现次数。 - 制作空间分布图:在 ArcGIS Pro 工程中添加图层,按产品类别进行唯一值符号化,然后导出地图。
这里要注意,ArcPy 本身不是“自动理解业务含义”的工具。它只会根据字段值进行计算。因此,字段是否规范、空值是否处理、类别名称是否统一,会直接影响最终的统计结果。
例如以下值在计算机看来是三个不同类别:
Solar Panelsolar panelSolar Panel
因此,在正式统计之前,建议先做字段清洗,至少检查空格、大小写、缺失值和异常类别。
步骤
步骤一:准备练习数据和工作空间
建议使用 File Geodatabase 存放练习数据,避免 Shapefile 字段名长度限制、中文编码和字段类型问题。
推荐目录结构如下:
D:GIS_Practiceenran_products
├─ enran_products.gdb
│ └─ product_points
├─ output
│ ├─ product_summary.csv
│ └─ product_distribution.png
└─ scripts
└─ product_distribution.py
如果你使用 ArcGIS Pro 自带 Python 环境运行脚本,可以在 ArcGIS Pro 的 Python 窗口、Notebook,或外部 IDE 中调用对应的 conda 环境。
步骤二:检查字段是否存在
在分析之前,先确认数据里是否存在产品字段。下面脚本会列出图层字段,并检查 Product 字段是否可用。
import arcpy
import os
fc = r"D:GIS_Practiceenran_productsenran_products.gdbproduct_points"
product_field = "Product"
fields = [f.name for f in arcpy.ListFields(fc)]
print("字段列表:")
for field in fields:
print(field)
if product_field not in fields:
raise ValueError(f"未找到字段:{product_field},请检查产品类别字段名。")
print("产品字段检查通过。")
如果脚本提示未找到字段,常见原因有三个:
- 字段名实际叫
PRODUCT、product或Prod_Name。 - Excel 转要素类时字段名被自动修改。
- Shapefile 字段名超过 10 个字符后被截断。
步骤三:统计安然产品有哪些
下面使用 arcpy.da.SearchCursor 读取产品字段,并统计每种产品出现次数。
import arcpy
from collections import Counter
fc = r"D:GIS_Practiceenran_productsenran_products.gdbproduct_points"
product_field = "Product"
counter = Counter()
with arcpy.da.SearchCursor(fc, [product_field]) as cursor:
for row in cursor:
value = row[0]
if value is None:
value = "未填写"
else:
value = str(value).strip()
if value == "":
value = "未填写"
counter[value] += 1
print("产品类别统计结果:")
for product, count in counter.most_common():
print(product, count)
运行后,你会得到类似结果:
产品类别统计结果:
天然气服务 35
电力交易 28
能源咨询 16
宽带服务 9
未填写 3
这个结果回答了“安然产品有哪些”的第一个问题:产品类别清单和每类数量。但如果要进一步表达空间分布,还需要把这些类别放回地图中观察。
步骤四:导出产品类别统计表
为了方便写报告或继续分析,可以把统计结果导出为 CSV 文件。
import csv
import os
from collections import Counter
import arcpy
fc = r"D:GIS_Practiceenran_productsenran_products.gdbproduct_points"
product_field = "Product"
out_csv = r"D:GIS_Practiceenran_productsoutputproduct_summary.csv"
os.makedirs(os.path.dirname(out_csv), exist_ok=True)
counter = Counter()
with arcpy.da.SearchCursor(fc, [product_field]) as cursor:
for row in cursor:
value = row[0]
value = "未填写" if value is None else str(value).strip()
if value == "":
value = "未填写"
counter[value] += 1
with open(out_csv, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["Product", "Count"])
for product, count in counter.most_common():
writer.writerow([product, count])
print(f"统计表已导出:{out_csv}")
这里使用 utf-8-sig 编码,是为了让中文 CSV 在 Excel 中打开时不容易出现乱码。
步骤五:在 ArcGIS Pro 中制作空间分布图
如果只是快速制图,可以在 ArcGIS Pro 中手动完成以下操作:
- 打开 ArcGIS Pro,新建地图工程。
- 添加
product_points点图层。 - 右键图层,进入符号系统。
- 选择唯一值。
- 字段选择
Product。 - 调整颜色、点大小和底图。
- 添加图例、比例尺、标题和数据来源说明。
- 导出为 PNG 或 PDF。
如果你想用 ArcPy 自动完成制图,需要有一个提前配置好的 ArcGIS Pro 工程模板,例如:
D:GIS_Practiceenran_productstemplateproduct_map.aprx
模板中建议包含一个地图、一个布局和一个地图框。这样脚本只需要替换数据源并导出即可。
步骤六:使用 ArcPy 导出空间分布图
下面是一个基于 ArcGIS Pro 工程模板导出地图的示例。它适合用于课程练习、批量制图或自动化报告。
import arcpy
import os
aprx_path = r"D:GIS_Practiceenran_productstemplateproduct_map.aprx"
fc = r"D:GIS_Practiceenran_productsenran_products.gdbproduct_points"
out_png = r"D:GIS_Practiceenran_productsoutputproduct_distribution.png"
os.makedirs(os.path.dirname(out_png), exist_ok=True)
aprx = arcpy.mp.ArcGISProject(aprx_path)
m = aprx.listMaps()[0]
layout = aprx.listLayouts()[0]
# 添加产品点图层
layer = m.addDataFromPath(fc)
layer.name = "安然产品点位"
# 缩放到图层范围
map_frame = layout.listElements("MAPFRAME_ELEMENT")[0]
map_frame.camera.setExtent(map_frame.getLayerExtent(layer, False, True))
# 导出布局
layout.exportToPNG(out_png, resolution=300)
aprx.saveACopy(r"D:GIS_Practiceenran_productsoutputproduct_map_result.aprx")
print(f"空间分布图已导出:{out_png}")
需要说明的是,唯一值符号化在不同 ArcGIS Pro 版本中脚本写法会有差异。为了稳定,初学者可以先在模板工程中手动设置好符号系统,然后让 ArcPy 负责添加数据、更新范围和导出地图。
步骤七:验证空间分布图是否正确
空间分布图导出后,不要只看图片是否好看,还要检查结果是否可信。
- 地图上的点数量是否与属性表记录数一致。
- 图例中的产品类别是否与 CSV 统计表一致。
- 是否存在“未填写”“其他”“空白”等异常类别。
- 点位是否落在合理范围内,例如经纬度是否颠倒。
- 坐标系是否正确,是否出现整体偏移。
- 导出图片分辨率是否满足报告或打印要求。
如果点位全部落在海上、边界外或集中在一个奇怪位置,优先检查坐标字段和坐标系,而不是急着调整符号。
常见坑
1. 把产品名称字段和产品编号字段混用
有些数据同时包含 ProductID 和 Product。如果使用编号字段统计,结果可能是代码,不便于阅读;如果使用名称字段统计,则更适合制图和报告。
建议在最终图例中使用可读性更强的产品名称字段。
2. 字段里有空格导致重复类别
能源咨询 和 能源咨询 看起来一样,但程序会认为是两个值。脚本中使用 strip() 可以去掉首尾空格。
3. 中文 CSV 打开乱码
如果统计结果导出后在 Excel 中乱码,优先尝试使用 utf-8-sig 编码,而不是普通 utf-8。
4. 经纬度字段顺序写反
经纬度建点时,X 应该对应经度,Y 应该对应纬度。很多空间分布图异常都是因为把纬度当成 X、经度当成 Y。
5. 坐标系没有定义
数据看起来有坐标,但图层没有正确的空间参考,也会导致叠加错误。经纬度数据通常使用 GCS WGS 1984,但仍需根据数据来源确认。
6. 只统计数量,不看空间聚集
“产品有哪些”只是属性层面的答案。空间分析还应继续观察每类产品是否集中在某些区域,是否存在区域缺口,是否与市场、交通或人口分布有关。
方法比较
| 方法 | 适合场景 | 优点 | 局限 |
|---|---|---|---|
| ArcGIS Pro 手动统计和制图 | 一次性作业、课堂练习、小数据量 | 直观,容易检查符号和图面效果 | 重复操作多,不适合批量处理 |
| ArcPy 属性统计 | 需要快速统计产品类别和数量 | 可复用,可批量处理,结果稳定 | 需要理解字段名、路径和 Python 基础 |
| ArcPy 自动导出地图 | 批量制图、自动化报告、固定模板输出 | 效率高,适合规范化流程 | 模板工程需要提前设置,符号化脚本有版本差异 |
| Excel 透视表 | 只看产品类别数量,不关心空间位置 | 上手快,适合表格汇总 | 无法直接判断空间分布和坐标问题 |
| QGIS 或 GeoPandas | 开源环境、跨平台处理 | 工具开放,脚本灵活 | 与 ArcGIS Pro 工程制图体系不完全一致 |
如果你的目标是学习 ArcPy,推荐采用“ArcPy 统计 + ArcGIS Pro 模板制图”的组合。它既能训练脚本能力,又能保证最终地图的表达质量。
检查清单
在提交作业或发布成果前,可以按下面清单逐项检查。
- 是否确认了产品类别字段名称。
- 是否处理了空值、空字符串和首尾空格。
- 是否导出了产品类别统计表。
- 统计表中的类别数量是否与图例一致。
- 点数据是否具有正确坐标系。
- 经度和纬度是否没有写反。
- 空间分布图是否包含图例、比例尺和标题。
- 地图范围是否完整覆盖所有产品点。
- 输出图片分辨率是否满足使用场景。
- 脚本路径是否使用原始字符串
r"...",避免反斜杠转义错误。
FAQ
ArcPy分析安然产品有哪些,必须使用 ArcGIS Pro 吗?
如果你要使用 ArcPy,通常需要安装 ArcGIS Pro 或 ArcGIS Desktop,并使用其授权环境。本文以 ArcGIS Pro 的 ArcPy 环境为主。如果只做开源分析,也可以使用 GeoPandas,但脚本和制图流程会不同。
练习数据是 CSV,能不能直接做空间分布图?
可以,但需要先根据经纬度字段创建点要素。关键是确认 X 字段为经度、Y 字段为纬度,并定义正确坐标系。转换完成后,再按本文流程统计产品类别和制作空间分布图。
为什么统计出来的产品类别比预期多?
常见原因是字段值不统一,例如大小写不同、前后有空格、同一产品有多个写法,或者存在空值。建议先做字段清洗,再统计唯一值。
ArcPy 可以自动设置唯一值符号吗?
可以,但不同 ArcGIS Pro 版本对符号系统对象的支持和写法可能不同。实际项目中,更稳妥的做法是先在模板工程中设置好符号,再用 ArcPy 更新数据源、地图范围和导出结果。
空间分布图中点位偏移怎么办?
优先检查坐标系、经纬度顺序和数据来源。如果是经纬度数据,通常应使用地理坐标系;如果与底图叠加出现明显偏移,要确认是否存在投影定义错误或坐标转换缺失。
产品类别很多,地图图例太乱怎么办?
可以把低频类别合并为“其他”,或者只展示前几类重点产品。另一种方法是分产品类别分别导出多张图,而不是把所有类别挤在一张地图上。
结论
ArcPy分析安然产品有哪些,重点不是单纯写一个统计脚本,而是建立一条完整流程:检查字段、清洗类别、统计数量、验证坐标、制作空间分布图并导出成果。
对于 GIS 学习者来说,这个案例很适合作为 ArcPy 入门练习。它覆盖了属性读取、类别统计、文件输出、地图工程调用和成果验证等常见技能。掌握这套方法后,你可以把“安然产品”替换为门店、设施、样本点、客户点或项目点,快速完成类似的空间分布图制作任务。