JTS

常用的Geometry數(shù)據(jù)結(jié)構(gòu)

Geometry數(shù)據(jù)結(jié)構(gòu)

GeometryFactory

GeometryFactory是geometry的工廠類甩挫,提供了Geometry子類的創(chuàng)建方法的統(tǒng)一入口供嚎。在創(chuàng)建Geometry的時候建議用GeometryFactory去創(chuàng)建旨巷,不要單獨自己去new一個子類北戏。

數(shù)據(jù)結(jié)構(gòu)

private PrecisionModel precisionModel : 精度模式,默認(rèn)為FLOAT
private CoordinateSequenceFactory coordinateSequenceFactory : 坐標(biāo)序列工廠類消别,創(chuàng)CoordinateList

PrecisionModel

創(chuàng)建Geometry的時候通過PrecisionModel可以控制geometry坐標(biāo)的精度。
三種模式:
FLOATING: 等同于Java的雙精度double類型
FLOATING_SINGLE: 等同于Java的單精度float類型
FIXED: 固定精度模式(固定小數(shù)點后幾位)台谢。通過public PrecisionModel(double scale)構(gòu)造方法構(gòu)造寻狂。
FIXED去固定精度并不會改變geometry里的點的真實坐標(biāo),只會去改變toString出來的wkt格式的坐標(biāo)精度朋沮。慎用蛇券。

Geometry類常用工具方法

LineString

數(shù)據(jù)結(jié)構(gòu)

CoordinateSequence coordinates: 一堆點的集合。

常用方法
method description
boolean isClosed() 判斷LineString是否閉合,第一個點和最后一個點是否相等
boolean isRing() 在判斷isClosed()的同時判斷是否是簡單圖形
LineString copyInternal() 深拷貝一個LineString
LinearRing

可以理解成封閉的LineString樊拓,至少需要3個點纠亚。

Polygon
數(shù)據(jù)結(jié)構(gòu):

LinearRing shell : 表示外輪廓。一個Polygon只能有一個shell筋夏。
LinearRing[] holes: 表示洞蒂胞。一個Polygon可有多個hole。

常用方法
method description
Coordinate[] getCoordinates() 獲取Polygon所有的點条篷,polygon中洞的點會排在外輪廓的點之后
boolean isRectangle() 判斷polygon是不是矩形
LinearRing getExteriorRing() 獲取polygon外輪廓
LinearRing getInteriorRingN(int n) 獲取某一個洞
void apply(CoordinateFilter filter) 直接修改一個polygon的值(比如精度修改骗随,放大縮小之類的操作)
Polygon copyInternal() 等同于深拷貝
Geometry convexHull() 拿到Polygon的凸包
void normalize() 將polygon格式化為逆時針構(gòu)建,一般equal之前會先normalize一下
Geometry normalize() 同上,只是返回結(jié)果為一個Polygon
GeometryCollection
數(shù)據(jù)結(jié)構(gòu):

Geometry[] geometries: geometry的集合赴叹。子類有MultiPoint MultiLineString MultiPolygon.

常用方法:

實現(xiàn)了所有的Geometry的抽象方法鸿染,只是改成了對集合整體的操作

Geometry位置關(guān)系

method description example
Intersects 兩個Geometry至少有一個共同的點∑蚯桑可以理解為相交
disjoint 與Intersect功能相反涨椒,兩個Geometry沒有共同的點
touches 兩個Geometry至少有一個共同點,且只能是外輪廓有相交摊欠,內(nèi)部不能相交丢烘。對于LineString來說,只有當(dāng)交點為兩條線的端點的時候些椒,touches才能為true
A.touches(B) == true
A.touches(B) == true
crosses A.crosses(B) == B.crosses(A)可以理解為穿過播瞳,兩個Geometry有共同點且不是所有的點都為共同點。多用于對lineString的判斷
A.crosses(B) == true.
A.crosses(B) == true
contains/withIn A.contains(B),B所有的點都在A里且兩個geometry的內(nèi)部至少有一個共同點免糕。簡單理解為A包含B赢乓。相等的時候contains也為true。A.contains(B) == B.withIn(A)
covers/coveredBy A.covers(B)==B.coveredBy(A)石窑。官方的說明是:類似于contains牌芋,但更具包容性(即對于更多情況,返回true)松逊。特別是躺屁,與包含不同,它不區(qū)分幾何體邊界和內(nèi)部的點
overlaps 至少有一個點彼此不共享经宏,或者等價于兩個Geometry互相不cover犀暑。理解為有重疊
A.overlaps(B)==true
A.overlaps(B)==true

Geometry的一些計算

集合運(yùn)算

method description example
intersection A.intersection(B) == B.intersection(A)驯击。獲取兩個Geometry的交集
黃色區(qū)域為intersection
union A.union(B) == B.union(A)。獲取兩個Geometry的合集
黃色部分為A.union(B) 的結(jié)果
difference A.difference(B)獲取的是A中不包含B的部分耐亏,B.difference(A)是獲取B中不包含A的部分
黃色部分為A.difference(B)的結(jié)果
symDifference A.symDifference(B) == B.symDifference(A).獲取的是兩個Geometry union的結(jié)果取intersection的補(bǔ)集
黃色部分為A.symDifference(B)的結(jié)果

Buffer

參數(shù)說明BufferParams
parameter description
quadrantSegments 連接兩個點為一個1/4圓弧的控制點數(shù)徊都,默認(rèn)為8
endCapStyle 表示不同的線端
CAP_ROUND = 1 圓弧形狀的線端樣式
CAP_FLAT = 2 平的線端樣式
CAP_SQUARE = 3 矩形線端樣式,主要是用在LineString广辰,對于Polygon與FLat似乎沒區(qū)別
joinStyle 端點連接方式
JOIN_ROUND = 1 圓弧連接
JOIN_MITRE = 2 斜角連接
JOIN_BEVEL = 3 斜切連接
mitreLimit 使用JOIN_MITER這種策略來表示連接處形狀的時候暇矫,由于兩根線的連接角度可能很小,那么择吊, 就會導(dǎo)致延伸出來的那個角特別長李根。mitreLimit用來限制那個尖角的最大長度,默認(rèn)為5
連接方式說明
示例
Polygon
image

image

image

image

image
LineString
image

image

image

其他有用的類

Orientation

主要用來計算點集合的構(gòu)建順序

method description
boolean isCCW(Coordinate[] ring) 判斷點集合是否是逆時針構(gòu)建
MinimumDiameter

包含幾何圖形的最小直徑

method description
Geometry getMinimumRectangle() 計算geometry的最小外接矩形
AffineTransformation
method description
AffineTransformation rotationInstance(double theta) 旋轉(zhuǎn)幾何圖形theta為弧度 默認(rèn)以(0,0)為旋轉(zhuǎn)中心
AffineTransformation rotationInstance(double sinTheta, double cosTheta) 旋轉(zhuǎn)幾何圖形 sinTheta cosTheta組合表示一個弧度 默認(rèn)以(0,0)為旋轉(zhuǎn)中心
AffineTransformation rotationInstance(double theta, double x, double y) 旋轉(zhuǎn) theta為旋轉(zhuǎn)角度干发,(x,y)為旋轉(zhuǎn)中心
AffineTransformation translationInstance(double x, double y) 以(x,y)向量做平移
用法示例
 // 以(x,y)為旋轉(zhuǎn)點將geometry旋轉(zhuǎn)rotateAngle角度
AffineTransformation affineTransformation =
AffineTransformation.rotationInstance(Math.toRadians(rotateAngle), point.getX(), point.getY());
affineTransformation.transform(geometry);
LineSegment

表示由兩個坐標(biāo)定義的線段朱巨。提供計算各種幾何特性的方法以及線段之間的關(guān)系的方法。

method description
boolean isHorizontal() 判斷線段是否水平
boolean isVertical() 判斷線段是否垂直
int orientationIndex(LineSegment seg) 判斷兩個線段的位置關(guān)系枉长。1表示seg在左側(cè)冀续,-1表示在右側(cè),0表示與該段共線或交叉必峰。如果A完全位于L左側(cè)的閉合半平面內(nèi)洪唐,則A位于L段的左側(cè)。如果A完全位于L右側(cè)的閉合半平面內(nèi)吼蚁,則A位于L段的右側(cè)凭需。如果A與L共線或A與L確定的線相交,則,A相對于L有不確定的方向肝匆。
double distancePerpendicular(Coordinate p) 點與線的垂線距離
Coordinate pointAlong(double segmentLengthFraction) 按一定的比例找到線段上的點
LineSegment project(LineSegment seg) 將seg線段投影到該線段上
Coordinate reflect(Coordinate p) 點關(guān)于線做鏡像
project示例
l1.project(l2)

l2.project(l1)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粒蜈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旗国,更是在濱河造成了極大的恐慌枯怖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件能曾,死亡現(xiàn)場離奇詭異度硝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寿冕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蕊程,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驼唱,你說我怎么就攤上這事藻茂。” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵捌治,是天一觀的道長岗钩。 經(jīng)常有香客問我,道長肖油,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任臂港,我火速辦了婚禮森枪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘审孽。我一直安慰自己县袱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布佑力。 她就那樣靜靜地躺著式散,像睡著了一般。 火紅的嫁衣襯著肌膚如雪打颤。 梳的紋絲不亂的頭發(fā)上暴拄,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音编饺,去河邊找鬼乖篷。 笑死,一個胖子當(dāng)著我的面吹牛透且,可吹牛的內(nèi)容都是我干的撕蔼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秽誊,長吁一口氣:“原來是場噩夢啊……” “哼鲸沮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锅论,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤讼溺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棍厌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肾胯,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年耘纱,在試婚紗的時候發(fā)現(xiàn)自己被綠了敬肚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡束析,死狀恐怖艳馒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤弄慰,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布第美,位于F島的核電站,受9級特大地震影響陆爽,放射性物質(zhì)發(fā)生泄漏什往。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一慌闭、第九天 我趴在偏房一處隱蔽的房頂上張望别威。 院中可真熱鬧,春花似錦驴剔、人聲如沸省古。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豺妓。三九已至,卻和暖如春布讹,著一層夾襖步出監(jiān)牢的瞬間琳拭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工炒事, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留臀栈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓挠乳,卻偏偏與公主長得像权薯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睡扬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容