npm package: @giszhc/wkt-to-geojson
Description: 一个 **简单、轻量、健壮** 的 JavaScript / TypeScript 库，用于 **WKT 转 GeoJSON**。
Latest version: 0.0.1

# 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（不自动修复拓扑错误）
- 不对坐标维度做裁剪，保持原始精度