2015-01-14 3 views
3

Справочная информация. Этот проект включает в себя отображение регионов в среде ГИС. Мне нужно найти тогда пересечение одного множества полигонов с другим набором полигонов. Я достиг этого, выставив свои совместимые с картой полигоны как Polygon2d (http://geom-java.sourceforge.net/api/math/geom2d/polygon/package-summary.html) и использовал метод пересечения, чтобы найти список вершин для полигонов пересечения.Обнаружение пересечений многоугольных многоугольников (java)

Проблема: Это работает, за исключением случаев, когда между этими двумя полигонами имеется несколько областей пришивания. Список вершин правильный, но мне нужно разделить список на каждый отдельный многоугольник.

Первое изображение это то, что она должна выглядеть, во-вторых, что на самом деле генерируется: (. Игнорировать область в верхней Thats результат другой ошибки)

Как определить и исправить эту ситуацию?

+0

Я предлагаю размещение thi s на http://gis.stackexchange.com/ - вы можете получить лучшую обратную связь. –

ответ

0

Ну, я понял. Я взял список вершин для многоугольника пересечения (синий), итерации через каждую пару точек, отбросил каждый сегмент линии в двух оригинальных многоугольниках как объекты LineSegment2D и использовал метод .contains, чтобы проверить, была ли каждая пара точек в одном из сегментов линии. Если каждая пара точек не содержалась в пределах 1 строки, тогда возникает ошибка.

Heres метод, но имейте в виду, что есть несколько принадлежащих к собственности классов.

public static boolean noErrors(SurfacePolygonX p1, SurfacePolygonX p2, List<LatLon> list) { 
    boolean allPointsInSamePolygon = true; 

    //for each latlon jl in locations, cast jl and jl2 as points  
    for (int j = 0; j < list.size(); j++) { 
     LatLon jl = list.get(j); 
     LatLon jl2 = list.get((j == list.size() - 1) ? 0 : j + 1); 
     Point2D pt = new Point2D(jl.longitude.degrees, jl.latitude.degrees); 
     Point2D pt2 = new Point2D(jl2.longitude.degrees, jl2.latitude.degrees); 

     List<LatLon> corners = p1.getCorners(); 

     boolean bothPointsInSameSegment = false; 

     //for each latlon k selectedShape cast k and k+1 as 2lineseg 
     for (int k = 0; k < corners.size(); k++) { 
      LatLon kl = corners.get(k); 
      LatLon kl2 = corners.get((k == corners.size() - 1) ? 0 : k + 1); 

      LineSegment2D segment = new LineSegment2D(kl.longitude.degrees, kl.latitude.degrees, kl2.longitude.degrees, kl2.latitude.degrees); 

      boolean segContainsP1 = segment.contains(pt); 
      boolean segContainsP2 = segment.contains(pt2); 

      System.out.println("selectedShape: segment "+k+" contains p"+j+":("+segContainsP1+") and p"+(j+1)+":("+segContainsP2+")"); 

      //check if each line contains the points. 
      if (segContainsP1 && segContainsP2) 
      { 
       bothPointsInSameSegment = true; 
      } 

     } 

     corners = p2.getCorners(); 
     //for each latlon k tempShape cast k and k+1 as 2lineseg 
     for (int k = 0; k < corners.size(); k++) { 
      LatLon kl = corners.get(k); 
      LatLon kl2 = corners.get((k == corners.size() - 1) ? 0 : k + 1); 

      LineSegment2D segment = new LineSegment2D(kl.longitude.degrees, kl.latitude.degrees, kl2.longitude.degrees, kl2.latitude.degrees); 


      boolean segContainsP1 = segment.contains(pt); 
      boolean segContainsP2 = segment.contains(pt2); 

      System.out.println("intersectingShape: segment "+k+" contains p"+j+":("+segContainsP1+") and p"+(j+1)+":("+segContainsP2+")"); 

      //check if each line contains the points. 
      if (segContainsP1 && segContainsP2) 
      { 
       bothPointsInSameSegment = true; 
      } 

     } 

     if (!bothPointsInSameSegment) allPointsInSamePolygon = false; 

    } 

    //if both points are not in the same line, then theres a conflict 
    return allPointsInSamePolygon; 
} 
1

Вы можете использовать JTS.

  1. Создайте многоугольники с помощью LinearRing
  2. Используйте метод intersection

Простой пример кода:

// build polygon p1 
LinearRing p1 = new GeometryFactory().createLinearRing(new Coordinate[]{new Coordinate(0,0), new Coordinate(0,10), new Coordinate(10,10), new Coordinate(10,0), new Coordinate(0,0)}); 
// build polygon p2 
LinearRing p2 = new GeometryFactory().createLinearRing(new Coordinate[]{new Coordinate(5,5), new Coordinate(15,5), new Coordinate(15,15), new Coordinate(5,15), new Coordinate(5,5)}); 
// calculate intersecting points 
Geometry intersectingPoints = p1.intersection(p2); 
// print result 
for(Coordinate c : intersectingPoints.getCoordinates()){ 
    System.out.println(c.toString()); 
} 

Выход (как и ожидалось):

(5.0, 10.0, NaN) 
(10.0, 5.0, NaN) 
Смежные вопросы