把战史坐标落进 GIS:一次行军路线复原的踩坑记录

去年底帮朋友整理一份行军路线材料,手上只有一份回忆录里摘出来的地名列表和一叠 1944 年的 1:50000 地形图扫描件。地名是当时的旧称,图上也是旧称,和现在的行政区划对不上。数据量不大,六十多个点,但每一个都得手工确认。

我的做法是先建立一个对照表,再走 QGIS 加载和投影。核心是下面这段临时的转换脚本,把经纬度和旧称一起塞进去,方便回头查哪一个是猜的:

import csv
# 字段:old_name, lat, lon, year, source, confidence
rows = []
with open('waypoints.csv', encoding='utf-8') as f:
    for r in csv.DictReader(f):
        rows.append({
            'name': r['old_name'],
            'lat': float(r['lat']) if r['lat'] else None,
            'lon': float(r['lon']) if r['lon'] else None,
            'conf': r.get('confidence', 'low')
        })

# 只导出高置信度点做第一版线
high = [r for r in rows if r['conf'] == 'high' and r['lat']]
with open('route_v1.csv', 'w', newline='', encoding='utf-8') as f:
    w = csv.DictWriter(f, fieldnames=['name', 'lat', 'lon'])
    w.writeheader()
    for r in high:
        w.writerow({'name': r['name'], 'lat': r['lat'], 'lon': r['lon']})

导入 QGIS 之后先看投影:老地图扫描件如果按 WGS84 直接套,几百米到一两公里的偏移是常态。我的做法是把扫描件用控制点配准,控制点选在图上标注清楚的桥、岔路口、等高线交点,每条边至少三个,误差能压到图上 1 毫米以内。配准完再叠到矢量底图上,旧称落点就能肉眼对。

为什么这么做:地名对不上不是数据问题,是坐标参照系和地名沿革叠加在一起的问题。先分置信度、再做配准,代价是要多花半天手工点控制点,但换来的是后面每改一个点不用重做一遍。

失效的地方也在这:山区等高线密集处配准误差会被放大,河谷地带地名迁移更常见,旧称对应的村子可能整体搬过。我踩过一个坑,把一个名字相似但实际隔了一条山脊的村子当成了同一个点,路线凭空拉直了十几公里。后来强制每个点必须有第二个来源交叉,否则标 low,不进主线路。

如果你也做过这类复原,想问问:遇到同一地名在不同年份对应不同位置时,你是按最早出现的坐标锚定,还是按行军时间最近的那份材料锚定?

0
赞同度 100% · 0 条评论 · 5 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。