写点什么

GIS 拓扑讲解点线面几何体的拓扑关系判断及运算分析 _turf 案例

作者:zhoulujun
  • 2023-04-09
    广东
  • 本文字数:2417 字

    阅读完需:约 8 分钟

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

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

Turf 功能简介

Turf 功能列表:

  • MEASUREMENT:计算工具,测量,计算面积area、长度length、中心点midpoint。点到线的长度:pointToLineDistance,点到线上最近的投影点 nearestPointOnLine

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

  • TRANSFORMATIONL:拓扑运算、图形变换生成,主要用于,比如:合并图形、给出点与半径生成圆形、缓冲区 buffer

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

  • RANDOM:随机图形生成

  • MISC:杂项目

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

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

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

  • BOOLEANS:拓扑关系判断

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


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

Turf 拓扑关系判断

在数学上,拓扑关系有


拓扑关系图


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

拓扑关系判断需要注意点是:

overlaps 重叠

这里的重叠跟平时我们理解的不太一样,这里的重叠,必须是 A 与 B 有交集,且 A 与 B 的交集不能和 A,B 一样,其实就是我们平时理解的相交。

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

crosses 穿过(相交)

这里的拓扑关系比较特殊,使用 crosses,不能在同纬度使用,但可以在不同的维度使用,如:点和线,线和面等

不能在线与线之间,和点与点之间,也不能在面与面之间使用

insertect 相交(交叠)

这里的相交就容易理解了,只要满足上面任意一种情况,都能成为 insertect。

对于需要交叉裁剪的(如:相交的,这里的相交是,overlaps,而不是 insertect),再进行逻辑分析

contains 包含

必须完全在范围之内的

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) //点是否在面中

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

拓扑运算分析

拓扑关系及运算分析:


推荐阅读《代数拓扑\集合拓扑\代数拓扑\拓扑关系\拓扑结构_笔记


拓扑示意图


并集运算

  

交集运算

  

补集运算

  

合并运算


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

arcgis js 几种拓扑关系详解 https://www.cnblogs.com/sguozeng/p/10250135.html


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

用户头像

zhoulujun

关注

还未添加个人签名 2021-06-25 加入

15年草根站长,尽在:zhoulujun.cn

评论

发布
暂无评论
GIS拓扑讲解点线面几何体的拓扑关系判断及运算分析_turf案例_GIS_zhoulujun_InfoQ写作社区