GeoJSON 在线预览编辑器开源:一个纯前端实现的拆解
背景日常处理行政区划、POI、轨迹等 GeoJSON 数据时经常需要先看一眼边界画得对不对、坐标系是不是 WGS84、字段结构是否符合预期。常见的做法是把文件传到在线工具或者打开一个完整的桌面 GIS。前者有数据外泄的顾虑后者对于一个看一眼的需求又太重。我们把 GeoJSONcn 站点里的预览编辑器抽出来做成了一个不依赖任何后端的纯前端工具并开源出来。它解决什么问题本地打开 GeoJSON 即可渲染数据不上传服务器支持要素级的查看与编辑能把同一份数据导出成 GeoJSON / KML / SVG / CSV / PNG对接不同的下游系统不需要npm install不需要构建双击index.html就能用。技术实现渲染Leaflet 与坐标系核心就是用地图库把 GeoJSON 画出来。下面是一段最小可用的加载代码// 初始化地图并加载一份 GeoJSON// 要素量大时把渲染器从默认 SVG 换成 Canvas避免 DOM 节点过多卡顿constmapL.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(rr.json()).then(geojson{L.geoJSON(geojson,{style:{color:#2563eb,weight:1.5},onEachFeature:(feature,layer){constnamefeature.propertiesfeature.properties.name;if(name)layer.bindPopup(name);}}).addTo(map);});这里有个容易混淆的点Leaflet 的地图视图默认使用 Web MercatorEPSG:3857投影但Feature 的坐标本身仍是 EPSG:4326WGS84Leaflet 在加载时会自动完成经纬度到墨卡托的转换开发者无需手动处理。需要提醒的是本项目只处理 WGS84 数据。国内的地图数据常常混用 GCJ-02火星坐标系或 BD-09本项目目前没有内置纠偏逻辑如果拿到的数据偏移明显需要先自行纠偏再导入。计算Turf.js要素的几何操作计算包围盒、合并、切分、面积量算等交给 Turf.js。本仓库把 Turf 以本地文件形式打包在turf/目录里页面里直接通过全局turf对象调用无需打包工具// 用 Turf 计算要素包围盒与面积turf 为仓库内置的全局对象constbboxturf.bbox(geojson);// [minX, minY, maxX, maxY]constareaturf.area(geojson);// 单位平方米console.log(包围盒:,bbox,面积(㎡):,area);预览页里切分选中要素这类能力就是从主站编辑器移植过来的底层依赖 Turf 的几何运算。导出管线几种导出格式各自有几个容易踩坑的技术点// KML 坐标顺序是 经度,纬度,海拔注意和 GeoJSON 的 [lon, lat] 对应多一个高程// 多环 / 多维坐标需要递归处理functioncoordsToKml(coords){if(typeofcoords[0][0]number){returncoords.map(c${c[0]},${c[1]},0).join( );}returncoords.map(coordsToKml).join( );}// 导出 CSV 时在开头写入 BOM避免 Excel 打开中文乱码constcsvname,lon,lat\nrows.join(\n);constblobnewBlob([\uFEFFcsv],{type:text/csv;charsetutf-8;});GeoJSON最直接把内存里的 FeatureCollection 序列化即可注意保留properties与坐标系声明。KML需要按DocumentPlacemarkPolygonouterBoundaryIsLinearRingcoordinates的结构组织坐标顺序经度,纬度,海拔转换时别写反见上。SVG把[经度, 纬度]用等距圆柱投影线性映射到viewBox的像素坐标输出path dM x y L x y Z。投影本身很简单难点在视口自适应和描边宽度的处理。CSV每个要素一行属性平铺成列字段含中文且要进 Excel 时文件开头需带 BOMEF BB BF否则中文乱码见上。PNG把当前渲染结果绘制到canvas后用toBlob/toDataURL导出图片。目录结构geojson-preview/ ├── index.html # 入口页说明 主站入口 ├── preview.html # 预览编辑器本体 ├── leaflet/ # 地图渲染引擎 ├── turf/ # 几何计算 ├── vendor/ # 其他第三方依赖 ├── LICENSE # MIT ├── NOTICE └── README.md整个项目是静态文件没有打包步骤依赖都以本地文件形式存在leaflet/、turf/、vendor/目录里。快速开始# GitHubgitclone https://github.com/laukuo/geojson-preview.git# Giteegitclone https://gitee.com/SmartMailer/geojson-preview.git克隆后用浏览器直接打开index.html即可无需安装依赖、无需启动服务。与 GeoJSONcn 主站的关系这个仓库是 GeoJSONcn全国行政区划边界矢量数据下载平台预览功能的独立开源版。主站还提供省、市、区县、乡镇街道四级行政区划边界数据的在线预览与下载你也可以直接在 在线预览页 体验完整功能开源版把轻量预览 编辑 导出这一段单独拆了出来方便在自己的项目里直接集成或做二次开发。二次开发与集成几种常见的接入方式在自己的页面里直接引用本仓库的leaflet/与turf/复用渲染与计算逻辑把preview.html以iframe的形式嵌到内部系统里本地加载 GeoJSON 时优先用FileReader读取用户选定的文件而不是fetch本地路径——后者在file://协议下会受到浏览器同源策略限制// file:// 下用 FileReader 读本地文件避开 fetch 的同源限制constinputdocument.getElementById(file);input.addEventListener(change,(){constreadernewFileReader();reader.onloaderenderGeoJSON(JSON.parse(e.target.result));reader.readAsText(input.files[0]);});开源地址代码基于 MIT 协议发布同时托管在 GitHub 与 GiteeGitHubhttps://github.com/laukuo/geojson-previewGiteehttps://gitee.com/SmartMailer/geojson-preview欢迎在仓库里提 Issue 和 PR。相关链接开源仓库GitHubhttps://github.com/laukuo/geojson-preview开源仓库Giteehttps://gitee.com/SmartMailer/geojson-preview项目主站https://geojsoncn.com/在线预览https://geojsoncn.com/preview.html

相关新闻

GD32F303C移植UCOSIII实战:从零到跑通完整指南

GD32F303C移植UCOSIII实战:从零到跑通完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 19:58:45 阅读更多 →
AI追色与调色盘:从颜色迁移原理到OpenCV实现及手机端落地

AI追色与调色盘:从颜色迁移原理到OpenCV实现及手机端落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/2 17:43:37 阅读更多 →
STM32 ADC单通道连续转换详解:HAL库工程配置与实战

STM32 ADC单通道连续转换详解:HAL库工程配置与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 19:55:48 阅读更多 →

最新新闻

IEEE33节点配电网Simulink模型搭建与仿真应用实践指南

IEEE33节点配电网Simulink模型搭建与仿真应用实践指南

简介:基于MATLAB Simulink的IEEE33节点配电网模型,是电力系统教学与科研中广泛采用的标准测试系统,尤其适合潮流计算分析、故障波形仿真以及分布式电源接入等研究方向。这套资源压缩包共包含45个文件,整体大小仅3.02MB&#xff0c…

2026/9/3 20:01:19 阅读更多 →
纯Java实现泡泡堂联机版:从Socket到状态同步

纯Java实现泡泡堂联机版:从Socket到状态同步

简介:Java泡泡堂联机版是一款基于Java开发的多人在线对战游戏,面向具备基础Java语法、希望进阶学习网络编程与游戏开发的入门至中级读者。项目代码参考泡泡堂与QQ堂的经典玩法,围绕角色移动、泡泡发射、爆炸判定、障碍物交互等核心机制展开&a…

2026/9/3 20:01:19 阅读更多 →
清华源停止Anaconda镜像后:conda换源与Miniforge切换完整指南

清华源停止Anaconda镜像后:conda换源与Miniforge切换完整指南

2026年8月9日,清华镜像站的 Anaconda 相关资源调整正式落地。很多习惯从mirrors.tuna.tsinghua.edu.cn/anaconda拉包的同学,昨天还能正常conda install,今天就开始报unavailable invalid channel: http 404 not found for channel anaconda/p…

2026/9/3 20:01:19 阅读更多 →
Python Turtle画皮卡丘:零基础图形编程实战教程

Python Turtle画皮卡丘:零基础图形编程实战教程

经常有初学者问我:Python 基础语法学完之后,能做什么有意思的东西?我的建议往往不是写爬虫、不是上 Web 框架,而是先用 Python 自带的turtle库画一个自己喜欢的角色。画图这件事,看起来简单,但它能一次性把…

2026/9/3 20:01:19 阅读更多 →
计算机单片机毕设实战-基于 STM32 单片机的智能距离检测声光预警系统设计 基于 STM32 的 ESP-01S 无线超声测距终端与手机应用开发(014206)

计算机单片机毕设实战-基于 STM32 单片机的智能距离检测声光预警系统设计 基于 STM32 的 ESP-01S 无线超声测距终端与手机应用开发(014206)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/3 20:01:19 阅读更多 →
中国水系及流域矢量数据获取与ArcMap实操全攻略

中国水系及流域矢量数据获取与ArcMap实操全攻略

简介:中国水系及流域矢量数据是一份以2019年OpenStreetMap为基础的地理信息系统资源,采用SHP格式存储全国主要河流网络、水系中心线与流域边界,面向GIS开发、环境科研、水资源管理及城市规划等领域的从业者和学习者,尤其适合需要全…

2026/9/3 20:00:19 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开,这不是劝退文,而是想讲清楚一件事:用 AI 做逆向值不值得学?如果要用,怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词,很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →