#!/usr/bin/env python3 """照片导入的坐标体检与批量换算。 为什么需要它:导入页把「用户选的坐标系」交给 /api/regeo(coord 字段),服务端只对 wgs84 做换算,坐标再 toFixed(6) 回填表单落库。选错一次,显示坐标就一字不差等于 EXIF 原值,在 GCJ-02 底图上偏 350~680m。库里没有 created_at,也没记录导入时的坐标系选择,所以判据只有 原图 EXIF: 库内坐标 == round(EXIF, 6) -> 没转换,需要修 库内坐标 == gcj(round(EXIF, 6)) -> 已转换,正确 (实测 24/24 命中,0 反例) 没有原图时退化为「sp > rond 基线上限 = 站点新建」,只能靠 --include-unverified 才动。 用法: python tools/photo_coord_audit.py --site https://life.shiroko.one --cookie "uid|tok" \ --photos D:/photos/libo --photos D:/photos/foshan --out fix.csv # 确认清单后加 --apply """ import argparse import csv import html as htmllib import io import json import math import os import re import socket import sys import time import urllib.error import urllib.parse import urllib.request # 生产机只监听 IPv4:默认解析出 IPv6 会先撞在超时上,而 urllib 不会自动回退 _gai = socket.getaddrinfo def _gai_prefer_v4(host, port, family=0, type=0, proto=0, flags=0): infos = _gai(host, port, family, type, proto, flags) v4 = [i for i in infos if i[0] == socket.AF_INET] return v4 or infos socket.getaddrinfo = _gai_prefer_v4 UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) rond-coord-audit" FORM_RE = re.compile(r'