home > GIS > WebGIS >

TurfTurf.js库应用:点线面几何体的拓扑关系判断及运算分析

author:zhoulujun    hits:

Turf js可以用来做空间几何对象关系的计算(点、线、面之间包含、相交等)和空间分析操作(例如生成缓冲区、计算等高线,建立 TIN 等)等功能。无论是高德、百度及maptalks及mapbox开发,在做空间分析的时候,Turf提供非常好的支持

Turf.js简介

Turf.js是JavaScript  空间分析库,由Mapbox 提供,Turf 实现了

  1. 空间分析操作,例如生成缓冲区、计算等高线,建立 TIN 等;

  2. 空间几何对象关系的计算,点、线、面之间包含、相交等

Turf.js使用 JavaScript 编写,通过 npm 进行包管理。良好的模块化设计使得 Turf 不仅可用于浏览器端(以往只属于桌面 GIS  的分析功能,已经可以在浏览器中使用),还可以通过 Node.js 在服务器端使用(过往一般只能找到java或者C++分析包)。当然也支持其它预研版本

Turf 原生支持 GeoJSON 矢量数据。GeoJSON 的优点是结构简单,并且得到了所有网页地图API的支持;但 GeoJSON  不支持空间索引,这个缺点可能会限制 Turf 处理大型文件的能力效率。

Turf 可以非方便地集成到 Leaflet.js 地图控件中,Mapbox 也为其提供了相应的 Mapbox.js 插件。

Turf的数据标准是WGS84经度、纬度坐标,大多数Turf函数使用GeoJSON功能,如点Point、线LineString、面Polygon


Turf功能简介

Turf功能列表:

  • MEASUREMENT:计算工具,测量,计算面积area、长度length、中心点midpoint

  • COORDINATE MUTATION:坐标变换,坐标翻转flip、倒置rewind、截取truncate

  • TRANSFORMATIONL:坐标转换,主要用于,比如:合并图形、给出点与半径生成圆形、

  • HELPER:坐标数组,生成GeoJSON feature,

  • RANDOM:随机图形生成

  • MISC:杂项目

  • JOINS:坐标筛选,pointsWithinPolygon筛查出在多边形内的坐标

  • GRIDS:网格,生成各种网格

  • classification:分类,nearestPoint,寻找最靠近目标的点

  • BOOLEANS:拓扑关系判断

  • UNIT CONVERSION: 单位换算,转换面积、长度等度量单位,toWgs84 toMercator(麦卡托/WGS84互转)


一般要到最多的是BOOLEANS 拓扑关系判断、JOINS筛选、COORDINATE  MUTATION坐标变换,像MEASUREMENT计算工具(百度、高德都自带数学工具),其中最常用的一概是拓扑关系了。

Turf拓扑关系判断

在数学上,拓扑关系有

拓扑关系图

Turf提供的拓扑关系判断,Geometry之间的关系有如下几种:

关系类型描述
包含:Contains几何形状B的线都在几何形状A内部
内含:Within几何形状A的线都在几何形状B内部。
相交:Crosses几何形状至少有一个共有点
脱节:Disjoint几何形状没有共有的点
相等:Equals:

判断两个图形是否是同一个类型并且在平面上的点是否是相同的位置。如果返回值为真,则它们应该包含(Contains)另外一个图形同时也被另外一个图形所包含(Within)。

重叠:Overlaps

几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。

判断两个图形的交集是否和其中的一个图形拥有相同的维数,并且他们交集不能和其中任何一个图形相等。

该方法只使用与两个Polyline之间或者两个Polygon 之间

接触:Touch

几何形状有至少一个公共的边界点,但是没有内部点。

判断两个图形的边界是否相交,如果两个图形的交集不为空,但两个图形内部的交集为空,则返回值为真。


拓扑示意图

并集运算  交集运算  补集运算  合并运算

Turf.js拓扑判断函数

完全包含:booleanContains(feature1,feature2) //feature2是否完全包含在feature1中

全被包含:booleanWithin(feature1,feature2) //feature1是否完全在feature2中

相交判断:booleanCrosses(feature1,feature2) //feature1,feature2是否相交

相离判断:booleanDisjoint(feature1,feature2) //feature1,feature2是否相离

重合判断:booleanEqual(feature1,feature2) //feature1,feature2是否重合

重叠判断:booleanOverlap(feature1,feature2) //feature1,feature2是否重叠,判断线面


闭合判断:booleanClockwise(line) //线是否闭合

平行判断:booleanParallel(line,line) //两条线是否平行


点在线上:booleanPointOnLine(point,line) //点是否在线上

点在面上:booleanPointInPolygon(point,polygon) //点是否在面中

官方文档已经讲的非常详细,不必多说

拓扑运算分析

拓扑关系及运算分析:

关系描述

缓冲区分析(Buffer)

包含所有的点在一个指定距离内的多边形和多多边形

凸壳分析(ConvexHull)

包含几何形体的所有点的最小凸壳多边形(外包多边形)

交叉分析(Intersection)

A∩B 交叉操作就是多边形AB中所有共同点的集合

联合分析(Union)

AUB AB的联合操作就是AB所有点的集合

差异分析(Difference)

(A-A∩B) AB形状的差异分析就是A里有B里没有的所有点的集合

对称差异分析(SymDifference)

(AUB-A∩B) AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合

turf关系分析函数

turf.js关系分析函数主要在TRANSFORMATION下,api参考:http://turfjs.org/docs/#buffer

这方面,觉得没有必要多谢,还是看api吧

Turf.js代码引入

官网:http://turfjs.org/ 

git:https://github.com/Turfjs/turf

turf安装:

npm install@turf/turf

单独安装某个模块

npm install@turf/point @turf/buffer

TypeScript 版本使用

npm install--save @types/turf

现在的打包工具,直接第一条

项目导入

import * as turf from '@turf/turf' 

var point = turf.point([-75.343, 39.984]);
var linestring = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });

var collection = turf.featureCollection([point,linestring,polygon]);

var geometry = {  "type": "Point",  "coordinates": [110, 50]};
var feature = turf.feature(geometry);

使用方面,就没有啥好说的,网上搜到了一些案例,可以看一下。

Turf.js应用案列

Openlayers +    Turf.js 实现云朵标注

Openlayers + Turf.js 实现云朵标注

这里用Turf.js 只是为了用union方法, 将多个圆拼凑起来. 

OL4结合turf.js实现等值线


使用leafletjs、turfjs前端绘制点线面缓冲区


参考资料:

利用Turf.js实现点线面几何体的拓扑关系判断  https://blog.csdn.net/u013240519/article/details/84144336

JTS Geometry关系判断和分析 https://www.cnblogs.com/duanxingxing/p/5150487.html


转载本站文章《TurfTurf.js库应用:点线面几何体的拓扑关系判断及运算分析》, 请注明出处:https://www.zhoulujun.cn/html/GIS/WebGIS/8177.html