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); }
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); }
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; } } }
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(); } } }