Exemplo n.º 1
0
        public AllowedError CreateAllowedError(
            [NotNull] IssueDatasetWriter issueWriter,
            [NotNull] IRow errorRow)
        {
            Assert.ArgumentNotNull(issueWriter, nameof(issueWriter));
            Assert.ArgumentNotNull(errorRow, nameof(errorRow));

            int?qualityConditionId = issueWriter.Get <int>(
                errorRow, AttributeRole.ErrorConditionId);

            if (qualityConditionId == null)
            {
                _msg.WarnFormat(
                    "Error object <oid> {0} in {1} has no quality condition id",
                    errorRow.OID, issueWriter.DatasetName);
                return(null);
            }

            QualityCondition qualityCondition;

            if (!_qualityConditionsById.TryGetValue((int)qualityConditionId,
                                                    out qualityCondition))
            {
                return(null);
            }

            IGeometry geometry     = null;
            var       errorFeature = errorRow as IFeature;

            if (errorFeature != null)
            {
                geometry = errorFeature.Shape.Envelope;
                geometry.SnapToSpatialReference();
            }

            string involvedObjectsString = issueWriter.GetString(
                errorRow, AttributeRole.ErrorObjects);

            IList <InvolvedRow> involvedRows = RowParser.Parse(involvedObjectsString);

            string description =
                issueWriter.GetString(errorRow, AttributeRole.ErrorDescription);

            // explicit storage of ConditionVersion for later comparison (context change determination)
            // because condition.Version is read-only (VersionedEntity)
            int?conditionVersion = null;

            if (issueWriter.HasAttribute(AttributeRole.ErrorQualityConditionVersion))
            {
                conditionVersion =
                    issueWriter.Get <int>(errorRow,
                                          AttributeRole.ErrorQualityConditionVersion);
            }

            // Date of creation attribute is expected
            DateTime?dateOfCreation = issueWriter.Get <DateTime>(
                errorRow, AttributeRole.DateOfCreation);

            if (dateOfCreation == null)
            {
                _msg.WarnFormat(
                    "Date of creation field is null for allowed error row <oid> {0} in {1}. It will be disregarded.",
                    errorRow.OID, issueWriter.DatasetName);
                return(null);
            }

            return(new AllowedError(qualityCondition, conditionVersion, geometry, description,
                                    involvedRows, issueWriter.Table, errorRow.OID,
                                    (DateTime)dateOfCreation, _datasetResolver));
        }
Exemplo n.º 2
0
        public static IEnumerable <AllowedError> GetAllowedErrors(
            [NotNull] IssueDatasetWriter issueWriter,
            [CanBeNull] IGeometry areaOfInterest,
            [NotNull] ISpatialFilter spatialFilter,
            [NotNull] AllowedErrorFactory allowedErrorFactory)
        {
            Assert.ArgumentNotNull(issueWriter, nameof(issueWriter));
            Assert.ArgumentNotNull(spatialFilter, nameof(spatialFilter));
            Assert.ArgumentNotNull(allowedErrorFactory, nameof(allowedErrorFactory));

            Stopwatch watch = _msg.DebugStartTiming();

            ITable       errorTable = issueWriter.Table;
            IQueryFilter filter;

            var errorFeatureClass = errorTable as IFeatureClass;

            if (errorFeatureClass != null)
            {
                if (areaOfInterest != null)
                {
                    spatialFilter.Geometry      = areaOfInterest;
                    spatialFilter.GeometryField = errorFeatureClass.ShapeFieldName;
                    spatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelIntersects;
                }

                filter = spatialFilter;
            }
            else
            {
                filter = new QueryFilterClass
                {
                    WhereClause = spatialFilter.WhereClause,
                    SubFields   = spatialFilter.SubFields
                };
            }

            var addedAllowedErrorsCount = 0;
            var readRowCount            = 0;

            const bool recycling = true;

            foreach (IRow row in GdbQueryUtils.GetRows(errorTable, filter, recycling))
            {
                readRowCount++;
                AllowedError allowedError =
                    allowedErrorFactory.CreateAllowedError(issueWriter, row);

                if (allowedError == null)
                {
                    continue;
                }

                addedAllowedErrorsCount++;

                yield return(allowedError);
            }

            _msg.DebugStopTiming(watch,
                                 "Collected {0} allowed error(s) based on {1} row(s) read from {2}",
                                 addedAllowedErrorsCount, readRowCount,
                                 issueWriter.DatasetName);
        }