首页 软件与工具 ArcMap arcmap教程怎样导出坐标?最全arcmap教程入门解析

arcmap教程怎样导出坐标?最全arcmap教程入门解析

作者: GIS研习社 更新时间:2025-08-27 17:09:07 分类:ArcMap

很多同学在 ArcMap 做完制图或分析后,会被“如何把要素的坐标导出来”难住:点要导出经纬度还是投影坐标?线面该取哪个点代表?数据框坐标系与图层坐标系不一致会不会错位?作为实践导向的总结,我将用通俗但严谨的方式,把常见方法、注意事项与自动化方案讲清楚。

arcmap教程怎样导出坐标?最全arcmap教程入门解析

基础认知:坐标值是什么、来自哪里?

在 ArcGIS Desktop(ArcMap)里,坐标值本质上来自几何对象(Geometry)。同一个地物,在不同坐标参考系(Spatial Reference)下会呈现不同的数字。理解这一点,比“按哪个按钮”更重要。

  • 地理坐标系(GCS):单位为度(经纬度)。示例:WGS 1984。
  • 投影坐标系(PCS):单位常为米或英尺。示例:CGCS2000 / 高斯-克吕格某带、Web Mercator、UTM。
  • 数据框 vs 图层坐标系:ArcMap 的数据框可以“动态重投影”显示;而工具计算时可能以“图层自身坐标系”为准。选择不当,数字会“看似正常却单位错误”。

因此,在导出坐标前,先回答两个问题:我要导出到哪个坐标系(度还是米)?我要导出的是哪个几何位置(点坐标、线的中点、面的质心或顶点)?

方法一:零代码,内置工具快速导出

这是多数人最稳妥的路径,适合点、线、面的“代表点”坐标导出。

  1. 检查坐标系:在内容列表中右键图层→属性→源信息,核对坐标系;再检查数据框坐标系(数据框→属性→坐标系)。确保你知道“以谁为准”。
  2. 点图层直接生成 XY 字段
    • 使用 工具箱→数据管理→要素→“Add XY Coordinates”。它会在属性表新增字段 POINT_X、POINT_Y(以及 Z/M 若存在)。
    • 注意:该工具的计算基于图层数据源的坐标系,不是数据框。若你需要经纬度而数据源是投影坐标,先对图层投影到目标坐标系或用下面的“计算几何”。
  3. 线/面或需要特定坐标系时:计算几何
    • 在属性表新建两个字段(类型:Double),命名如 X、Y。
    • 右键字段→“计算几何”,选择“X 坐标/质心(或点坐标/顶点)”;勾选“使用数据框坐标系”,即可在数据框坐标系(例如 WGS84)下生成数值。
    • 对于线,可选择“长度加权中心”不合适时,优先使用“几何质心”或“线中点”(中点可通过字段计算器或地理处理工具实现,见下文)。
  4. 导出为表格
    • 属性表左上角菜单→导出→保存为 dBASE 或 .txt;或用 工具箱→转换工具→到地理数据库→“Table To Table” 输出到 .csv。
    • 建议输出 CSV 并在表头说明坐标系与单位。
OIDNAMEPOINT_XPOINT_Y备注
1A116.3913539.90750WGS84,经纬度
2B500123.124420012.77UTM 50N,米

方法二:字段计算器(Python 解析器),灵活取点

当你需要“点取 first vertex、线取中点、面取质心”或“在计算时就转坐标系”,字段计算器的 Python 解析器非常好用。

基础:直接读取几何属性(使用图层坐标系)

  1. 新增字段 X、Y(Double)。
  2. 右键字段→“字段计算”,选择解析器为 Python,勾选“显示代码块”。
  3. 常用表达式:
    • 点要素:在 X 字段表达式填 !SHAPE!.firstPoint.X;在 Y 字段填 !SHAPE!.firstPoint.Y
    • 线/面代表点(质心):X 用 !SHAPE!.centroid.X;Y 用 !SHAPE!.centroid.Y
    • 线中点(测地或按线路径):可在代码块内定义函数,表达式调用:
# 代码块(Python)
def midx(shp):
    return shp.positionAlongLine(0.5, True).firstPoint.X

def midy(shp):
    return shp.positionAlongLine(0.5, True).firstPoint.Y
# X 字段表达式
midx(!SHAPE!)

# Y 字段表达式
midy(!SHAPE!)

进阶:计算时就投影到目标坐标系(例如 WGS84)

# 代码块
import arcpy
sr = arcpy.SpatialReference(4326)  # WGS 1984
def projX(shp):
    return shp.projectAs(sr).centroid.X
def projY(shp):
    return shp.projectAs(sr).centroid.Y
# X 字段表达式
projX(!SHAPE!)

# Y 字段表达式
projY(!SHAPE!)

提示:

  • 字段计算器默认使用图层自身坐标系;若使用 projectAs,请确保本地已安装正确的坐标变换方法(尤其国内坐标系间转换)。
  • 对多部件几何(multipart),centroid 默认会对整体求质心;若需针对每一部件,可先“Explode”或用地理处理将多部件拆分。

方法三:批量自动化导出为 CSV(ArcPy)

当数据量大、需要可复用脚本时,推荐使用 arcpy.da 搜索游标导出。

# coding: utf-8
import arcpy, csv, os

fc = r"C:Datamy.gdbfeatures"   # 输入要素类或图层
out_csv = r"C:Datacoords.csv"
target_sr = arcpy.SpatialReference(4326)  # 目标坐标系(WGS 1984)

fields = ["OID@", "SHAPE@", "NAME"]  # 根据需要附带属性
rows = []

with arcpy.da.SearchCursor(fc, fields) as cur:
    for oid, geom, name in cur:
        if not geom:
            continue
        # 代表点:点要素为自身,线/面取质心
        g = geom.projectAs(target_sr) if geom.spatialReference and target_sr else geom
        p = g.centroid
        rows.append((oid, name, p.X, p.Y))

with open(out_csv, "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["OID", "NAME", "X", "Y", "SRID"])
    for r in rows:
        w.writerow([r[0], r[1], "{:.8f}".format(r[2]), "{:.8f}".format(r[3]), target_sr.factoryCode if target_sr else ""])
print("OK:", out_csv)

要导出点要素的真实观测坐标,可将代表点改为 geom.firstPoint;要导出线中点,用 geom.positionAlongLine(0.5, True).firstPoint;若要导出所有顶点,见下一节。

进阶:导出顶点坐标或沿线加密点

当下游需要每个顶点或等距采样点时,推荐两种路线。

  • 无代码工作流
    1. 工具箱→数据管理→要素→“Feature Vertices To Points”(可选 ALL、START、END)。
    2. 再对输出点图层使用“Add XY Coordinates”或“计算几何”,最后导出表格。
    3. 等距采样:工具箱→数据管理→要素→“Generate Points Along Lines”,指定间距后重复上一步。
  • ArcPy 精细控制
# 导出所有顶点坐标(含部件与环)
import arcpy, csv

fc = r"C:Datamy.gdbpoly_or_line"
sr = arcpy.SpatialReference(4326)  # 若需要统一到 WGS84
out_csv = r"C:Datavertices.csv"

with open(out_csv, "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["OID", "PART", "VERT_IDX", "X", "Y"])
    with arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]) as cur:
        for oid, geom in cur:
            if not geom:
                continue
            g = geom.projectAs(sr) if sr else geom
            part_id = 0
            for part in g:  # 每个部件(外环/内环)
                vert_id = 0
                for pt in part:
                    if pt:  # 跳过可能的 None(表示环分隔)
                        w.writerow([oid, part_id, vert_id, "{:.8f}".format(pt.X), "{:.8f}".format(pt.Y)])
                        vert_id += 1
                part_id += 1
print("OK:", out_csv)

常见陷阱与校验清单

  • 单位错位:导出数值“看着很大/很小”,多数是 PCS 与 GCS 混用。明确“需要度还是米”。
  • 坐标系未定义或定义错误:Define Projection 与 Project 是两件事。未定义请先正确定义,再 Project。
  • 动态重投影误解:数据框重投影仅影响显示;某些工具(如 Add XY Coordinates、字段计算器直取 firstPoint/centroid)默认用图层坐标系。
  • 多部件与洞:面的几何质心可能落在洞内;需要“真实质心”或“点在面内”的,可选 true centroid 或用“Feature To Point(Inside)”。
  • 经度跨 180°:跨经线的线/面,质心可能不直观;可按业务改用“加权中点”或分割后处理。
  • 精度与格式:Double 字段保留小数位建议 6–8 位;CSV 导出时写明坐标系与单位,避免二次误解。
  • 变换方法:不同大地基准间转换(例如 CGCS2000 ↔︎ WGS84)需合适的地理坐标变换参数;在项目中统一约定并固化为模型或脚本。

工作流模板(可直接照做)

  1. 明确目标坐标系与代表位置(点/中点/质心/顶点)。
  2. 检查并修正图层的坐标系定义,必要时使用 Project 生成目标坐标系副本。
  3. 点用 Add XY;线/面或跨坐标系计算用“计算几何”或字段计算器 Python。
  4. 导出表格为 CSV(Table To Table),在表头或元数据写明坐标系与单位。
  5. 抽检 3–5 个要素:在数据框开启坐标捕捉或用 Identify 工具核对数值与位置一致性。

结语

要点回顾:坐标导出=明确坐标系+选定代表点+正确工具路径。零代码方法快捷稳妥;字段计算器灵活好用;ArcPy 适合批量与可复用。任何“数值对不上”的问题,十有八九是坐标系与单位造成。

你的团队更常用哪种坐标导出方式?是否遇到过“值对、图不对”的情况?欢迎把案例与问题发给我,我们一起打磨成最佳实践。也欢迎关注 GIS研习社(gisyxs.com),与同行持续切磋。

参考文献

  • ArcGIS Desktop: Add XY Coordinates(Data Management)
  • ArcMap: Calculating Geometry Attributes
  • Field Calculator: Python Examples
  • arcpy.da.SearchCursor
  • Feature Vertices To Points
  • Generate Points Along Lines
相关文章