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(不自动修复拓扑错误)
- 不对坐标维度做裁剪,保持原始精度
完结,撒花✿✿ヽ(°▽°)ノ✿