前言
在 WebGIS 开发中,WKT 和 GeoJSON 是两种常见的地理空间数据格式。本文将探讨如何高效地将 WKT 转换为 GeoJSON,并结合 Leaflet 实现地图可视化。
一、WKT 后台转换实现
本节以 PostGIS 空间数据库和 Java 后台为例,介绍如何基于空间数据库和 GeoTools 库实现 WKT 转为 GeoJSON。
1、基于 PostGIS 实现
如果开发数据库中有空间数据库,可以直接利用空间数据的空间函数进行处理。使用以下 SQL 语句可以查询空间属性的 WKT 格式:
SELECT ST_AsEWKT(geom) FROM biz_ceic_earthquake LIMIT 10;
如果要实现对应的 WKT 转为 GeoJSON,只需要使用 ST_AsGeoJSON 函数即可完成转换。示例 SQL 查询语句如下:
SELECT ST_AsEWKT(geom), ST_AsGeoJSON(geom) FROM biz_ceic_earthquake LIMIT 10;
第二列即为需要的 GeoJSON 类型。有了这个 SQL 语句之后,就可以在 Java 中结合 SQL 查询将结果返回给前端。
2、GeoTools 实现
这里介绍完全基于 GeoTools 的纯后台转换逻辑。在工程项目中首先要引入 GeoTools 组件,在 Pom.xml 中首先引入以下依赖:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>28.2</version>
</dependency>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>1.19.0</version>
</dependency>
引入相应的资源后,接下来就可以使用 GeoTools 来实现把 WKT 字符串转为 GeoJSON。核心转换代码如下:
package com.yelang.project.geotools.wkt2json;
import org.geotools.geojson.geom.GeometryJSON;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.io.WKTReader;
import java.io.StringWriter;
public class WKTToGeoJSON {
public static String wktToJson(String wkt) {
String json = null;
try {
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
WKTReader reader = new WKTReader(geometryFactory);
Geometry geometry = reader.read(wkt);
GeometryJSON geometryJson = new GeometryJSON();
StringWriter writer = new StringWriter();
geometryJson.write(geometry, writer);
json = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
public static void main(String[] args) {
String wkt = "POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))";
String geoJson = wktToJson(wkt);
System.out.println(geoJson);
}
}
主要使用 WKTReader 读取 WKT 的字符串,然后转为 Geometry,最后通过 GeometryJSON 进行 GeoJSON 格式化。
二、wellknown.js 转换
如果在开发 WebGIS 应用时,第三方接口返回给了一个 WKT 字符串,而我们没有对应的后台支撑,此时又该怎么办呢?如果我们只有前端,那么应该如何集成对应的 WKT,从而达到页面的渲染展示。
1、wellknown.js 是什么?
不论是使用 Leaflet 还是 OpenLayers 或者 Cesium 来进行 WebGIS 开发,如果遇到 WKT,还真不是一下子就能介入的,而 GeoJSON 是一种比较通用的格式,因此急需一款可以直接将 WKT 转为 GeoJSON 的工具。这里介绍 wellknown.js 这款组件,是大名鼎鼎的 Mapbox 开源的一个成熟组件。
2、wellknown.js 的方法
这款插件很迷你,核心方法就是实现两种格式的转换。对外提供的两个核心函数就是实现从 WKT 到 GeoJSON 的转换和互转。
- parse(wkt): Given WKT as a string, return a GeoJSON geometry object or null if parse fails.
- stringify(geojson): Given a GeoJSON geometry object or Feature object, return a WKT representation as a string.
请熟练这两个方法,尤其是第一个方法,将是我们实现 WKT 转为 GeoJSON 的基础。
三、在 Leaflet.js 中集成 wellknown.js
本节将详细讲解如何在 Leaflet 中集成 wellknown.js。
1、资源引入
在 Leaflet.js 页面中引入 wellknown.js 的方法很简单,最简单的方式就是直接使用 Script 的方式直接引入即可。核心代码如下:
<script src="/pcwater/static/js/wellknown.js"></script>
2、将 wkt 转为 geojson
引入资源以后,接下来就可以调用提供的 API 实现将 WKT 转为 GeoJSON,代码也非常的简洁,如下所示:
var myStyle = {color:"red",weight:5,"opacity":1, "fillOpacity": 0};
const geojson = wellknown.parse(_tempPolyline);
var areaLayer = L.geoJSON(geojson,{style:myStyle}).addTo(showLayerGroup);
这里指定了一个 GeoJSON 的展示样式,包括颜色、透明度和填充透明度,最后再调用 leaflet 的 geojson 展示方法实现 WKT 方法的转换,从而实现空间属性的展示。
四、总结
本文介绍了 WKT 转 GeoJSON 的后端(PostGIS、GeoTools)及前端(wellknown.js)方案,并演示了如何在 Leaflet 中加载 GeoJSON 进行地图渲染。


