2015-09-14 3 views
1

у меня есть ArratList<Segment> (N сегментов - размер массива N), когда:Вычисление пересечения между линиями с GeoTools (Java)

public class Segment { 
    Node vertex_1; 
    Node vertex_2; 
} 

public class Node { 
    double latitude; 
    double longitude; 
} 

И одна статическая точка - точка начала. Как работать с GeoTools, чтобы получить ArrayList<boolean> (размер N), где каждое значение истинно/ложно относительно вопроса:

Является ли 2 линии от места происхождения до обоих краев сегмента, пересекает некоторые другие сегменты на своем пути ? Примечание: сегменты достаточно близки друг к другу, поэтому здесь нет вопросов Great-circle

Например, здесь результат {true, false, false}, потому что красная линия от точки начала до второго края сегмента 1 пересекает на ее пути сегмента 3.

enter image description here

Этот вопрос похож на this Stackoverflow Q, но разница в том, что здесь я хочу работать с GeoTools вместо реализации алгоритма, который с участием перевода географических единиц измерения (широта/долгота) в полярную плоскость и выполнение некоторых математических вычислений, таких как кросс-продукты - не сложно, но имеет потенциал для ошибок, и если уже есть готовая библиотека с открытым исходным кодом, лучше использовать ее.

Поскольку этот вопрос с использованием ГИС-решения, он также задал вопрос в gis stackexchange.

+0

Вам нужно будет переделать вашу проблему как точки и объект LineString, а затем сказать нам, где о ваших линиях на земном шаре, прежде чем мы сможем попытаться ответить на это. –

+0

@iant 1. Точки находятся в радиусе 200 м (без большого круга и т. Д. Проблемы, если это то, что вы имеете в виду). 2. Я не ищу решение для кода, а не для алгоритмического решения вроде: конвертировать pojos в объекты GeoTools, затем ... Спасибо, – michael

+0

@iant Я разместил этот маленький вопрос как предварительный для этого: http://stackoverflow.com/ вопросы/32565298/GeoTools-хау к Построй-точка-импорт-выпуск – michael

ответ

1

Вы можете использовать Coordinate (ваш Node) и LineString (ваш сегмент) объектов, чтобы решить эту проблему:

// origin point 
Coordinate origin = new Coordinate(5, 0); 
// segments 
ArrayList<LineString> segmentList = new ArrayList(); 
LineString segmentA = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 5), new Coordinate(5, 5)}); 
segmentList.add(segmentA); 
LineString segmentB = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(4, 3), new Coordinate(6, 3)}); 
segmentList.add(segmentB); 
LineString segmentC = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(7, 4), new Coordinate(10, 4)}); 
segmentList.add(segmentC); 
// result list 
ArrayList<Boolean> resultList = new ArrayList(); 
for(int i = 0; i < segmentList.size(); i++){ 
    // flag to indicate intersection 
    boolean intersectionResult = false; 
    // get current segment 
    LineString currentSegment = segmentList.get(i); 
    // get segments from segment pooints to origin 
    LineString startSegment = new GeometryFactory().createLineString(new Coordinate[]{origin, currentSegment.getStartPoint().getCoordinate()}); 
    LineString endSegment = new GeometryFactory().createLineString(new Coordinate[]{origin, currentSegment.getEndPoint().getCoordinate()}); 
    // iterate over sections 
    for(int j = 0; j < segmentList.size(); j++){ 
     // ignore same section 
     if(i != j){ 
      // check for intersections between segments 
      if(startSegment.intersects(segmentList.get(j)) || endSegment.intersects(segmentList.get(j))){ 
       intersectionResult = true; 
       continue; 
      } 
     } 
    } 
    // no intersection found 
    resultList.add(intersectionResult); 
} 

// print results 
for(Boolean b : resultList){ 
    System.out.println("intersection of segment -> " + b.booleanValue()); 
} 
Смежные вопросы