SuperMap iObjects Java obtiene la posición de intersección y el ángulo entre un objeto de línea y un conjunto de datos de línea

Autor: dongyx

En proyectos reales, a menudo existe tal requisito. Conocer un objeto de línea y un conjunto de datos de línea, cómo obtener la posición de intersección y el ángulo correspondiente entre el objeto de línea y el conjunto de datos de línea. El siguiente editor utilizará SuperMap iObjects Java. El producto es aquí para dar a todos una idea racional.
1. Propósito
Como se muestra en la figura a continuación, obtenga la posición de intersección y el ángulo incluido:
inserte la descripción de la imagen aquí
2. Realice el paso
2.1 Consulta espacial
Primero, realice una consulta espacial en el conjunto de datos de línea, el modo de consulta es intersección y encuentre los objetos que se cruzan con el objeto de línea en el conjunto de datos de línea.

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 Tome el conjunto de registros Recordset consultado en el paso anterior para intersectar con el objeto de línea, obtenga el punto de intersección PointCenter entre las líneas y use la interfaz Geometrist.intersectPolyLine();

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

2.3 Obtenga la posición específica del objeto de intersección en el conjunto de datos en línea del punto de intersección, de modo que el ángulo se pueda obtener a través de las coordenadas de tres puntos. Obtenga las coordenadas de nodo del objeto de intersección, geoline.getPart(); de acuerdo con las coordenadas de nodo devueltas, forme una línea recta GeoLineNew en pares desde el primer punto, obtenga el objeto de línea en el que se encuentra el punto de intersección a través del método Geometrist.isWithin , y luego obtenga el objeto de línea Las coordenadas de nodo de PointA. De manera similar, la línea media también se puede lograr de esta manera para obtener la coordenada 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 Obtener el ángulo a través de las coordenadas de tres puntos 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;

Enlace de descarga del código completo: https://pan.baidu.com/s/1ksBIaMwuAIBWHdMkeYamKA?pwd=yzrh

Supongo que te gusta

Origin blog.csdn.net/supermapsupport/article/details/130948117
Recomendado
Clasificación