支持省市区县乡镇村GeoJSON 在线预览编辑下载器开源:一个纯前端实现的拆解

简介: 这是一个纯前端、零依赖的GeoJSON轻量预览编辑器,支持本地打开、WGS84坐标渲染、要素查看/编辑,并可导出为GeoJSON/KML/SVG/CSV/PNG。数据不上传,双击index.html即用,开箱即用,适合快速验图、格式转换与二次集成。

背景

日常处理行政区划、POI、轨迹等 GeoJSON 数据时,经常需要先看一眼:边界画得对不对、坐标系是不是 WGS84、字段结构是否符合预期。常见的做法是把文件传到在线工具,或者打开一个完整的桌面 GIS。

前者有数据外泄的顾虑,后者对于一个"看一眼"的需求又太重。我们把 自己支持支持省市区县乡镇村GeoJSON数据下载的https://GeoJSONcn.cn 站点里的预览编辑器抽出来,做成了一个不依赖任何后端的纯前端工具,并开源出来。

它解决什么问题

  • 本地打开 GeoJSON 即可渲染,数据不上传服务器;
  • 支持要素级的查看与编辑;
  • 能把同一份数据导出成 GeoJSON / KML / SVG / CSV / PNG,对接不同的下游系统;
  • 不需要 npm install,不需要构建,双击 index.html 就能用。

技术实现

渲染:Leaflet 与坐标系

核心就是用地图库把 GeoJSON 画出来。下面是一段最小可用的加载代码:

// 初始化地图并加载一份 GeoJSON
// 要素量大时把渲染器从默认 SVG 换成 Canvas,避免 DOM 节点过多卡顿
const map = L.map('map', {
    renderer: L.canvas() }).setView([39.9, 116.4], 4);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
   
  attribution: '© OpenStreetMap'
}).addTo(map);

fetch('example.geojson')
  .then(r => r.json())
  .then(geojson => {
   
    L.geoJSON(geojson, {
   
      style: {
    color: '#2563eb', weight: 1.5 },
      onEachFeature: (feature, layer) => {
   
        const name = feature.properties && feature.properties.name;
        if (name) layer.bindPopup(name);
      }
    }).addTo(map);
  });

这里有个容易混淆的点:Leaflet 的地图视图默认使用 Web Mercator(EPSG:3857)投影,但 Feature 的坐标本身仍是 EPSG:4326(WGS84),Leaflet 在加载时会自动完成经纬度到墨卡托的转换,开发者无需手动处理。

需要提醒的是,本项目只处理 WGS84 数据。国内的地图数据常常混用 GCJ-02(火星坐标系)或 BD-09,本项目目前没有内置纠偏逻辑,如果拿到的数据偏移明显,需要先自行纠偏再导入。

计算:Turf.js

要素的几何操作(计算包围盒、合并、切分、面积量算等)交给 Turf.js。本仓库把 Turf 以本地文件形式打包在 turf/ 目录里,页面里直接通过全局 turf 对象调用,无需打包工具:

// 用 Turf 计算要素包围盒与面积(turf 为仓库内置的全局对象)
const bbox = turf.bbox(geojson);   // [minX, minY, maxX, maxY]
const area = turf.area(geojson);   // 单位:平方米
console.log('包围盒:', bbox, '面积(㎡):', area);

预览页里"切分选中要素"这类能力,就是从主站编辑器移植过来的,底层依赖 Turf 的几何运算。

导出管线

几种导出格式各自有几个容易踩坑的技术点:

// KML 坐标顺序是 经度,纬度,海拔;注意和 GeoJSON 的 [lon, lat] 对应,多一个高程
// 多环 / 多维坐标需要递归处理
function coordsToKml(coords) {
   
  if (typeof coords[0][0] === 'number') {
   
    return coords.map(c => `${
     c[0]},${
     c[1]},0`).join(' ');
  }
  return coords.map(coordsToKml).join(' ');
}

// 导出 CSV 时在开头写入 BOM,避免 Excel 打开中文乱码
const csv = 'name,lon,lat\n' + rows.join('\n');
const blob = new Blob(['\uFEFF' + csv], {
    type: 'text/csv;charset=utf-8;' });
  • GeoJSON:最直接,把内存里的 FeatureCollection 序列化即可,注意保留 properties 与坐标系声明。
  • KML:需要按 <Document><Placemark><Polygon><outerBoundaryIs><LinearRing><coordinates> 的结构组织;坐标顺序 经度,纬度,海拔,转换时别写反(见上)。
  • SVG:把 [经度, 纬度] 用等距圆柱投影线性映射到 viewBox 的像素坐标,输出 <path d="M x y L x y Z">。投影本身很简单,难点在视口自适应和描边宽度的处理。
  • CSV:每个要素一行,属性平铺成列;字段含中文且要进 Excel 时,文件开头需带 BOM(EF BB BF),否则中文乱码(见上)。
  • PNG:把当前渲染结果绘制到 <canvas> 后,用 toBlob / toDataURL 导出图片。

目录结构

geojson-preview/
├── index.html      # 入口页:说明 + 主站入口
├── preview.html    # 预览编辑器本体
├── leaflet/        # 地图渲染引擎
├── turf/           # 几何计算
├── vendor/         # 其他第三方依赖
├── LICENSE         # MIT
├── NOTICE
└── README.md

整个项目是静态文件,没有打包步骤,依赖都以本地文件形式存在 leaflet/、turf/、vendor/ 目录里。

快速开始

# GitHub
git clone https://github.com/laukuo/geojson-preview.git

# Gitee
git clone https://gitee.com/SmartMailer/geojson-preview.git

克隆后用浏览器直接打开 index.html 即可,无需安装依赖、无需启动服务。

与 GeoJSONcn 主站的关系

这个仓库是 GeoJSONcn(全国行政区划边界矢量数据下载平台)预览功能的独立开源版。主站还提供省、市、区县、乡镇街道四级行政区划边界数据的在线预览与下载,你也可以直接在 在线预览页 体验完整功能;开源版把"轻量预览 + 编辑 + 导出"这一段单独拆了出来,方便在自己的项目里直接集成或做二次开发。

二次开发与集成

几种常见的接入方式:

  • 在自己的页面里直接引用本仓库的 leaflet/ 与 turf/,复用渲染与计算逻辑;
  • 把 preview.html 以 <iframe> 的形式嵌到内部系统里;
  • 本地加载 GeoJSON 时,优先用 FileReader 读取用户选定的文件,而不是 fetch 本地路径——后者在 file:// 协议下会受到浏览器同源策略限制:
// file:// 下用 FileReader 读本地文件,避开 fetch 的同源限制
const input = document.getElementById('file');
input.addEventListener('change', () => {
   
  const reader = new FileReader();
  reader.onload = e => renderGeoJSON(JSON.parse(e.target.result));
  reader.readAsText(input.files[0]);
});

开源地址

代码基于 MIT 协议发布,同时托管在 GitHub 与 Gitee:

欢迎在仓库里提 Issue 和 PR。

相关链接

相关文章
|
7天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
6911 9
|
5天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1390 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
6天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
850 5
|
19天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
3433 10
|
13天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
1509 1
|
18天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1897 9
Qoder 上线 Sonus 模型,Computer Use 能力全面增强

热门文章

最新文章