ArcPy分析安然产品有哪些?空间分布图制作(附:练习数据)

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

引言

本文围绕ArcPy分析安然产品有哪些?空间分布图制作(附:练习数据)这个任务,演示如何用 ArcPy 读取产品点位数据、统计产品类别、生成空间分布结果,并输出一张可用于汇报或课程作业的空间分布图。

很多 GIS 初学者会遇到类似问题:手里有一份企业门店、产品销售点、项目点或样本点数据,想知道“有哪些类别”“每类有多少”“分别分布在哪里”。如果只在 ArcGIS Pro 里手动点工具,步骤容易漏;如果用 ArcPy 脚本处理,则可以把统计、制图和导出结果固定成可复用流程。

ArcPy分析安然产品有哪些与空间分布图制作流程示意图
ArcPy 产品类别统计与空间分布图制作的基本流程:先检查字段,再统计类别,最后按类别制图输出。

背景

在空间数据分析中,“产品有哪些”通常不是一个纯表格问题,而是一个属性统计 + 空间表达问题。比如练习数据中可能包含以下字段:

  • Product:产品名称或产品类别。
  • Company:企业或品牌名称,例如安然相关产品记录。
  • CityRegion:行政区或市场区域。
  • LongitudeLatitude:经纬度坐标。
  • SalesCount:销售量、数量或样本数。

如果数据已经是点要素类,例如 Shapefile、File Geodatabase Feature Class 或 GeoPackage 图层,可以直接用 ArcPy 读取。如果数据是 Excel 或 CSV,需要先转换为空间点图层。

本文示例默认练习数据已经整理为点要素类,路径类似:

D:GIS_Practiceenran_productsenran_products.gdbproduct_points

字段中包含产品类别字段 Product。如果你的字段名不同,只需要在脚本中替换对应字段即可。

原理

ArcPy 分析安然产品有哪些,核心可以拆成三个步骤。

  1. 读取属性字段:通过 arcpy.da.SearchCursor 遍历产品字段。
  2. 统计唯一类别和数量:用 Python 字典或 collections.Counter 汇总每种产品出现次数。
  3. 制作空间分布图:在 ArcGIS Pro 工程中添加图层,按产品类别进行唯一值符号化,然后导出地图。

这里要注意,ArcPy 本身不是“自动理解业务含义”的工具。它只会根据字段值进行计算。因此,字段是否规范、空值是否处理、类别名称是否统一,会直接影响最终的统计结果。

例如以下值在计算机看来是三个不同类别:

  • Solar Panel
  • solar panel
  • Solar 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("产品字段检查通过。")

如果脚本提示未找到字段,常见原因有三个:

  • 字段名实际叫 PRODUCTproductProd_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 中手动完成以下操作:

  1. 打开 ArcGIS Pro,新建地图工程。
  2. 添加 product_points 点图层。
  3. 右键图层,进入符号系统。
  4. 选择唯一值
  5. 字段选择 Product
  6. 调整颜色、点大小和底图。
  7. 添加图例、比例尺、标题和数据来源说明。
  8. 导出为 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. 把产品名称字段和产品编号字段混用

有些数据同时包含 ProductIDProduct。如果使用编号字段统计,结果可能是代码,不便于阅读;如果使用名称字段统计,则更适合制图和报告。

建议在最终图例中使用可读性更强的产品名称字段。

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 入门练习。它覆盖了属性读取、类别统计、文件输出、地图工程调用和成果验证等常见技能。掌握这套方法后,你可以把“安然产品”替换为门店、设施、样本点、客户点或项目点,快速完成类似的空间分布图制作任务。