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(不自动修复拓扑错误)
  • 不对坐标维度做裁剪,保持原始精度

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

相关推荐
GIS地信小匠1 天前
(26)ArcGIS Pro 面要素叠加编辑:更新与交集取反工具实操全解
arcgis·空间分析·数据处理·gis教程·arcgls pro
freewlt1 天前
Monorepo 架构下的前端工程化实践:pnpm + Turborepo 从入门到落地
前端·arcgis·架构
GIS地信小匠2 天前
(21)ArcGIS Pro 矢量拆分与相交分析:按属性 / 位置拆分 + 重叠提取全攻略
arcgis·空间分析·数据处理·gis教程·arcgls pro
GIS地信小匠2 天前
(25)ArcGIS Pro 要素字段融合、分配面:面要素空间编辑攻略
arcgis·空间分析·数据处理·gis教程·arcgls pro
FlDmr4i282 天前
ArcGIS授权管理器断网后自动停止
网络·arcgis
2401_863801462 天前
制作转换3Dtiles时候cesium(b3dm)模型没有阴影,没有材质感,发白显示太假怎么办
3d·arcgis·材质·3dtiles
liuccn4 天前
MBTiles的概念讲解
arcgis
GIS地信小匠4 天前
(22)ArcGIS Pro 联合与标识分析:全范围合并、属性标记,空间叠加双核心工具
arcgis·空间分析·数据处理·gis教程·arcgls pro
城数派4 天前
谷歌18亿建筑足迹数据集 Google Open Buildings V3
数据库·arcgis·信息可视化·数据分析·excel
GIS地信小匠4 天前
(24)ArcGIS Pro 字段计算与几何属性:赋值拼接、条件判断及面积坐标自动计算
arcgis·空间分析·数据处理·gis教程·arcgls pro