public class Geometrist
extends java.lang.Object
该类有两个用途,一是用来判断两个几何对象间的空间位置关系,例如:判断两个几何对象是分离还是包含;二是对几何对象进行几何运算,例如对几何对象进行裁剪,相交等操作。
目前版本支持的操作有:裁剪,相交,擦除,合并,对称差,更新和同一。不同的操作对被操作几何对象和操作几何对象要求的类型不同,使用时应注意。
注意:该类所给出的图示均为示意图,不包含该类空间位置关系或操作的所有类型。在空间位置关系判断的图示中橘黄色代表搜索图层,绿色代表被搜索图层;在几何运算的图示中,深蓝色代表被操作几何对象,浅蓝色代表操作几何对象。
限定符和类型 | 方法和说明 |
---|---|
static boolean |
canContain(Geometry geometrySearch, Geometry geometryTarget)
判断搜索几何对象是否包含被搜索几何对象。
|
static Geometry |
clip(Geometry geometry, Geometry clipGeometry)
生成被操作对象经过操作对象裁剪后的几何对象。
|
static Geometry |
clip(Geometry geometry, Rectangle2D clipRectangle)
生成被操作几何对象经过矩形对象裁剪后的几何对象。
|
static GeoRegion |
computeConvexHull(Geometry geometry)
计算几何对象的凸闭包,即最小外接多边形。
|
static GeoRegion |
computeConvexHull(Point2Ds points)
计算点集的凸闭包,即最小外接多边形。
|
static GeoArc |
computeFillet(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2, double radius)
计算线与线的倒圆角,返回倒圆角所对应的弧段。
|
static double |
computeGeodesicArea(Geometry geometry, PrjCoordSys prjCoordSys)
计算经纬度面积。
|
static double |
computeGeodesicDistance(Point2Ds points, double majorAxis, double flatten)
计算测地线的长度。
|
static double |
computeGeodesicLength(Geometry geometry, PrjCoordSys prjCoordSys)
计算对象长度,如果是面对象,计算周长
|
static GeoLine |
computeParallel(GeoLine geoLine, double distance)
根据距离求已知折线的平行线,返回平行线。
|
static GeoLine |
computeParallel(Point2D point, Point2D startPoint, Point2D endPoint)
求经过指定点与已知直线平行的直线。
|
static GeoLine |
computePerpendicular(Point2D point, Point2D startPoint, Point2D endPoint)
计算已知点到已知线的垂线。
|
static Point2D |
computePerpendicularPosition(Point2D point, Point2D startPoint, Point2D endPoint)
计算已知点到已知线的垂足。
|
static double |
distance(Geometry geometry1, Geometry geometry2)
求两个几何对象之间的距离。
|
static Geometry |
erase(Geometry geometry, Geometry eraseGeometry)
在被操作对象上擦除掉与操作对象相重合的部分。
|
static boolean |
hasCommonLine(Geometry geometrySearch, Geometry geometryTarget)
判断搜索几何对象是否与被搜索几何对象有公共线段。
|
static boolean |
hasCommonPoint(Geometry geometrySearch, Geometry geometryTarget)
判断搜索几何对象是否与被搜索几何对象有共同节点。
|
static boolean |
hasCross(Geometry geometrySearch, Geometry geometryTarget)
判断搜索几何对象是否穿越被搜索几何对象。
|
static boolean |
hasHollow(Geometry geometry)
判断指定的面对象是否包含有洞类型的子对象。
|
static boolean |
hasIntersection(Geometry geometrySearch, Geometry geometryTarget)
判断被搜索几何对象与搜索几何对象是否有面积相交。
|
static boolean |
hasOverlap(Geometry geometrySearch, Geometry geometryTarget)
判断被搜索几何对象是否与搜索几何对象部分重叠。
|
static boolean |
hasTouch(Geometry geometrySearch, Geometry geometryTarget)
判断被搜索几何对象的边界是否与搜索几何对象的边界相触。
|
static Geometry |
identity(Geometry geometry, Geometry identityGeometry)
对被操作对象进行同一操作。
|
static Geometry |
intersect(Geometry geometry1, Geometry geometry2)
对两个几何对象求交,返回两个几何对象的交集。
|
static Point2D |
intersectLine(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2, boolean isExtended)
返回两条线段(直线)的交点。
|
static Point2D[] |
intersectPolyLine(Point2Ds points1, Point2Ds points2)
返回两条折线的交点。
|
static boolean |
isDisjointed(Geometry geometrySearch, Geometry geometryTarget)
判断被搜索几何对象是否与搜索几何对象分离。
|
static boolean |
isIdentical(Geometry geometrySearch, Geometry geometryTarget)
判断被搜索几何对象是否与搜索几何对象完全相等。
|
static boolean |
isParallel(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2)
判断两条线是否平行。
|
static boolean |
isPerpendicular(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2)
判断两条直线是否垂直。
|
static boolean |
isPointOnLine(Point2D point, Point2D startPoint, Point2D endPoint, boolean isExtended)
判断已知点是否在已知线段(直线)上,点在线上返回 true, 否则返回 false。
|
static boolean |
isSelfIntersect(Geometry geometry)
判断指定Geometry是否自相交,即线或面对象是否有线段相交。
|
static boolean |
isWithin(Geometry geometrySearch, Geometry geometryTarget)
判断搜索几何对象是否在被搜索几何对象内。
|
static GeoRegion[] |
patchSelfIntersectRegion(GeoRegion geoRegion)
分割自相交面
|
static Geometry |
resample(Geometry geometry, ResampleType resampleType, double tolerance)
对几何对象进行重采样。
|
static Point2Ds |
smooth(Point2Ds points, int smoothness)
对指定的点串对象进行光滑处理。
|
static GeoLine[] |
splitLine(GeoLine sourceLine, Geometry splitGeometry, double tolerance)
使用点、线或面对象对线对象进行分割(打断)。
|
static boolean |
splitRegion(GeoRegion sourceRegion, Geometry splitGeometry, GeoRegion targetGeoRegion1, GeoRegion targetGeoRegion2)
用线或面几何对象分割面几何对象。
|
static Geometry |
union(Geometry geometry1, Geometry geometry2)
对两个对象进行合并操作。
|
static Geometry |
update(Geometry geometry, Geometry updateGeometry)
对被操作对象进行更新操作。
|
static Geometry |
xOR(Geometry geometry1, Geometry geometry2)
对两个对象进行异或运算。
|
public static boolean isIdentical(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象,支持点、线、面类型。geometryTarget
- 被搜索几何对象,支持点、线、面类型。public static boolean isDisjointed(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象,支持点、线、面类型。geometryTarget
- 被搜索几何对象,支持点、线、面类型。public static boolean hasIntersection(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象。geometryTarget
- 被搜索几何对象。Geometrist.computeConvexHull()
方法的示例。public static boolean hasTouch(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象。geometryTarget
- 被搜索几何对象。Geometrist.computeConvexHull()
方法的示例。public static boolean hasOverlap(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象,只支持线、面类型。geometryTarget
- 被搜索几何对象,只支持线、面类型。Geometrist.computeConvexHull()
方法的示例。public static boolean hasCross(Geometry geometrySearch, Geometry geometryTarget)
注意,如果两个几何对象存在穿越关系则:
geometrySearch
- 搜索几何对象,只支持线类型。geometryTarget
- 被搜索几何对象,支持线、面类型。public static boolean isWithin(Geometry geometrySearch, Geometry geometryTarget)
注意:
geometrySearch
- 搜索几何对象,支持点、线、面类型。geometryTarget
- 被搜索几何对象,支持点、线、面类型。canContain(Geometry,Geometry)
public static boolean canContain(Geometry geometrySearch, Geometry geometryTarget)
注意,如果存在包含关系,则:
geometrySearch
- 搜索几何对象,支持点、线、面类型。geometryTarget
- 被搜索几何对象,支持点、线、面类型。isWithin(Geometry,Geometry)
Geometrist.computeConvexHull()
方法的示例。public static boolean hasCommonPoint(Geometry geometrySearch, Geometry geometryTarget)
geometrySearch
- 搜索几何对象,支持点、线、面类型。geometryTarget
- 被搜索几何对象,支持点、线、面类型。Geometrist.computeConvexHull()
方法的示例。public static boolean hasCommonLine(Geometry geometrySearch, Geometry geometryTarget)
geometrySearch
- 搜索几何对象,只支持线、面类型。geometryTarget
- 被搜索几何对象,只支持线、面类型。Geometrist.computeConvexHull()
方法的示例。public static Geometry clip(Geometry geometry, Geometry clipGeometry)
注意:
geometry
- 被操作几何对象,支持线和面类型。clipGeometry
- 操作几何对象,必须是面对象。Geometrist.computeConvexHull()
方法的示例。public static Geometry clip(Geometry geometry, Rectangle2D clipRectangle)
被操作几何对象只有落在矩形对象内的那部分才会被输出为结果几何对象。
geometry
- 被操作的几何对象,支持线和面类型。clipRectangle
- 用于裁剪的二维矩形。public static boolean hasHollow(Geometry geometry)
geometry
- 待判断的面对象,目前只支持二维面对象 GeoRegion
}。public static Geometry intersect(Geometry geometry1, Geometry geometry2)
注意:
geometry1
- 被操作几何对象。geometry2
- 操作几何对象。GeoRegion
类的示例。public static Geometry erase(Geometry geometry, Geometry eraseGeometry)
注意:
geometry
- 被操作几何对象,支持点、线、面对象类型。eraseGeometry
- 操作几何对象,必须为面对象类型。public static Geometry union(Geometry geometry1, Geometry geometry2)
注意:
geometry1
- 被操作几何对象。geometry2
- 操作几何对象。public static Geometry xOR(Geometry geometry1, Geometry geometry2)
进行异或运算的两个几何对象必须是同类型的,只支持面面。
geometry1
- 被操作几何对象,只支持面类型。geometry2
- 操作几何对象,只支持面类型。public static Geometry update(Geometry geometry, Geometry updateGeometry)
geometry
- 被操作几何对象,即被更新的几何对象,必须为面对象。updateGeometry
- 操作几何对象,用于进行更新运算的几何对象,必须为面对象。public static Geometry identity(Geometry geometry, Geometry identityGeometry)
注意:
geometry
- 被操作几何对象,支持点、线、面对象。identityGeometry
- 操作几何对象,必须为面对象。public static Geometry resample(Geometry geometry, ResampleType resampleType, double tolerance)
对几何对象重采样是按照一定规则剔除一些节点,以达到对数据进行简化的目的(如下图所示),其结果可能由于使用不同的重采样方法而不同。SuperMap 提供两种方法对几何对象进行重采样,分别为光栏法和道格拉斯-普克法。有关这两种方法的详细介绍,请参见 ResampleType
类。
geometry
- 指定的要进行重采样的几何对象。支持线对象和面对象。resampleType
- 指定的重采样方法。tolerance
- 指定的重采样容限。请参见 ResampleType
类public static double distance(Geometry geometry1, Geometry geometry2)
注意:几何对象的类型只能是点、线和面。这里的距离指的是两个几何对象边线间最短距离。例如:点到线的最短距离就是点到该线的垂直距离。
geometry1
- 第一个几何对象。geometry2
- 第二个几何对象。Geometrist.computeConvexHull()
方法的示例。public static GeoRegion computeConvexHull(Point2Ds points)
points
- 点集。public static GeoRegion computeConvexHull(Geometry geometry)
geometry
- 几何对象。public void computeConvexHullTest(){ // 假设打开一个工作空间 workspace 对象,工作空间中存在一个数据源 datasource 对象 // 从数据源中取出一个数据集 dataset // 取出 SmID 值分别等于88和101的记录,同时取出相应几何对象 DatasetVector dataset = (DatasetVector) datasource.getDatasets().get( "World"); Recordset recordSearch = dataset.query("SmID=101", CursorType.STATIC); Recordset recordTarget = dataset.query("SmID=88", CursorType.STATIC); GeoRegion geometrySearch = (GeoRegion) recordSearch.getGeometry(); GeoRegion geometryTarget = (GeoRegion) recordTarget.getGeometry(); // 计算几何对象的最小外接多边形 System.out.println(Geometrist.computeConvexHull(geometrySearch)); // 几何运算 System.out.println(Geometrist.clip(geometrySearch, geometryTarget)); System.out.println(Geometrist.canContain(geometrySearch, geometryTarget)); System.out.println(Geometrist.hasCommonLine(geometrySearch, geometryTarget)); System.out.println(Geometrist.hasCommonPoint(geometrySearch, geometryTarget)); System.out.println(Geometrist.hasIntersection(geometrySearch, geometryTarget)); System.out.println(Geometrist.hasOverlap(geometrySearch, geometryTarget)); System.out.println(Geometrist.hasTouch(geometrySearch, geometryTarget)); System.out.println(Geometrist.distance(geometrySearch, geometryTarget)); // 释放资源 recordTarget.dispose(); recordSearch.dispose(); }
public static boolean splitRegion(GeoRegion sourceRegion, Geometry splitGeometry, GeoRegion targetGeoRegion1, GeoRegion targetGeoRegion2)
注意:参数中的分割对象与被分割对象必须至少有两个交点,否则的话会分割失败。
sourceRegion
- 被分割的面对象。splitGeometry
- 用于分割的几何对象,可以是线或面几何对象。targetGeoRegion1
- 返回分割后的第一个面对象。targetGeoRegion2
- 返回分割后的第二个面对象。public static GeoArc computeFillet(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2, double radius)
其中参数 startPoint1 和 endPoint1 构成第一条线段,startPoint2 和 endPoint2 构成第二条线段,作两条线段的内切圆,该内切圆的半径必须满足参数 radius给定的值。此时,在靠近两条线交点的两个点的坐标将发生变化,变为内切圆和两条线切点的坐标。得到的弧段将是四个点和靠近交点的圆弧的组合。
startPoint1
- 第一条线的起点。endPoint1
- 第一条线的终点。startPoint2
- 第二条线的起点。endPoint2
- 第二条线的终点。radius
- 圆弧的半径。public static boolean isParallel(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2)
startPoint1
- 第一条线的起点。endPoint1
- 第一条线的终点。startPoint2
- 第二条线的起点。endPoint2
- 第二条线的终点。public static GeoLine computeParallel(Point2D point, Point2D startPoint, Point2D endPoint)
point
- 直线外的任意一点。startPoint
- 直线上的一点。endPoint
- 直线上的另一点。public static GeoLine computeParallel(GeoLine geoLine, double distance)
geoLine
- 已知折线对象。distance
- 所求平行线间的距离。public static boolean isPerpendicular(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2)
startPoint1
- 第一条线的起点。endPoint1
- 第一条线的终点。startPoint2
- 第二条线的起点。endPoint2
- 第二条线的终点。public static GeoLine computePerpendicular(Point2D point, Point2D startPoint, Point2D endPoint)
point
- 已知一点。startPoint
- 直线上的一点。endPoint
- 直线上的另一点。public static Point2D computePerpendicularPosition(Point2D point, Point2D startPoint, Point2D endPoint)
point
- 已知一点。startPoint
- 直线上的一点。endPoint
- 直线上的另一点。public static boolean isPointOnLine(Point2D point, Point2D startPoint, Point2D endPoint, boolean isExtended)
point
- 已知点。startPoint
- 已知线段的起点。endPoint
- 已知线段的终点。isExtended
- 是否将线段进行延长计算,如果 isExtended = true,就按直线计算,否则按线段计算。public static Point2D intersectLine(Point2D startPoint1, Point2D endPoint1, Point2D startPoint2, Point2D endPoint2, boolean isExtended)
startPoint1
- 第一条线的起点。endPoint1
- 第一条线的终点。startPoint2
- 第二条线的起点。endPoint2
- 第二条线的终点。isExtended
- 是否将线段进行延长计算,如果 isExtended = true,就按直线计算,否则按线段计算。public static double computeGeodesicDistance(Point2Ds points, double majorAxis, double flatten)
曲面上两点之间的短程线称为测地线。球面上的测地线即是大圆。
测地线 又称“大地线”或“短程线”。地球椭球面上两点间的最短曲线。在大地线上,各点的主曲率方向均与该点上曲面法线相合。它在圆球面上为大圆弧,在平面上就是直线。在大地测量中,通常用大地线来代替法截线,作为研究和计算椭球面上各种问题。
测地线是在一个曲面上,每一点处测地曲率均为零的曲线。
points
- 构成测地线的简单点串。majorAxis
- 测地线所在椭球体的长轴。flatten
- 测地线所在椭球体的扁率。public static double computeGeodesicArea(Geometry geometry, PrjCoordSys prjCoordSys)
注意:
使用该方法计算经纬度面积,在通过 prjCoordSys 参数指定投影坐标系类型对象(PrjCoordSys
)时,必须通过该对象的 setType
方法设置投影坐标系类型为地理经纬坐标系(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE
),否则计算结果错误。
geometry
- 指定的需要计算经纬度面积的 Geometry 对象。prjCoordSys
- 指定的投影坐标系类型。public static Point2D[] intersectPolyLine(Point2Ds points1, Point2Ds points2)
points1
- 构成第一条折线的点串。points2
- 构成第二条折线的点串。public static Point2Ds smooth(Point2Ds points, int smoothness)
points
- 需要进行光滑处理的点串。smoothness
- 光滑系数。有效范围为大于等于2,设置为小于2的值会抛出异常。光滑系数越大,线对象或面对象边界的节点数越多,也就越光滑。建议取值范围为[2,10]。public static GeoLine[] splitLine(GeoLine sourceLine, Geometry splitGeometry, double tolerance)
该方法可用于使用点、线、面对象对线对象进行打断或分割。下面以一个简单线对象对这三种情况进行说明。
点对象打断线对象
使用点对象对线对象进行打断,原线对象在点对象位置打断为两个线对象。如下图所示,使用点(黑色)对线(蓝色)进行打断,结果为两个线对象(红色线和绿色线)。
线对象分割线对象
这种情况分割线(用于分割的线对象)会将操作线(被分割的线对象)分割为两个线对象。分割线为一条折线,可以是只包含两个端点的线段,也可以是包含多个节点的折线。
当分割线为线段时,操作线将会在其与分割线的交点处被分割为两个线对象。如下图所示,图中黑色线为分割线,分割后原线对象被分为两个线对象(红色线和绿色线)。
当分割线为折线时,可能与操作线有多个交点,此时会在所有交点处将操作线打断,然后按顺序将位于奇数和偶数次序的线段分别合并,产生两个线对象。也就是说,使用折线分割线时,可能会产生复杂线对象。下图展示的就是这种情况,分割后,红色的线和绿色的线分别为一个复杂线对象。
面对象分割线对象
面对象分割线对象与线分割线类似,会在分割面和操作线的所有交点处将操作线打断,然后分别将位于奇数和偶数位置的线合并,产生两个线对象。这种情况会产生至少一个复杂线对象。下图中,面对象(浅橙色)将线对象分割为红色和绿色两个复杂线对象。
注意:
1. 如果被分割的线对象为复杂对象,那么如果分割线经过子对象,则会将该子对象分割为两个线对象,因此,分割复杂线对象可能产生多个线对象。
2. 用于分割的线对象或者面对象如果有自相交,分割不会失败,但分割的结果可能不正确。因此,应尽量使用没有自相交的线或面对象来分割线。
sourceLine
- 待分割(打断)的线对象。splitGeometry
- 用于分割(打断)线对象的对象,支持点、线、面对象。tolerance
- 指定的容限,用于判断点对象是否在线上,若点到线的垂足距离大于该容限值,则认为用于打断的点对象无效,从而不执行打断。public static boolean isSelfIntersect(Geometry geometry)
geometry
- 需检查的几何对象。public static double computeGeodesicLength(Geometry geometry, PrjCoordSys prjCoordSys)
geometry
- 要计算面积的几何对象prjCoordSys
- 投影坐标系类型。投影坐标系统由地图投影方式、投影参数、坐标单位和地理坐标系组成。