diff --git a/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/geometry/Geometries.java b/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/geometry/Geometries.java index 7f4465e72d..d24d8b269f 100644 --- a/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/geometry/Geometries.java +++ b/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/geometry/Geometries.java @@ -235,7 +235,7 @@ private static SegmentPosition getSegmentPosition( // Avoid worst case distance == 0 if (distance.equals(BigDecimal.ZERO)) { return new SegmentPosition(segments.getFirst().segment, - segments.getFirst().startDistance); + BigDecimal.ZERO); } // Avoid worst case distance == segment length @@ -248,7 +248,7 @@ private static SegmentPosition getSegmentPosition( RoundingMode.HALF_UP); if (diff.compareTo(BigDecimal.ZERO) == 0) { return new SegmentPosition(segments.getLast().segment, - segments.getLast().startDistance); + distance.subtract(segments.getLast().startDistance)); } return null; } diff --git a/java/bundles/org.eclipse.set.feature.plazmodel/src/org/eclipse/set/feature/plazmodel/check/GeoCoordinateValid.java b/java/bundles/org.eclipse.set.feature.plazmodel/src/org/eclipse/set/feature/plazmodel/check/GeoCoordinateValid.java index 55b07405e6..f3d7f9cced 100644 --- a/java/bundles/org.eclipse.set.feature.plazmodel/src/org/eclipse/set/feature/plazmodel/check/GeoCoordinateValid.java +++ b/java/bundles/org.eclipse.set.feature.plazmodel/src/org/eclipse/set/feature/plazmodel/check/GeoCoordinateValid.java @@ -27,6 +27,9 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.text.StringSubstitutor; import org.eclipse.emf.ecore.EObject; @@ -151,10 +154,13 @@ public GEO_Kante getGeoKante() { private List alreadyFoundMetaData; + private List topKanteWithInvalidCRS; + @Activate void active() { topologicalCoordinates = Optional.empty(); alreadyFoundMetaData = new ArrayList<>(); + topKanteWithInvalidCRS = new ArrayList<>(); } @Override @@ -162,7 +168,7 @@ public void handleEvent(final Event event) { if (event.getTopic().equals(Events.CLOSE_SESSION)) { alreadyFoundMetaData.clear(); topologicalCoordinates = Optional.empty(); - return; + topKanteWithInvalidCRS.clear(); } } @@ -170,7 +176,12 @@ public void handleEvent(final Event event) { protected List run( final MultiContainer_AttributeGroup container) { final List result = new ArrayList<>(); - getRelevantPOs(container) + getTopKanteWithDifferentCRS(container); + getRelevantPOs(container).stream() + .filter(po -> PunktObjektExtensions.getTopKanten(po) + .stream() + .noneMatch(topKante -> topKanteWithInvalidCRS.stream() + .anyMatch(t -> t.equals(topKante)))) .forEach(po -> po.getPunktObjektTOPKante().forEach(potk -> { if (isNotDistinctCoordinateSystem(potk)) { result.add(createGeoCoordinateError(po, @@ -201,6 +212,33 @@ protected List run( return result; } + private void getTopKanteWithDifferentCRS( + final MultiContainer_AttributeGroup container) { + Streams.stream(container.getTOPKante()).forEach(topKante -> { + final Set topKanteCrs = TopKanteExtensions + .getGeoKanten(topKante) + .stream() + .flatMap(geoKante -> Stream.of( + GeoKanteExtensions.getGeoKnotenA(geoKante), + GeoKanteExtensions.getGeoKnotenB(geoKante))) + .flatMap(geoKnoten -> Streams.stream( + GeoKnotenExtensions.getGeoPunkte(geoKnoten))) + .map(geoPunkt -> EObjectExtensions + .getNullableObject(geoPunkt, + g -> g.getGEOPunktAllg() + .getGEOKoordinatensystem() + .getWert()) + .orElse(null)) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + if (topKanteCrs.size() > 1 || topKanteCrs.stream() + .anyMatch( + crs -> crs == ENUMGEOKoordinatensystem.ENUMGEO_KOORDINATENSYSTEM_SONSTIGE)) { + topKanteWithInvalidCRS.add(topKante); + } + }); + } + private PlazError validGeoCoordinate(final Punkt_Objekt po, final Punkt_Objekt_TOP_Kante_AttributeGroup potk, final GEOKanteCoordinate topCoordinate) {