JSTS是一个符合OGC标准的,包含空间拓扑功能的JavaScript类库。和turf类似,区别在于,JSTS是通过原始JTS Java 源代码翻译来的,保留了JTSAPI;而turf来自MapBox。个人感觉JSTS的文档不如turf明了(一些网址还404了),但是可以直接适用OpenLayers(以下简称OL)的几何对象,对JTS API熟悉的话在OL工程里可能会更方便。

JSTS的参考文档比较分散,GitHub库里有比较全面的简介,这个地址里有一些简单的示例,JTS API直接用的JavaAPI,看起来并不直观,另外使用了一些空间数据类型读取类代替JavaAPI里的IO部分。

所以若想比较完整的了解JSTS类库和基础使用,建议按照顺序,先浏览Github库的README.md,直接用谷歌浏览器的机翻大概看一遍,然后看一下简单示例,到具体的代码编写时,数据读写部分参考http://bjornharrtell.github.io/jsts/1.6.1/doc/index.html,空间功能部分参考JavaAPI。

注,以下个人应用示例用的是Vue2+TS,若你的环境不一样请自行修改

安装和调用

没啥好说的,使用npm/yarn啥的自行安装,或者引用在线地址
引用时,若使用npm包,由于jsts没有类型声明文件,固然有一些比较好的方法,我这里还是图省事直接用的require。调用代码如下

// 引入OL几何类
import Geometry from "ol/geom/Geometry";
import { LineString, LinearRing, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon } from "ol/geom";// 引入jsts
const jsts = require("jsts/dist/jsts.min.js");// 实例化OL解析类
const OLParser = new jsts.io.OL3Parser();
// 注入OL几何对象
OLParser.inject(Point, LineString, LinearRing, Polygon, MultiPoint, MultiLineString, MultiPolygon);

功能示例

先定义了一个函数类型

type TopoFunc = (...params: any) => Geometry | null;

缓冲区

/*** 缓冲区* @param geom* @param len 缓冲区距离,单位米* @returns*/
const getBuffer: TopoFunc = (geom: Geometry, len: number) => {const jstsGeom = OLParser.read(geom);if (!jstsGeom.isValid()) {console.error("几何对象出现拓扑错误,请检查修复");return null;}const buffered = jstsGeom.buffer(len);return OLParser.write(buffered);
};

取交

/*** 取交* @param geom* @param geomB* @returns*/
const intersects: TopoFunc = (geom: Geometry, geomB: Geometry) => {const jstsGeom = OLParser.read(geom);const jstsGeomB = OLParser.read(geomB);if (!jstsGeom.isValid() || !jstsGeomB.isValid()) {console.error("几何对象出现拓扑错误,请检查修复");return null;}const difference = jstsGeom.intersection(jstsGeomB);return OLParser.write(difference);
};

取补

/*** 取geom中geomB的补集* @param geom* @param geomB* @returns*/
const getDifference: TopoFunc = (geom: Geometry, geomB: Geometry) => {const jstsGeom = OLParser.read(geom);const jstsGeomB = OLParser.read(geomB);if (!jstsGeom.isValid() || !jstsGeomB.isValid()) {console.error("几何对象出现拓扑错误,请检查修复");return null;}const difference = jstsGeom.difference(jstsGeomB);return OLParser.write(difference);
};

融合

/*** 融合* @param geom* @param geomB* @returns*/
const union: TopoFunc = (geom: Geometry, geomB: Geometry) => {const jstsGeom = OLParser.read(geom);const jstsGeomB = OLParser.read(geomB);if (!jstsGeom.isValid() || !jstsGeomB.isValid()) {console.error("几何对象出现拓扑错误,请检查修复");return null;}const difference = jstsGeom.union(jstsGeomB);return OLParser.write(difference);
};

对等差分

/*** 对等差分* @param geom* @param geomB* @returns*/
const symDifference: TopoFunc = (geom: Geometry, geomB: Geometry) => {const jstsGeom = OLParser.read(geom);const jstsGeomB = OLParser.read(geomB);if (!jstsGeom.isValid() || !jstsGeomB.isValid()) {console.error("几何对象出现拓扑错误,请检查修复");return null;}const difference = jstsGeom.symDifference(jstsGeomB);return OLParser.write(difference);
};

备注

工作中遇到个拓扑错误,多边形自相交

尝试使用GeometryPrecisionReducer降低精度,但还是有问题,就索性代码里直接抛出,手动修改数据来修复吧。GeometryPrecisionReducer的代码也附下,执行没啥问题,但是结果依然不好,感兴趣可以研究下

function topoFix(jstsGeom: any) {if (jstsGeom.isValid()) {return jstsGeom;}const reducer = new jsts.precision.GeometryPrecisionReducer();// 这里直接使用reduce方法会直接报错// 若使用reducer.fixPolygonalTopology会正常执行,但返回的几何不大对,后面使用会报一样的错return reducer.reduce(jstsGeom);
}

错误

JSTS介绍和功能简单示例相关推荐

  1. python密码登录程序三次_Python实现账号密码输错三次即锁定功能简单示例

    本文实例讲述了Python实现账号密码输错三次即锁定功能.分享给大家供大家参考,具体如下: 初学Python-1 #实现账号输错三次即锁定 user = "hubery" pass ...

  2. UE4 Matinee功能基本概念及简单示例(Sequence编辑器)

    UE4 Matinee功能基本概念及简单示例(Sequence编辑器) https://gameinstitute.qq.com/community/detail/122091 UE4提供的Matin ...

  3. joomla 标准激活的php mail 功能,php 通过joomla jmail 类使用 gmail smtp 账号发送邮件的简单示例...

    php通过joomla jmail 类使用 gmail smtp 账号发送邮件,感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧. 经测试代码如下: /** * 通过joomla jmail ...

  4. php网页留言本过程,PHP实现简单留言本功能代码示例

    这篇文章主要为大家详细介绍了PHP简单留言本功能的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了PHP留言本功能的具体代码,供大家参考,具体内容如下 index.ph ...

  5. Python3.9的69个内置函数(内建函数)介绍,并附简单明了的示例代码

    Python 解释器内置(内建)了很多函数,这篇博文对它们进行逐一介绍,博主觉得有必要给出示例代码的会给出示例代码. 声明:博主(昊虹图像算法)写这篇博文时,用的Python的版本号为3.9.10. ...

  6. 【CH559L单片机】PWM功能和示例介绍

    [CH559L单片机]PWM功能和示例介绍 ✨在官方CH559单片机手册中,在定时器(Timer)这一章节介绍PWM.

  7. ifle网页服务器,iFile怎么使用 iFile常用功能简单介绍【详解】

    iFile怎么使用? iFile是一款强大的文件管理器.拥有包括移动.粘贴.复制.建立文件夹链接.解压.压缩.上传下载.搜索.编辑文件.播放影音文件等等;基本可以媲美 Mac 上类似的文件管理功能. ...

  8. UDP实现简单的群聊功能代码示例

    以下是UDP实现群聊功能代码示例 在java中,通过两个特定类来实现UDP协议顶层数据报,分别是DatagramPacket和DatagramSocket,其中类DatagramPacket是一个数据 ...

  9. 图像去噪简单介绍—并给出示例代码

    文章目录 图像去噪简单介绍-并给出示例代码 去噪的基本原理 常见的噪声类型 高斯噪声 椒盐噪声 马赛克噪声 脉冲噪声 添加噪声的代码 添加高斯噪声 添加椒盐噪声 常用的去噪方法 均值滤波 中值滤波 高 ...

最新文章

  1. poj 2449 Remmarguts' Date 启发式搜索 A*算法
  2. python如何获取版本信息判断当前的python版本
  3. 带你认识FusionInsight Flink:既能批处理,又能流处理
  4. Android工具箱之文件目录
  5. 强联通分量:Tarjan缩点
  6. ip代理 12-02-03
  7. 2020年了,还不懂数据挖掘?数据挖掘工具有哪些?
  8. 天心阁吉他神秘人专访
  9. 高老师的架构设计_隽语集(CC_1051)
  10. 用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...
  11. Android Studio修改apk命名
  12. Android天气预报项目
  13. 阿里移动11.11 | Weex 在双十一会场的大规模应用--备用
  14. 沅有芷兮:类型系统的数学之美
  15. java实现冒泡排序完整版
  16. JPA @PersistenceContext及@Transactional Annotation
  17. FOTRIC 692Pro红外热成像仪 人体体温筛查
  18. 【OC】状态估计(3) 卡尔曼滤波B
  19. 备份恢复的种类以及完全恢复实验
  20. Compact行记录

热门文章

  1. mysql 查询表 第一列报错_MySQL----DQL(查询数据库表中数据)
  2. ES中删除索引中某个字段
  3. 大淘宝技术2022年度热门文章盘点
  4. 微信小程序 思维导图
  5. PostgreSQL Substring教程
  6. 360压缩没有系统右键菜单或提示右键损坏
  7. 15- APP测试面试题上
  8. 漫谈Web前端学习路线,前端学习路漫漫
  9. ASP.NET Core 新建项目(Windows)
  10. 【DevOps实战】Pod基本操作