//check for overlaps with other strabs or zabs on the same achssegment returns false if overlaps public bool ValidateOverlap(IAbschnittGISModelBase abschnitt) { IList <AchsenReferenzModel> neue_achsenreferenzen = abschnitt.ReferenzGruppeModel.AchsenReferenzenModel; foreach (var neue_achsenreferenz in neue_achsenreferenzen) { Guid achsensegmentID = neue_achsenreferenz.AchsenSegmentModel.Id; IList <AchsenReferenz> alteAchsenreferenzen = achsenReferenzService.GetCurrentEntities() .Where(r => r.AchsenSegment.Id == achsensegmentID).ToList(); if (abschnitt.GetType() == typeof(ZustandsabschnittGISModel)) { alteAchsenreferenzen = alteAchsenreferenzen.Where(r => r.ReferenzGruppe.ZustandsabschnittGIS != null && r.ReferenzGruppe.ZustandsabschnittGIS.ErfassungsPeriod.IsClosed == false && r.ReferenzGruppe.ZustandsabschnittGIS.Id != abschnitt.Id).ToList(); } if (abschnitt.GetType() == typeof(StrassenabschnittGISModel)) { alteAchsenreferenzen = alteAchsenreferenzen.Where(r => r.ReferenzGruppe.StrassenabschnittGIS != null && r.ReferenzGruppe.StrassenabschnittGIS.ErfassungsPeriod.IsClosed == false && r.ReferenzGruppe.StrassenabschnittGIS.Id != abschnitt.Id).ToList(); } if (!gisService.CheckOverlapp(alteAchsenreferenzen.ToList(), neue_achsenreferenz.Shape)) { return(false); } } return(true); }
private bool CheckOverlap(ZustandsabschnittGISDTO zustandsabschnittGISDTO, IList <Guid> deletedZustandsabschnitte, IList <ZustandsabschnittGISDTO> zustandsabschnitteToValidate) { //check for overlaps with other strabs on the same achssegment IList <AchsenReferenzDTO> neue_achsenreferenzen = zustandsabschnittGISDTO.ReferenzGruppeDTO.AchsenReferenzenDTO; //var test2 = GeoJSONReader.ReadFeatureWithID(new StringReader(geojsonstring)).Attributes; //Guid strabsid = zustandsabschnittGISDTO.StrassenabschnittGIS; //StrassenabschnittGIS strab = GetEntityById<StrassenabschnittGIS>(zustandsabschnittGISDTO.StrassenabschnittGIS); var other_Zustandsabschnitte = zustandsabschnitteToValidate.Where(za => za.Id != zustandsabschnittGISDTO.Id); var other_ZustandsabschnitteIDs = other_Zustandsabschnitte.Select(za => za.Id); var other_AchsenreferenzenDTOs = other_Zustandsabschnitte.Select(za => za.ReferenzGruppeDTO.AchsenReferenzenDTO).SelectMany(ar => ar); var other_Achsenreferenzen = new List <AchsenReferenz>(); foreach (var dto in other_AchsenreferenzenDTOs) { other_Achsenreferenzen.Add(dataTransferObjectServiceMappingEngine.Translate <AchsenReferenzDTO, AchsenReferenz>(dto)); } foreach (var neue_achsenreferenz in neue_achsenreferenzen) { Guid achsensegmentID = neue_achsenreferenz.AchsenSegment; var alte_achsenreferenzen = achsenReferenzService.GetCurrentEntities() .Where(r => r.AchsenSegment.Id == achsensegmentID).ToList(); alte_achsenreferenzen = alte_achsenreferenzen.Where(r => r.ReferenzGruppe.ZustandsabschnittGIS != null && r.ReferenzGruppe.ZustandsabschnittGIS.ErfassungsPeriod.IsClosed == false //prevent selfcheck && r.ReferenzGruppe.ZustandsabschnittGIS.Id != zustandsabschnittGISDTO.Id //prevent check with zustandsabschnitte that are going to be deleted && !deletedZustandsabschnitte.Contains(r.ReferenzGruppe.ZustandsabschnittGIS.Id) //dont check the old geometries (they are replaced by the Geometries in zustandsabschnittetovalidate) && !other_ZustandsabschnitteIDs.Contains(r.ReferenzGruppe.ZustandsabschnittGIS.Id) ).ToList(); var allOther_achsenreferenzen = alte_achsenreferenzen.Concat(other_Achsenreferenzen.Where(ar => ar.AchsenSegment.Id == neue_achsenreferenz.AchsenSegment)); if (!gisService.CheckOverlapp(allOther_achsenreferenzen.ToList(), neue_achsenreferenz.Shape)) { return(false); } } return(true); }
private IList <Guid> UpdateAchsenReferenzen(AchsenSegment currententity, IGeometry shape, bool persistChanges, AchseModificationAction modificationAction = AchseModificationAction.Change) { Dictionary <AchsenReferenz, GeometryTransformerResult> ret = new Dictionary <AchsenReferenz, GeometryTransformerResult>(); foreach (AchsenReferenz referenz in currententity.AchsenReferenzen.ToList()) { ILineString oldRefGeometry = (ILineString)referenz.Shape; ILineString newSegmentGeometry = (ILineString)shape; GeometryTransformer gt = new GeometryTransformer(oldRefGeometry, newSegmentGeometry); GeometryTransformerResult result = gt.Transform(); if (result.ResultState != GeometryTransformerResultState.Success || !result.NewRefGeometry.EqualsExact(oldRefGeometry)) { ret.Add(referenz, result); } } //check if strabs are overlapping other strabs foreach (var pair in ret.Where(p => p.Key.ReferenzGruppe.StrassenabschnittGIS != null && p.Value.ResultState == GeometryTransformerResultState.Success).ToList()) { IEnumerable <AchsenReferenz> strabsar = pair.Key.AchsenSegment.AchsenReferenzen.Where(ar => ar.Id != pair.Key.Id && ar.ReferenzGruppe.StrassenabschnittGIS != null); foreach (AchsenReferenz strabref in strabsar) { IGeometry currentstrabref = strabref.Shape; bool exists = true; KeyValuePair <AchsenReferenz, GeometryTransformerResult> newZabref = ret.Where(p => p.Key.Id.Equals(strabref.Id)).SingleOrDefault(); if (!newZabref.Equals(default(KeyValuePair <AchsenReferenz, GeometryTransformerResult>))) { currentstrabref = newZabref.Value.NewRefGeometry; exists = newZabref.Value.ResultState == GeometryTransformerResultState.Success; } if (exists) { if (!gisService.CheckOverlapp(new List <IGeometry>() { currentstrabref }, pair.Value.NewRefGeometry)) { ret[pair.Key] = new GeometryTransformerResult(GeometryTransformerResultState.FailedWouldBeOutside, pair.Value.NewRefGeometry); } } } } //check if zabs still within strabs and update results if not, ensure zabs are not overlapping others foreach (var pair in ret.Where(p => p.Key.ReferenzGruppe.ZustandsabschnittGIS != null && p.Value.ResultState == GeometryTransformerResultState.Success).ToList()) { ZustandsabschnittGIS zab = pair.Key.ReferenzGruppe.ZustandsabschnittGIS; if (zab != null && pair.Value.ResultState == GeometryTransformerResultState.Success) { IEnumerable <AchsenReferenz> strabrefs = ret.Where(p => p.Key.ReferenzGruppe.StrassenabschnittGIS != null && p.Key.ReferenzGruppe.StrassenabschnittGIS.Id == zab.StrassenabschnittGIS.Id && p.Value.ResultState == GeometryTransformerResultState.Success).Select(p => p.Key).ToList(); IList <IGeometry> zabrefs = new List <IGeometry>() { pair.Value.NewRefGeometry }; foreach (AchsenReferenz achsref in strabrefs) { bool isWithin = false; if (ret[achsref].ResultState == GeometryTransformerResultState.Success) { isWithin = isWithin || gisService.CheckGeometriesIsInControlGeometry(zabrefs, ret[achsref].NewRefGeometry); } if (!isWithin) { ret[pair.Key] = new GeometryTransformerResult(GeometryTransformerResultState.FailedWouldBeOutside, pair.Value.NewRefGeometry); } } IEnumerable <AchsenReferenz> allzabrefs = zab.StrassenabschnittGIS.Zustandsabschnitten.SelectMany(z => z.ReferenzGruppe.AchsenReferenzen).Where(ar => !ar.Id.Equals(pair.Key.Id)); foreach (AchsenReferenz zabref in allzabrefs) { IGeometry currentzabref = zabref.Shape; bool exists = true; KeyValuePair <AchsenReferenz, GeometryTransformerResult> newZabref = ret.Where(p => p.Key.Id.Equals(zabref.Id)).SingleOrDefault(); if (!newZabref.Equals(default(KeyValuePair <AchsenReferenz, GeometryTransformerResult>))) { currentzabref = newZabref.Value.NewRefGeometry; exists = newZabref.Value.ResultState == GeometryTransformerResultState.Success; } if (exists) { if (!gisService.CheckOverlapp(new List <IGeometry>() { currentzabref }, pair.Value.NewRefGeometry)) { ret[pair.Key] = new GeometryTransformerResult(GeometryTransformerResultState.FailedWouldBeOutside, pair.Value.NewRefGeometry); } } } } } if (persistChanges) { foreach (var pair in ret) { this.UpdateAchsenReferenz(pair.Key, pair.Value, modificationAction == AchseModificationAction.Delete); } } return(ret.Keys.Select(k => k.Id).ToList()); }