常用的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 |
|
crosses | A.crosses(B) == B.crosses(A)可以理解為穿過播瞳,兩個Geometry有共同點且不是所有的點都為共同點。多用于對lineString的判斷 |
|
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犀暑。理解為有重疊 |
|
Geometry的一些計算
集合運(yùn)算
method | description | example |
---|---|---|
intersection | A.intersection(B) == B.intersection(A)驯击。獲取兩個Geometry的交集 | |
union | A.union(B) == B.union(A)。獲取兩個Geometry的合集 | |
difference | A.difference(B)獲取的是A中不包含B的部分耐亏,B.difference(A)是獲取B中不包含A的部分 | |
symDifference | A.symDifference(B) == B.symDifference(A).獲取的是兩個Geometry union的結(jié)果取intersection的補(bǔ)集 |
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
LineString
其他有用的類
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)于線做鏡像 |