Пример #1
0
        public void CanCreateFeatureWithoutTableSchema()
        {
            ISpatialReference sr =
                SpatialReferenceUtils.CreateSpatialReference(WellKnownHorizontalCS.LV95);

            IPolygon shape = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600000, 1200000, sr),
                GeometryFactory.CreatePoint(2600050, 1200080, sr));

            GdbObjectMsg featureMsg = new GdbObjectMsg
            {
                ClassHandle = -1,
                ObjectId    = 42,
                Shape       = ProtobufGeometryUtils.ToShapeMsg(shape)
            };

            GdbFeatureClass fClass =
                new GdbFeatureClass(1, "Test", esriGeometryType.esriGeometryPolygon);

            GdbRow gdbRow = ProtobufConversionUtils.FromGdbObjectMsg(featureMsg, fClass);

            GdbFeature feature = (GdbFeature)gdbRow;

            Assert.AreEqual(42, feature.OID);
            Assert.True(GeometryUtils.AreEqual(shape, feature.Shape));
            Assert.AreEqual(1, feature.Class.ObjectClassID);
        }
Пример #2
0
        public static GdbRow FromGdbObjectMsg(
            [NotNull] GdbObjectMsg gdbObjectMsg,
            [NotNull] ITable table)
        {
            GdbRow result;

            if (table is IFeatureClass featureClass)
            {
                result = CreateGdbFeature(gdbObjectMsg, featureClass);
            }
            else
            {
                result = new GdbRow(gdbObjectMsg.ObjectId, (IObjectClass)table);
            }

            ReadMsgValues(gdbObjectMsg, result, table);

            return(result);
        }
Пример #3
0
        public void CanCreateGdbRowFromRealData()
        {
            IWorkspace ws = TestUtils.OpenUserWorkspaceOracle();

            const string tlmStrasse = "TOPGIS_TLM.TLM_STRASSE";

            IFeatureClass realFeatureClass = DatasetUtils.OpenFeatureClass(ws, tlmStrasse);

            var objectClassMsg = ProtobufGdbUtils.ToObjectClassMsg(realFeatureClass, true);

            GdbTableContainer gdbTableContainer =
                ProtobufConversionUtils.CreateGdbTableContainer(
                    new[] { objectClassMsg }, null, out GdbWorkspace _);

            var virtualFeatureClass = (IFeatureClass)gdbTableContainer.OpenTable(tlmStrasse);

            Assert.AreEqual(realFeatureClass.ObjectClassID, virtualFeatureClass.ObjectClassID);
            Assert.AreEqual(DatasetUtils.GetName(realFeatureClass),
                            DatasetUtils.GetName(virtualFeatureClass));
            Assert.AreEqual(realFeatureClass.AliasName, virtualFeatureClass.AliasName);
            Assert.AreEqual(realFeatureClass.ShapeFieldName, virtualFeatureClass.ShapeFieldName);
            Assert.AreEqual(realFeatureClass.OIDFieldName, virtualFeatureClass.OIDFieldName);
            Assert.AreEqual(realFeatureClass.FeatureClassID, virtualFeatureClass.FeatureClassID);
            Assert.AreEqual(realFeatureClass.FeatureType, virtualFeatureClass.FeatureType);
            Assert.AreEqual(realFeatureClass.HasOID, virtualFeatureClass.HasOID);
            Assert.AreEqual(realFeatureClass.ShapeType, virtualFeatureClass.ShapeType);
            Assert.AreEqual(realFeatureClass.ShapeFieldName, virtualFeatureClass.ShapeFieldName);

            Assert.IsTrue(SpatialReferenceUtils.AreEqual(
                              DatasetUtils.GetSpatialReference(realFeatureClass),
                              DatasetUtils.GetSpatialReference(virtualFeatureClass), true, true));

            Assert.AreEqual(realFeatureClass.Fields.FieldCount,
                            virtualFeatureClass.Fields.FieldCount);

            int featureCount = 0;

            foreach (var feature in GdbQueryUtils.GetFeatures(realFeatureClass, true))
            {
                // TODO: Move all this to separate project referenced by both client and server
                GdbObjectMsg gdbObjectMsg =
                    ProtobufGdbUtils.ToGdbObjectMsg(feature, false, true);

                GdbRow gdbRow =
                    ProtobufConversionUtils.FromGdbObjectMsg(
                        gdbObjectMsg, (ITable)realFeatureClass);

                for (int i = 0; i < feature.Fields.FieldCount; i++)
                {
                    object expected = feature.get_Value(i);
                    object actual   = gdbRow.get_Value(i);

                    if (expected is IGeometry shape)
                    {
                        Assert.IsTrue(
                            GeometryUtils.AreEqual(shape, (IGeometry)actual));
                    }
                    else
                    {
                        Assert.AreEqual(expected, actual);
                    }
                }

                featureCount++;

                if (featureCount > 250)
                {
                    return;
                }
            }
        }
Пример #4
0
        private static void ReadMsgValues(GdbObjectMsg gdbObjectMsg, GdbRow intoResult,
                                          ITable table)
        {
            if (gdbObjectMsg.Values.Count == 0)
            {
                return;
            }

            Assert.AreEqual(table.Fields.FieldCount, gdbObjectMsg.Values.Count,
                            "GdbObject message values do not correspond to table schema");

            for (var index = 0; index < gdbObjectMsg.Values.Count; index++)
            {
                AttributeValue attributeValue = gdbObjectMsg.Values[index];

                switch (attributeValue.ValueCase)
                {
                case AttributeValue.ValueOneofCase.None:
                    break;

                case AttributeValue.ValueOneofCase.DbNull:
                    intoResult.set_Value(index, DBNull.Value);
                    break;

                case AttributeValue.ValueOneofCase.ShortIntValue:
                    intoResult.set_Value(index, attributeValue.ShortIntValue);
                    break;

                case AttributeValue.ValueOneofCase.LongIntValue:
                    intoResult.set_Value(index, attributeValue.LongIntValue);
                    break;

                case AttributeValue.ValueOneofCase.FloatValue:
                    intoResult.set_Value(index, attributeValue.FloatValue);
                    break;

                case AttributeValue.ValueOneofCase.DoubleValue:
                    intoResult.set_Value(index, attributeValue.DoubleValue);
                    break;

                case AttributeValue.ValueOneofCase.StringValue:
                    intoResult.set_Value(index, attributeValue.StringValue);
                    break;

                case AttributeValue.ValueOneofCase.DateTimeTicksValue:
                    intoResult.set_Value(
                        index, new DateTime(attributeValue.DateTimeTicksValue));
                    break;

                case AttributeValue.ValueOneofCase.UuidValue:
                    var  guid = new Guid(attributeValue.UuidValue.Value.ToByteArray());
                    IUID uid  = UIDUtils.CreateUID(guid);
                    intoResult.set_Value(index, uid);
                    break;

                case AttributeValue.ValueOneofCase.BlobValue:
                    intoResult.set_Value(index, attributeValue.BlobValue);
                    break;

                default:
                    if (table.Fields.Field[index].Type == esriFieldType.esriFieldTypeGeometry)
                    {
                        // Leave empty, it is already assigned to the Shape property
                        break;
                    }

                    throw new ArgumentOutOfRangeException();
                }
            }
        }