geojson-to-wkt 坐标格式转换

geojson-to-wkt 坐标格式转换

一个 简单、轻量、健壮 的 JavaScript / TypeScript 库,用于将 GeoJSON 数据转换为 WKT(Well-Known Text) 格式。

本库面向 真实 GIS / 数据库场景 设计,适用于将前端或服务端的 GeoJSON 数据输出为数据库可直接使用的 WKT。


特性

  • 🚀 轻量、无依赖
  • 🧠 明确的几何类型映射(非字符串拼接)
  • 🧩 支持 GeoJSON Geometry / Feature / FeatureCollection
  • 📐 支持 Z / M 坐标(XY / XYZ / XYM / XYZM)
  • 🗄 输出数据库标准 WKT
  • 🌲 Tree Shaking 友好,支持按需引入

安装

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

或

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

支持的类型映射

GeoJSON 类型 WKT 类型
Point POINT
MultiPoint MULTIPOINT
LineString LINESTRING
MultiLineString MULTILINESTRING
Polygon POLYGON
MultiPolygon MULTIPOLYGON
GeometryCollection GEOMETRYCOLLECTION
Feature 对应 Geometry
FeatureCollection GEOMETRYCOLLECTION

API

geometryToWKT(geometry: Geometry): string

将 GeoJSON Geometry 转换为 WKT 字符串

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

const geometry = {
  type: 'Point',
  coordinates: [120, 30]
};

geometryToWKT(geometry);
// "POINT (120 30)"

featureToWKT(feature: Feature): string

将 GeoJSON Feature 转换为 WKT

Feature 的 properties 会被忽略,仅处理 geometry

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

const feature = {
  type: 'Feature',
  geometry: {
    type: 'Point',
    coordinates: [120, 30]
  },
  properties: {}
};

featureToWKT(feature);
// "POINT (120 30)"

featureCollectionToWKT(featureCollection: FeatureCollection): string

将 GeoJSON FeatureCollection 转换为 GEOMETRYCOLLECTION WKT

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

const collection = {
  type: 'FeatureCollection',
  features: [
    {
      type: 'Feature',
      geometry: {
        type: 'Point',
        coordinates: [120, 30]
      },
      properties: {}
    },
    {
      type: 'Feature',
      geometry: {
        type: 'LineString',
        coordinates: [[120, 30], [121, 31]]
      },
      properties: {}
    }
  ]
};

featureCollectionToWKT(collection);
// "GEOMETRYCOLLECTION (POINT (120 30), LINESTRING (120 30, 121 31))"

toWKT(input: GeoJSON): string

通用转换方法,自动识别输入类型

支持:

  • Geometry
  • Feature
  • FeatureCollection
js 复制代码
import { toWKT } from '@giszhc/geojson-to-wkt';

toWKT({
  type: 'Point',
  coordinates: [120, 30]
});
// "POINT (120 30)"

toWKT({
  type: 'Feature',
  geometry: {
    type: 'LineString',
    coordinates: [[120, 30], [121, 31]]
  }
});
// "LINESTRING (120 30, 121 31)"

Multi* 几何示例

MultiPoint

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

MultiLineString

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

MultiPolygon

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

GeometryCollection

js 复制代码
geometryToWKT({
  type: 'GeometryCollection',
  geometries: [
    {
      type: 'Point',
      coordinates: [10, 10]
    },
    {
      type: 'LineString',
      coordinates: [[20, 20], [30, 30]]
    }
  ]
});
GEOMETRYCOLLECTION (POINT (10 10), LINESTRING (20 20, 30 30))

Z / M 坐标支持

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

推荐测试用例

js 复制代码
const cases = [
  {
    type: 'Point',
    coordinates: [10, 10]
  },
  {
    type: 'MultiPoint',
    coordinates: [[10, 10], [20, 20]]
  },
  {
    type: 'LineString',
    coordinates: [[10, 10], [20, 20]]
  },
  {
    type: 'Polygon',
    coordinates: [[[0, 0], [10, 0], [10, 10], [0, 0]]]
  },
  {
    type: 'GeometryCollection',
    geometries: [
      { type: 'Point', coordinates: [1, 1] },
      { type: 'LineString', coordinates: [[0, 0], [1, 1]] }
    ]
  }
];

cases.forEach(geojson => {
  expect(() => toWKT(geojson as any)).not.toThrow();
});

注意事项

  • 输出格式遵循数据库标准:TYPE (x y, ...)
  • 不自动添加 SRID
  • 不修改原始坐标维度与顺序
  • Feature.properties 不参与转换

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

相关推荐
程序员大阳8 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系
非科班Java出身GISer12 小时前
ArcGIS JS 基础教程(46):编辑要素属性 FeatureForm
arcgis·arcgis js编辑要素·arcgis js 要素·arcgis js要素属性·arcgis js 编辑属性·arcgis js编辑要素属性
香芋芋圆12 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
晗夜未央14 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
jktantan15 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
我命由我1234516 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳16 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
paopaokaka_luck18 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩18 小时前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
SEO_juper18 小时前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome