Найти пересечения MultiLineString с JTS - PullRequest
0 голосов
/ 26 апреля 2020

Если у меня два MULTILINESTRING:

g1: MULTILINESTRING ((1 1, 1 4), (3 1, 3 5), (0 1, 4 5))
g2: MULTILINESTRING ((0 2, 4 2), (0 3, 4 3), (0 3, 1 4))

Я хочу получить следующие пересечения для каждого из следующих случаев:

A) между g1 и g2

B) между сегментами g1

Я получил только первый случай со следующим кодом:

public class Principal {
    public static void main(String[] args) throws ParseException {

        LineString L1 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(1, 1),new Coordinate(1, 4)});
        LineString L2 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(3, 1),new Coordinate(3, 5)});
        LineString L3 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 1),new Coordinate(4, 5)});

        Geometry g1 = new GeometryFactory().createMultiLineString(new LineString[]{L1, L2, L3});
        System.out.println("g1: " + g1);

        LineString L4 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 2),new Coordinate(4, 2)});
        LineString L5 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 3),new Coordinate(4, 3)});
        LineString L6 = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 3),new Coordinate(1, 4)});
        Geometry g2 = new GeometryFactory().createMultiLineString(new LineString[]{L4, L5, L6});

        System.out.println("g2: " + g2);

        System.out.println(g1.intersection(g2));

    }
}

Output:
g1: MULTILINESTRING ((1 1, 1 2), (1 2, 1 4), (3 1, 3 4), (0 1, 1 2), (1 2, 3 4))
g2: MULTILINESTRING ((0 2, 4 2), (0 3, 4 3), (0 3, 1 4))
MULTIPOINT ((1 2), (1 3), (1 4), (2 3), (3 2), (3 3))

Но я не знаю, как найти пересечение между сегментами g1 (результат, я надеюсь, is: MULTIPOINT ((1 2), (3 4)).

Я прочитал некоторую документацию и, насколько я понимаю, для многих сегментов целесообразно использовать класс SimpleMCSweepLineIntersector, поскольку он позволяет найти все пересечения между одним или двумя наборами ребер (это именно то, что я пытаюсь).

Проблема в том, что я не знаю, как написать необходимый код, чтобы иметь возможность использовать этот класс и он возвращает мне через консоль пересечение, как для случая A, так и для B.

Не могли бы вы сказать мне, как написать код для использования этого класса в обоих случаях?

...