2016-08-14 2 views
0

Если у меня есть linestring в JTS (или какая-то открытая полилиния вообще) с указанием его начальной точки, есть ли какой-то умный способ рассказать на перекрестках с закрытыми polygon ли linestring является «входом» многоугольник или выхода из него, либо:Определите, входит ли лининг или выходит из многоугольника

  • В JRS (я не могу найти способ в документации), только координаты, где линия и закрытая форма пересекаться с intersection
  • Некоторые общие умный способ. Я в настоящее время сделал это, проверив точку на очень маленьком расстоянии, вдоль linestring по обе стороны от polygon край и тестирование, которое было «in», и которое было «вне». Возможно, это может привести к неправильному результату, если у polygon был (маловероятный) ДЕЙСТВИТЕЛЬНО острый внутренний край.

ответ

1

Проверить, если начальная точка сегмента в linestring находится внутри полигона или снаружи, чтобы выяснить, если она входе или выходе из polygon. Простой пример кода:

// some demo polygon + line 
Polygon polygon = new GeometryFactory().createPolygon(new Coordinate[]{new Coordinate(1,1), new Coordinate(6,1), new Coordinate(6,6), new Coordinate(1,6), new Coordinate(1,1)}); 
LineString line = new GeometryFactory().createLineString(new Coordinate[]{new Coordinate(0, 0), new Coordinate(5,5), new Coordinate(10,5)}); 

// check for intersection in the first place 
if(line.intersects(polygon)){ 
    System.out.println("line intersects polygon!"); 
    // iterate over all segments of the linestring and check for intersections 
    for(int i = 1; i < line.getNumPoints(); i++){ 
     // create line for current segment 
     LineString currentSegment = new GeometryFactory().createLineString(new Coordinate[]{line.getCoordinates()[i-1], line.getCoordinates()[i]}); 
     // check if line is intersecting with ring 
     if(currentSegment.intersects(polygon)){ 
      // segment is entering the ring if startpoint is outside the ring 
      if(!polygon.contains(currentSegment.getStartPoint())){ 
       System.out.println("This segment is entering the polygon -> "); 
       System.out.println(currentSegment.toText()); 
      // startpoint is inside the ring 
      } 
      if (polygon.contains(currentSegment.getStartPoint())) { 
       System.out.println("This segment is exiting the polygon -> "); 
       System.out.println(currentSegment.toText()); 
      } 
     } 
    } 
} else { 
    System.out.println("line is not intersecting the polygon!"); 
} 

Этот код не включает все возможные функции. Например. если отдельные сегменты пересекают многоугольник многократно (ввод + выход), это не рассматривается в этом примере. В этом случае просто подсчитайте количество перекрестков и создайте соответствующее число линий между точками пересечения.

0

Отвечая на мой собственный вопрос - для тех, у кого есть аналогичная проблема. В итоге я написал немного кода, основанного на количестве перекрестков (так как у меня уже были эти JTS). Идеи основывались на материалах от crossing number algorithm и odd-even rule.

«правила» (я не думаю, что есть исключения, вероятно, неправильно), являются:

  1. введите пересечение должно сопровождаться выходом, и наоборот.
  2. Если вы начинаете в замкнутом многоугольнике, то первая точка пересечения является выходом.
  3. Если вы не начинаете в многоугольнике, первым пересечением является ввод.

В псевдокоде, что-то вроде этого:

Get intersection_points between polyline and closed polygon // using JTS.intersect() 
    Sort intersection_points along chainage of polyline 
    if polyline start_point in polygon // using JTS.contains() 
     first intersect_point is an EXIT, next is an ENTER, EXIT, ENTER and so on alternating along chainage. 
    else //start point not in polygon 
     first intersect_point is an ENTER, next is an EXIT, ENTER, EXIT and so on along chainage. 

не смотрел на источник JTS intersect и contains методы так могут быть некоторые Удвоение в том, что я делаю, и некоторые оптимизации там.

Смежные вопросы