home > GIS > WebGIS >

GIS拓撲講解點線面幾何體的拓撲關系判斷及運算分析_turf案例

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

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之間的關系有如下幾種:

關系類型描述
包含:Contains幾何形狀B的線都在幾何形狀A內部 :B?A,檢查幾何對象A是否包含幾何對象B
內含:Within幾何形狀A的線都在幾何形狀B內部。B?A
相交:Crosses幾何形狀至少有一個共有點 A∩B≠? , 檢查兩個幾何對象是否相交

只能在不同維度使用:如點和線,線和面等。不能在線與線之間,和點與點之間,也不能在面與面之間使用

脫節:Disjoint幾何形狀沒有共有的點 A∩B=?, 檢查兩個幾何對象是否相交。
相等:Equals:

判斷兩個圖形是否是同一個類型并且在平面上的點是否是相同的位置。如果返回值為真,則它們應該包含(Contains)另外一個圖形同時也被另外一個圖形所包含(Within)。A≡B,B?A且B?A

重疊:Overlaps

幾何形狀共享一部分但不是所有的公共點,而且相交處有他們自己相同的區域。

判斷兩個圖形的交集是否和其中的一個圖形擁有相同的維數,并且他們交集不能和其中任何一個圖形相等。

該方法只使用與兩個Polyline之間或者兩個Polygon 之間

接觸:Touch

幾何形狀有至少一個公共的邊界點,但是沒有內部點。檢查兩個幾何對象是否相連

判斷兩個圖形的邊界是否相交,如果兩個圖形的交集不為空,但兩個圖形內部的交集為空,則返回值為真。

拓撲關系判斷需要注意點是:

overlaps 重疊

這里的重疊跟平時我們理解的不太一樣,這里的重疊,必須是A與B有交集,且A與B的交集不能和A,B一樣,其實就是我們平時理解的相交。

該方法只使用與兩個Polyline之間或者兩個Polygon 之間

crosses 穿過

這里的拓撲關系比較特殊,使用crosses,不能在同緯度使用,但可以在不同的維度使用,如:點和線,線和面等

不能在線與線之間,和點與點之間,也不能在面與面之間使用

contains 包含

必須完全在范圍之內的

insertect 相交

這里的相交就容易理解了,只要滿足上面任意一種情況,都能成為insertect。

對于需要交叉裁剪的(如:相交的,這里的相交是,overlaps,而不是insertect),再進行邏輯分析

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 [email protected]/turf

單獨安裝某個模塊

npm [email protected]/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案例》,
請注明出處:http://www.qsexmk.tw/html/GIS/WebGIS/8177.html