wkt-to-geojson 坐标格式转换

wkt-to-geojson 坐标格式转换

一个 简单、轻量、健壮 的 JavaScript / TypeScript 库,用于 WKT 转 GeoJSON

本库面向 真实数据库 / GIS 场景 设计,重点解决:

  • ✅ 数据库标准 WKT(如 POINT (10 10)
  • ✅ 紧凑格式(如 POINT(10 10)
  • ✅ 任意空格 / 换行 / 制表符
  • ✅ Multi* 几何
  • ✅ GeometryCollection
  • ✅ Z / ZM 坐标
  • ✅ 双向一致性(WKT ↔ GeoJSON)

特性

  • 🚀 轻量、无依赖
  • 🧠 语法级解析(非简单正则拼接)
  • 🗄 兼容数据库常见输出(PostGIS / MySQL / Oracle)
  • 🧩 支持复杂嵌套 GeometryCollection
  • 🧪 提供完整测试用例示例

安装

bash 复制代码
pnpm install @giszhc/wkt-to-geojson

bash 复制代码
npm install @giszhc/wkt-to-geojson

API

wktToGeoJSON(wkt: string): Geometry

WKT 字符串 转换为 GeoJSON Geometry 对象

支持的 WKT 类型

WKT 类型 GeoJSON 类型
POINT Point
MULTIPOINT MultiPoint
LINESTRING LineString
MULTILINESTRING MultiLineString
POLYGON Polygon
MULTIPOLYGON MultiPolygon
GEOMETRYCOLLECTION GeometryCollection

基础示例

js 复制代码
import { wktToGeoJSON } from '@giszhc/wkt-to-geojson';

POINT

js 复制代码
wktToGeoJSON('POINT (120 30)');
{
  "type": "Point",
  "coordinates": [120, 30]
}

LINESTRING

js 复制代码
wktToGeoJSON('LINESTRING (120 30, 121 31)');
{
  "type": "LineString",
  "coordinates": [
    [120, 30],
    [121, 31]
  ]
}

POLYGON

js 复制代码
wktToGeoJSON('POLYGON ((120 30, 121 31, 122 32, 120 30))');
{
  "type": "Polygon",
  "coordinates": [
    [
      [120, 30],
      [121, 31],
      [122, 32],
      [120, 30]
    ]
  ]
}

Multi* 几何示例

MULTIPOINT

js 复制代码
wktToGeoJSON('MULTIPOINT (10 10, 20 20)');
{
  "type": "MultiPoint",
  "coordinates": [
    [10, 10],
    [20, 20]
  ]
}

MULTILINESTRING

js 复制代码
wktToGeoJSON(
  'MULTILINESTRING ((10 10, 20 20), (30 30, 40 40))'
);
{
  "type": "MultiLineString",
  "coordinates": [
    [[10, 10], [20, 20]],
    [[30, 30], [40, 40]]
  ]
}

MULTIPOLYGON

js 复制代码
wktToGeoJSON(
  'MULTIPOLYGON (((0 0, 10 0, 10 10, 0 0)))'
);
{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [[0, 0], [10, 0], [10, 10], [0, 0]]
    ]
  ]
}

GeometryCollection(重点)

GeometryCollection 是 WKT 中最复杂、最容易解析出错的类型,本库已完整支持。

js 复制代码
wktToGeoJSON(`
GEOMETRYCOLLECTION (
  POINT (10 10),
  LINESTRING (20 20, 30 30),
  POLYGON ((0 0, 10 0, 10 10, 0 0))
)
`);
{
  "type": "GeometryCollection",
  "geometries": [
    { "type": "Point", "coordinates": [10, 10] },
    {
      "type": "LineString",
      "coordinates": [[20, 20], [30, 30]]
    },
    {
      "type": "Polygon",
      "coordinates": [[[0, 0], [10, 0], [10, 10], [0, 0]]]
    }
  ]
}

Z / ZM 坐标支持

js 复制代码
wktToGeoJSON('POINT (10 10 5)');
{
  "type": "Point",
  "coordinates": [10, 10, 5]
}
wktToGeoJSON('POINT (10 10 5 7)');
{
  "type": "Point",
  "coordinates": [10, 10, 5, 7]
}

空格 / 换行 / 紧凑格式兼容性

以下 全部合法并等价

js 复制代码
wktToGeoJSON(`POINT (10 10)`)

wktToGeoJSON(`POINT(10 10)`)

wktToGeoJSON(`POINT
(
  10
  10
)`);

wktToGeoJSON(`
POINT
(
  10
  10
)
`);

测试用例示例(推荐)

js 复制代码
console.log(JSON.stringify(wktToGeoJSON('POINT (10 10)')));
console.log(JSON.stringify(wktToGeoJSON('POINT (10 10 5)')));
console.log(JSON.stringify(wktToGeoJSON('POINT (10 10 5 7)')));

console.log(JSON.stringify(wktToGeoJSON('MULTIPOINT (10 10, 20 20, 30 30)')));
console.log(JSON.stringify(wktToGeoJSON('MULTIPOINT ((10 10), (20 20), (30 30))')));
console.log(JSON.stringify(wktToGeoJSON('MULTIPOINT (10 10 1, 20 20 2)')));

console.log(JSON.stringify(wktToGeoJSON('LINESTRING (10 10, 20 20, 30 10)')));
console.log(JSON.stringify(wktToGeoJSON('LINESTRING (10 10 0, 20 20 5, 30 10 2)')));

console.log(JSON.stringify(wktToGeoJSON('MULTILINESTRING ((10 10, 20 20), (30 30, 40 40, 50 30)')));
console.log(JSON.stringify(wktToGeoJSON('MULTILINESTRING ((10 10 1, 20 20 2), (30 30 3, 40 40 4))')));

console.log(JSON.stringify(wktToGeoJSON('POLYGON ((0 0, 10 0, 10 10, 0 0))')));
console.log(JSON.stringify(wktToGeoJSON('POLYGON ((0 0, 20 0, 20 20, 0 0), (5 5, 5 10, 10 10, 5 5))')));
console.log(JSON.stringify(wktToGeoJSON('POLYGON ((0 0 0, 10 0 0, 10 10 5, 0 0 0))')));

console.log(JSON.stringify(wktToGeoJSON('MULTIPOLYGON (((0 0, 10 0, 10 10, 0 0)), ((20 20, 30 20, 30 30, 20 20)))')));
console.log(JSON.stringify(wktToGeoJSON('MULTIPOLYGON (((0 0 0, 20 0 0, 20 20 5, 0 0 0), (5 5 1, 5 10 1, 10 10 1, 5 5 1)), ((30 30 2, 40 30 2, 40 40 2, 30 30 2)))')));

console.log(JSON.stringify(wktToGeoJSON('GEOMETRYCOLLECTION (POINT (10 10),LINESTRING (20 20, 30 30),POLYGON ((0 0, 10 0, 10 10, 0 0)))')));
console.log(JSON.stringify(wktToGeoJSON('GEOMETRYCOLLECTION (MULTIPOINT (10 10 1, 20 20 2), MULTILINESTRING ((0 0, 5 5), (10 10, 15 15)), MULTIPOLYGON (((0 0, 10 0, 10 10, 0 0))))')));

注意事项

  • 输入必须是合法 WKT(不自动修复拓扑错误)
  • 不对坐标维度做裁剪,保持原始精度

完结,撒花✿✿ヽ(°▽°)ノ✿

相关推荐
非科班Java出身GISer3 天前
ArcGIS JS 基础教程(38):StreamLayer 实时流数据图层
arcgis·arcgis js·arcgis js 流图层·streamlayer·arcgis 流数据图层·arcgis 实时流数据图层
赵钰老师3 天前
基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析
python·arcgis·数据分析·r语言
梦想的初衷~5 天前
MaxEnt 物种分布建模学习手册|理论 + R 语言 + ArcGIS 全套实操教程
arcgis·环境变量·r 语言·maxent 模型·物种分布建模·生态学研究·科研教程
jiushidt9 天前
ArcGIS Pro Add‑in 打包流程详解
arcgis·c#·.net·arcgispro
蓝悦无人机9 天前
《地面站软件开发》-第2章ArcGIS Maps SDK for Qt 改变视角
arcgis·上位机·地面站·qml·qt6·qt quick·天地图
bug嘛我经常写11 天前
MIKE21结合ArcGIS制作随时间变化的降水文件(.dfs2)-笔记
经验分享·笔记·arcgis
paiooo11 天前
用 XML 保存 LLM 会话得到高可读性会话
arcgis
Q一件事11 天前
ArcGIS中TypeError: can‘t multiply sequence by non-int of type ‘str‘错误
前端·javascript·arcgis
萧行之13 天前
Observable Plot 源码深度解析——1 认识 Observable Plot
arcgis
ノBye~13 天前
Codex CLI使用记录
arcgis