SuperMap iObjects Java获取一个线对象跟线数据集的交叉点位置及夹角

作者:dongyx

在实际项目中,经常会有这样一个需求,已知一个线对象和一个线数据集,如何获取该线对象和线数据集的交叉位置以及对应的夹角呢,下面小编将通过SuperMap iObjects Java产品来给大家理理思路。
一、目的
如下图所示,获取交叉位置及夹角:
在这里插入图片描述
二、实现步骤
2.1 空间查询
首先对线数据集做空间查询,查询模式为相交,求出线数据集中与线对象相交的对象。

DatasetVector datasetVectorLine = (DatasetVector)datasource.getDatasets().get("NewLine_2");
Point2Ds point2Ds1 = new Point2Ds();
point2Ds1.add(new Point2D(95.3526227799,31.1569929831));
point2Ds1.add(new Point2D(95.3533184606,31.1584837275));
GeoLine geoLineQuery = new GeoLine(point2Ds1);
QueryParameter parameter = new QueryParameter();
parameter.setCursorType(CursorType.DYNAMIC);
parameter.setSpatialQueryMode(SpatialQueryMode.INTERSECT);
parameter.setSpatialQueryObject(geoLineQuery);
Recordset query = datasetVectorLine.query(parameter);

2.2 取上一步查询的记录集Recordset与线对象做相交,获取线线之间的交点PointCenter,使用接口Geometrist.intersectPolyLine();

GeoLine geoLineA = (GeoLine) recordset.getGeometry();
Point2Ds point2DsLine = geoLineA.getPart(0);
Point2D[] point2DS = Geometrist.intersectPolyLine(geoLineQuery.getPart(0), point2DsLine);

2.3 获取交点在线数据集中相交对象的具体位置,这样就可以通过三点坐标来获取夹角了。获取相交对象的节点坐标,geoline.getPart();根据返回的节点坐标从第一个点开始两两构成一条直线GeoLineNew,通过Geometrist.isWithin方法拿到交点在哪条线对象上,然后获取线对象的节点坐标PointA。同理中线也可以这么实现拿到坐标PointB。

for (int i = 0; i < point2DsLine.getCount()-1; i++) {
    
    
    Point2Ds point2Ds2 = new Point2Ds();
    point2Ds2.add(new Point2D(point2DsLine.getItem(i)));
    point2Ds2.add(new Point2D(point2DsLine.getItem(i+1)));
    GeoLine geoLine1 = new GeoLine(point2Ds2);
    Point2D point2D = point2DS[j];
    GeoPoint geoPoint = new GeoPoint(point2D);
    boolean isTrue = Geometrist.isWithin(geoPoint
            , geoLine1);
    if(isTrue){
    
    
        Point2D item = geoLine1.getPart(0).getItem(1);
        geoPointA = new GeoPoint(item);
    }
}
for (int i = 0; i < geoLineQuery.getPart(0).getCount()-1; i++) {
    
    
    Point2Ds point2Dssource = new Point2Ds();
    point2Dssource.add(new Point2D(geoLineQuery.getPart(0).getItem(i)));
    point2Dssource.add(new Point2D(geoLineQuery.getPart(0).getItem(i+1)));
    GeoLine geoLinesource = new GeoLine(point2Dssource);
    Point2D point2D = point2DS[j];
    GeoPoint geoPoint = new GeoPoint(point2D);
    boolean isTrue = Geometrist.isWithin(geoPoint
            , geoLinesource);
    if(isTrue){
    
    
        Point2D item = geoLinesource.getPart(0).getItem(1);
        geoPointB = new GeoPoint(item);
    }
}
//交点坐标
double centerX = point2DS[j].getX();
double centerY = point2DS[j].getY();
//线段坐标
double pointAX = geoPointA.getX();
double pointAY = geoPointA.getY();
double pointBX = geoPointB.getX();
double pointBY = geoPointB.getY();

2.4 通过三点坐标PointCenter、PointA、PointB获取角度

//向量的点乘
double vector = (pointAX - centerX) * (pointBX - centerX) + (pointAY - centerY) * (pointBY - centerY);
//向量的模乘
double sqrt = Math.sqrt(
(Math.abs((pointAX - centerX) * (pointAX - centerX)) + Math.abs((pointAY - centerY) * (pointAY - centerY)))
* (Math.abs((pointBX - centerX) * (pointBX - centerX)) + Math.abs((pointBY - centerY) * (pointBY - centerY)))
);
//反余弦计算弧度
double radian = Math.acos(vector / sqrt);
//弧度转角度制
double v = 180 * radian / Math.PI;

完整代码下载链接:https://pan.baidu.com/s/1ksBIaMwuAIBWHdMkeYamKA?pwd=yzrh

猜你喜欢

转载自blog.csdn.net/supermapsupport/article/details/130948117