예제 #1
0
        public Feature CreateZustandsabschnittFeature(ZustandsabschnittGIS zustandsabschnitt, Guid inspektionsrouteid)
        {
            Feature          zaFeature    = new Feature();
            IAttributesTable zaAttributes = new AttributesTable();

            zaFeature.Geometry = zustandsabschnitt.Shape;
            //ID
            zaAttributes.AddAttribute(checkStringLengthforDBF(CheckOutGISDefaults.ZustandsabschnittID), zustandsabschnitt.Id.ToString());
            //StrassenabschnittID
            zaAttributes.AddAttribute(checkStringLengthforDBF(CheckOutGISDefaults.StrassenabschnittGISID), zustandsabschnitt.StrassenabschnittGIS.Id.ToString());
            //inspektionsRouteID
            zaAttributes.AddAttribute(checkStringLengthforDBF(CheckOutGISDefaults.InspektionsRouteID), inspektionsrouteid.ToString());
            //Zustandsindex
            //zaAttributes.AddAttribute(CheckOutGISDefaults.ZustandsIndex, zustandsabschnitt.Zustandsindex.ToString().Replace('.', ','));
            if (zustandsabschnitt.Zustandsindex != null)
            {
                zaAttributes.AddAttribute(CheckOutGISDefaults.ZustandsIndex, double.Parse(zustandsabschnitt.Zustandsindex.ToString()));
            }
            else
            {
                zaAttributes.AddAttribute(CheckOutGISDefaults.ZustandsIndex, double.Parse("-1"));
            }

            zaFeature.Attributes = zaAttributes;
            return(zaFeature);
        }
예제 #2
0
        private void DeleteAchsenReferenz(AchsenReferenz referenz)
        {
            ISession session = transactionScopeProvider.CurrentTransactionScope.Session;

            referenz.ReferenzGruppe.AchsenReferenzen.Remove(referenz);
            referenz.AchsenSegment.AchsenReferenzen.Remove(referenz);
            session.Delete(referenz);
            IAbschnittGISBase abschnitt = this.GetAbschnittGISBase(referenz);

            if (abschnitt == null)
            {
                Loggers.ApplicationLogger.Warn(String.Format("No Abschnitt found for Referenzgruppe id: {0}", referenz.ReferenzGruppe.Id.ToString()));
            }
            else
            {
                if (referenz.ReferenzGruppe.AchsenReferenzen.Count < 1)
                {
                    session.Delete(referenz.ReferenzGruppe);
                    ZustandsabschnittGIS zab = abschnitt as ZustandsabschnittGIS;
                    if (zab != null)
                    {
                        zab.StrassenabschnittGIS.Zustandsabschnitten.Remove(zab);
                    }

                    session.Delete(abschnitt);
                }
                else
                {
                    this.UpdateAbschnitt(abschnitt);
                }
            }
        }
예제 #3
0
        private IAttributesTable writeBaseTroittoir(IAttributesTable attributes, ZustandsabschnittGIS zab)
        {
            attributes.AddAttribute(TrottoirShapeFileConstants.StrassenabschnittID, this.guidToOracleRaw(zab.StrassenabschnittGIS.Id));
            attributes.AddAttribute(TrottoirShapeFileConstants.Strassenname, zab.StrassenabschnittGIS.Strassenname);
            attributes.AddAttribute(TrottoirShapeFileConstants.StrassenabschnittBezeichnungvon, zab.StrassenabschnittGIS.BezeichnungVon != null ? zab.StrassenabschnittGIS.BezeichnungVon : string.Empty);
            attributes.AddAttribute(TrottoirShapeFileConstants.StrassenabschnittBezeichnungbis, zab.StrassenabschnittGIS.BezeichnungBis != null ? zab.StrassenabschnittGIS.BezeichnungBis : string.Empty);
            attributes.AddAttribute(TrottoirShapeFileConstants.Eigentuemer, StrabShapeFileConstants.getOwner(zab.StrassenabschnittGIS.Strasseneigentuemer));
            attributes.AddAttribute(TrottoirShapeFileConstants.Ortsbezeichnung, zab.StrassenabschnittGIS.Ortsbezeichnung != null ? zab.StrassenabschnittGIS.Ortsbezeichnung : string.Empty);

            attributes.AddAttribute(TrottoirShapeFileConstants.ID, this.guidToOracleRaw(Guid.NewGuid()));
            attributes.AddAttribute(TrottoirShapeFileConstants.ZustandsAbschnittID, this.guidToOracleRaw(zab.Id));
            attributes.AddAttribute(TrottoirShapeFileConstants.Bezeichnungvon, zab.BezeichnungVon != null ? zab.BezeichnungVon : string.Empty);
            attributes.AddAttribute(TrottoirShapeFileConstants.Bezeichnungbis, zab.BezeichnungBis != null ? zab.BezeichnungBis : string.Empty);
            attributes.AddAttribute(TrottoirShapeFileConstants.Laenge, (double)zab.Laenge);
            attributes.AddAttribute(TrottoirShapeFileConstants.Aufnahmedatum, zab.Aufnahmedatum);
            attributes.AddAttribute(TrottoirShapeFileConstants.Aufnahmeteam, zab.Aufnahmeteam != null ? zab.Aufnahmeteam : string.Empty);
            return(attributes);
        }
예제 #4
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());
        }
예제 #5
0
        public static IList <StrassenabschnittGIS> GenerateStrassenabschnittGIS(ISession session, ErfassungsPeriod currentPeriod, IList <AchsenSegment> achsensegmente)
        {
            var    belastungskategories = session.Query <Belastungskategorie>().ToList();
            var    Massnahmen           = session.Query <MassnahmenvorschlagKatalog>().Where(mvk => mvk.ErfassungsPeriod.Id == currentPeriod.Id).ToList();
            Random rnd = new Random();

            int achsensegmente_count     = achsensegmente.Count;
            var generator                = new RandomGenerator();
            var strassenabschnittBuilder = Builder <StrassenabschnittGIS> .CreateListOfSize(achsensegmente_count)
                                           .All()
                                           .With(s => s.Belastungskategorie = Pick <Belastungskategorie> .RandomItemFrom(belastungskategories))
                                           .With(s => s.Mandant             = currentPeriod.Mandant)
                                           .With(s => s.ErfassungsPeriod    = currentPeriod)
                                           .With(s => s.Strassenname        = generator.Phrase(20))
                                           .With(s => s.IsLocked            = false)
                                           .With(s => s.Trottoir            = Pick <TrottoirTyp> .RandomItemFrom(Enum.GetValues(typeof(TrottoirTyp)).Cast <TrottoirTyp>().ToList()));

            var strassenabschnitte = strassenabschnittBuilder.Build();
            var pageSize           = 1;
            var index = 0;

            foreach (var strassenabschnitt in strassenabschnitte)
            {
                strassenabschnitt.Shape = achsensegmente[index].Shape;
                IGeometry shape = strassenabschnitt.Shape;
                foreach (Coordinate coord in shape.Coordinates)
                {
                    coord.Z = double.NaN;
                }

                switch (strassenabschnitt.Trottoir)
                {
                case TrottoirTyp.Links:
                    strassenabschnitt.BreiteTrottoirLinks = (decimal)rnd.NextDouble() + 1;
                    break;

                case TrottoirTyp.Rechts:
                    strassenabschnitt.BreiteTrottoirRechts = (decimal)rnd.NextDouble() + 1;
                    break;

                case TrottoirTyp.BeideSeiten:
                    strassenabschnitt.BreiteTrottoirLinks  = (decimal)rnd.NextDouble() + 1;
                    strassenabschnitt.BreiteTrottoirRechts = (decimal)rnd.NextDouble() + 1;
                    break;

                case TrottoirTyp.NochNichtErfasst:
                case TrottoirTyp.KeinTrottoir:
                default:
                    break;
                }

                LengthIndexedLine indexedLine = new LengthIndexedLine(shape);
                strassenabschnitt.Laenge         = Convert.ToDecimal(Math.Round(indexedLine.EndIndex, 1));
                strassenabschnitt.ReferenzGruppe = new ReferenzGruppe();
                strassenabschnitt.ReferenzGruppe.StrassenabschnittGISList.Add(strassenabschnitt);

                AchsenReferenz achsenreferenz = new AchsenReferenz();
                achsenreferenz.ReferenzGruppe = strassenabschnitt.ReferenzGruppe;
                achsenreferenz.AchsenSegment  = achsensegmente[index];
                achsenreferenz.Shape          = achsensegmente[index].Shape;
                achsenreferenz.ReferenzGruppe = strassenabschnitt.ReferenzGruppe;
                strassenabschnitt.ReferenzGruppe.AddAchsenReferenz(achsenreferenz);



                double linelength = indexedLine.EndIndex;
                for (int i = 0; i < pageSize; i++)
                {
                    ZustandsabschnittGIS zustandsabschnitt = new ZustandsabschnittGIS();
                    zustandsabschnitt.StrassenabschnittGIS = strassenabschnitt;
                    zustandsabschnitt.ReferenzGruppe       = new ReferenzGruppe();
                    zustandsabschnitt.ReferenzGruppe.ZustandsabschnittGISList.Add(zustandsabschnitt);
                    AchsenReferenz achsenreferenzzustandsabschnitt = new AchsenReferenz();
                    achsenreferenzzustandsabschnitt.ReferenzGruppe = zustandsabschnitt.ReferenzGruppe;
                    achsenreferenzzustandsabschnitt.AchsenSegment  = achsensegmente[index];
                    IGeometry subline = indexedLine.ExtractLine(linelength / pageSize * i, linelength / pageSize * (i + 1));
                    achsenreferenzzustandsabschnitt.Shape = subline;
                    zustandsabschnitt.Shape         = subline;
                    zustandsabschnitt.Laenge        = decimal.Parse(new LengthIndexedLine(subline).EndIndex.ToString());
                    zustandsabschnitt.Zustandsindex = Pick <decimal> .RandomItemFrom(new List <decimal> {
                        0, 1, 2, 3, 4, 5
                    });

                    zustandsabschnitt.Erfassungsmodus = ZustandsErfassungsmodus.Manuel;
                    achsenreferenzzustandsabschnitt.ReferenzGruppe = zustandsabschnitt.ReferenzGruppe;
                    zustandsabschnitt.ReferenzGruppe.AddAchsenReferenz(achsenreferenzzustandsabschnitt);
                    zustandsabschnitt.Aufnahmedatum  = DateTime.Now.Date;
                    zustandsabschnitt.Aufnahmeteam   = generator.Phrase(20);
                    zustandsabschnitt.Bemerkung      = generator.Phrase(40);
                    zustandsabschnitt.BezeichnungVon = strassenabschnitt.BezeichnungVon + generator.Phrase(10);
                    zustandsabschnitt.BezeichnungBis = strassenabschnitt.BezeichnungBis + generator.Phrase(10);
                    strassenabschnitt.Zustandsabschnitten.Add(zustandsabschnitt);
                    zustandsabschnitt.MassnahmenvorschlagFahrbahn = Pick <MassnahmenvorschlagKatalog> .RandomItemFrom(Massnahmen.Where(mvk => mvk.KatalogTyp == MassnahmenvorschlagKatalogTyp.Fahrbahn && mvk.Belastungskategorie.Id == strassenabschnitt.Belastungskategorie.Id).ToList());

                    zustandsabschnitt.DringlichkeitFahrbahn = Pick <DringlichkeitTyp> .RandomItemFrom(Enum.GetValues(typeof(DringlichkeitTyp)).Cast <DringlichkeitTyp>().ToList());

                    switch (strassenabschnitt.Trottoir)
                    {
                    case TrottoirTyp.Links:
                        zustandsabschnitt.MassnahmenvorschlagTrottoirLinks = Pick <MassnahmenvorschlagKatalog> .RandomItemFrom(Massnahmen.Where(mvk => mvk.KatalogTyp == MassnahmenvorschlagKatalogTyp.Trottoir && mvk.Belastungskategorie.Id == strassenabschnitt.Belastungskategorie.Id).ToList());

                        zustandsabschnitt.ZustandsindexTrottoirLinks = Pick <ZustandsindexTyp> .RandomItemFrom(Enum.GetValues(typeof(ZustandsindexTyp)).Cast <ZustandsindexTyp>().ToList());

                        zustandsabschnitt.DringlichkeitTrottoirLinks = Pick <DringlichkeitTyp> .RandomItemFrom(Enum.GetValues(typeof(DringlichkeitTyp)).Cast <DringlichkeitTyp>().ToList());

                        break;

                    case TrottoirTyp.Rechts:
                        zustandsabschnitt.MassnahmenvorschlagTrottoirRechts = Pick <MassnahmenvorschlagKatalog> .RandomItemFrom(Massnahmen.Where(mvk => mvk.KatalogTyp == MassnahmenvorschlagKatalogTyp.Trottoir && mvk.Belastungskategorie.Id == strassenabschnitt.Belastungskategorie.Id).ToList());

                        zustandsabschnitt.ZustandsindexTrottoirRechts = Pick <ZustandsindexTyp> .RandomItemFrom(Enum.GetValues(typeof(ZustandsindexTyp)).Cast <ZustandsindexTyp>().ToList());

                        zustandsabschnitt.DringlichkeitTrottoirRechts = Pick <DringlichkeitTyp> .RandomItemFrom(Enum.GetValues(typeof(DringlichkeitTyp)).Cast <DringlichkeitTyp>().ToList());

                        break;

                    case TrottoirTyp.BeideSeiten:
                        zustandsabschnitt.MassnahmenvorschlagTrottoirLinks = Pick <MassnahmenvorschlagKatalog> .RandomItemFrom(Massnahmen.Where(mvk => mvk.KatalogTyp == MassnahmenvorschlagKatalogTyp.Trottoir && mvk.Belastungskategorie.Id == strassenabschnitt.Belastungskategorie.Id).ToList());

                        zustandsabschnitt.MassnahmenvorschlagTrottoirRechts = Pick <MassnahmenvorschlagKatalog> .RandomItemFrom(Massnahmen.Where(mvk => mvk.KatalogTyp == MassnahmenvorschlagKatalogTyp.Trottoir && mvk.Belastungskategorie.Id == strassenabschnitt.Belastungskategorie.Id).ToList());

                        zustandsabschnitt.ZustandsindexTrottoirLinks = Pick <ZustandsindexTyp> .RandomItemFrom(Enum.GetValues(typeof(ZustandsindexTyp)).Cast <ZustandsindexTyp>().ToList());

                        zustandsabschnitt.ZustandsindexTrottoirRechts = Pick <ZustandsindexTyp> .RandomItemFrom(Enum.GetValues(typeof(ZustandsindexTyp)).Cast <ZustandsindexTyp>().ToList());

                        zustandsabschnitt.DringlichkeitTrottoirLinks = Pick <DringlichkeitTyp> .RandomItemFrom(Enum.GetValues(typeof(DringlichkeitTyp)).Cast <DringlichkeitTyp>().ToList());

                        zustandsabschnitt.DringlichkeitTrottoirRechts = Pick <DringlichkeitTyp> .RandomItemFrom(Enum.GetValues(typeof(DringlichkeitTyp)).Cast <DringlichkeitTyp>().ToList());

                        break;

                    case TrottoirTyp.NochNichtErfasst:
                    case TrottoirTyp.KeinTrottoir:
                    default:
                        break;
                    }
                    session.Save(zustandsabschnitt);
                }
                session.Save(strassenabschnitt);
                index++;
            }
            var test = strassenabschnitte.Where(s => s.IsLocked == true);

            return(strassenabschnitte);
        }