//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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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());
        }