← 精品代码功能 · 可复用实现库

精品功能 02:多格式地理数据解析(文本 / GeoJSON / GPX / KML)

{ points: [...], tracks: [...], errors: [...] } 才能用。

核心实现

XML 用正则解析,但要同时支持成对标签和自闭合标签(第 25-33 行):

/** 扫描同名标签,支持 <tag ...>...</tag> 和 <tag ... /> */
function eachTag(xml, tag, cb) {
  const re = new RegExp('<' + tag + '\\b([^>]*)>([\\s\\S]*?)</' + tag + '>|<' + tag + '\\b([^>]*)/>', 'g');
  let m;
  while ((m = re.exec(xml))) {
    const isPair = m[1] !== undefined;
    cb(attrsOf(isPair ? m[1] : (m[3] || '')), isPair ? m[2] : '');
  }
}

坐标文本容错解析(第 80-119 行)——这是最能体现"面向真实用户输入"的一段:

/**
 * 逐行解析,容错优先:
 *   116.39,39.9            (经度在前,默认)
 *   39.9 116.39            (纬度在前,自动识别)
 *   天安门 116.39,39.9     (前后多余的文字当名称)
 *   # 开头的行跳过
 * 两个值都在 ±90 内时无法自动判断(比如新疆 75.99,39.47),
 * 靠 options.latFirst 决定,UI 上给个开关。
 */

实现要点:按多种分隔符切分(/[\s,,;;\t|/]+/)、
用数值范围自动判断经纬顺序、无法判断时交给 UI 开关、
非法行记进 errors 而不是抛异常。

格式识别很简单(第 59-66 行):首字符 {/[ → GeoJSON,
含 <gpx → GPX,含 <kml → KML,否则纯文本。

设计亮点

  1. 无 DOM 依赖:正则代替 DOMParser,才能在 Node 里测试、在无浏览器环境运行
  2. 容错优先,不抛异常:非法行进 errors 数组,合法行照常解析——永远给用户部分结果
  3. 兼容真实世界的脏数据:中文逗号、# 注释、自闭合标签、实体转义
  4. 无法判断时给开关:技术上做不到 100% 自动,就把决定权交给用户(latFirst)
  5. 统一出口 parseAny():调用方不用管格式

可复用性评估

开源化建议

对照开源

相关课程

第 18 课(纯函数与脱离平台测试)