コード例 #1
0
        public static IList <GdbWorkspace> CreateSchema(
            [NotNull] IEnumerable <ObjectClassMsg> objectClassMessages,
            [CanBeNull] ICollection <ObjectClassMsg> relClassMessages = null,
            Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest = null)
        {
            var result = new List <GdbWorkspace>();

            foreach (IGrouping <int, ObjectClassMsg> classGroup in objectClassMessages.GroupBy(
                         c => c.WorkspaceHandle))
            {
                GdbTableContainer gdbTableContainer =
                    CreateGdbTableContainer(classGroup, moreDataRequest,
                                            out GdbWorkspace gdbWorkspace);

                result.Add(gdbWorkspace);

                if (relClassMessages == null)
                {
                    continue;
                }

                foreach (ObjectClassMsg relTableMsg
                         in relClassMessages.Where(
                             r => r.WorkspaceHandle == gdbWorkspace.WorkspaceHandle))
                {
                    GdbTable relClassTable = FromObjectClassMsg(relTableMsg, gdbWorkspace);

                    gdbTableContainer.TryAddRelationshipClass(relClassTable);
                }
            }

            return(result);
        }
コード例 #2
0
        public static GdbTableContainer CreateGdbTableContainer(
            [NotNull] IEnumerable <ObjectClassMsg> objectClassMessages,
            [CanBeNull] Func <DataVerificationResponse, DataVerificationRequest> getRemoteDataFunc,
            out GdbWorkspace workspace)
        {
            GdbTableContainer container = null;
            int?workspaceHandle         = null;

            workspace = null;

            foreach (ObjectClassMsg objectClassMsg in objectClassMessages)
            {
                if (workspaceHandle == null)
                {
                    workspaceHandle = objectClassMsg.WorkspaceHandle;

                    container = new GdbTableContainer();

                    workspace = new GdbWorkspace(container)
                    {
                        WorkspaceHandle = objectClassMsg.WorkspaceHandle
                    };
                }
                else
                {
                    Assert.AreEqual(workspaceHandle, objectClassMsg.WorkspaceHandle,
                                    "Not all features are from the same workspace");
                }

                if (objectClassMsg.WorkspaceHandle == -1)
                {
                    workspace = null;
                }

                Func <ITable, BackingDataset> createBackingDataset = null;

                if (getRemoteDataFunc != null)
                {
                    createBackingDataset = (t) =>
                                           new RemoteDataset(t, getRemoteDataFunc,
                                                             new ClassDef
                    {
                        ClassHandle     = objectClassMsg.ClassHandle,
                        WorkspaceHandle = objectClassMsg.WorkspaceHandle
                    });
                }

                GdbTable gdbTable =
                    FromObjectClassMsg(objectClassMsg, workspace, createBackingDataset);

                container.TryAdd(gdbTable);
            }

            return(container);
        }
コード例 #3
0
ファイル: GdbTableTest.cs プロジェクト: sungaoyong/ProSuite
        public void CanCreateGdbTable()
        {
            // An in-memory backing dataset is created automatically, if no factory method is provided
            GdbTable gdbTable = new GdbTable(41, "TESTABLE", "Test table");

            IObjectClass objectClass = gdbTable;

            Assert.AreEqual(41, objectClass.ObjectClassID);
            Assert.AreEqual("TESTABLE", DatasetUtils.GetName(objectClass));
            Assert.AreEqual("Test table", DatasetUtils.GetAliasName(objectClass));

            Assert.False(objectClass.HasOID);
            Assert.Null(objectClass.OIDFieldName);

            Assert.AreEqual(0, GdbQueryUtils.Count(objectClass, ""));

            // Add OID field
            gdbTable.AddField(FieldUtils.CreateOIDField());

            Assert.True(objectClass.HasOID);
            Assert.AreEqual("OBJECTID", objectClass.OIDFieldName);

            IQueryFilter queryFilter = GdbQueryUtils.CreateQueryFilter("OBJECTID");

            queryFilter.WhereClause = "OBJECTID < 0";

            Assert.AreEqual(0,
                            GdbQueryUtils.Count(objectClass, queryFilter));

            var backingDataset = gdbTable.BackingDataset as InMemoryDataset;

            Assert.NotNull(backingDataset);

            backingDataset.AllRows.Add(new GdbRow(1, gdbTable));

            Assert.AreEqual(0,
                            GdbQueryUtils.Count(objectClass, queryFilter));

            queryFilter.WhereClause = "OBJECTID > 0";

            Assert.AreEqual(1,
                            GdbQueryUtils.Count(objectClass, queryFilter));
        }
コード例 #4
0
        public static GdbTable FromObjectClassMsg(
            [NotNull] ObjectClassMsg objectClassMsg,
            [CanBeNull] IWorkspace workspace,
            [CanBeNull] Func <ITable, BackingDataset> createBackingDataset = null)
        {
            esriGeometryType geometryType = (esriGeometryType)objectClassMsg.GeometryType;

            GdbTable result;

            if (geometryType == esriGeometryType.esriGeometryNull)
            {
                result = new GdbTable(objectClassMsg.ClassHandle,
                                      objectClassMsg.Name, objectClassMsg.Alias,
                                      createBackingDataset, workspace);
            }
            else
            {
                result = new GdbFeatureClass(
                    objectClassMsg.ClassHandle,
                    objectClassMsg.Name,
                    (esriGeometryType)objectClassMsg.GeometryType,
                    objectClassMsg.Alias,
                    createBackingDataset, workspace)
                {
                    SpatialReference =
                        ProtobufGeometryUtils.FromSpatialReferenceMsg(
                            objectClassMsg.SpatialReference)
                };
            }

            if (objectClassMsg.Fields == null || objectClassMsg.Fields.Count <= 0)
            {
                return(result);
            }

            foreach (FieldMsg fieldMsg in objectClassMsg.Fields)
            {
                IField field = FieldUtils.CreateField(fieldMsg.Name,
                                                      (esriFieldType)fieldMsg.Type,
                                                      fieldMsg.AliasName);

                if (field.Type == esriFieldType.esriFieldTypeString)
                {
                    ((IFieldEdit)field).Length_2 = fieldMsg.Length;
                }
                else if (field.Type == esriFieldType.esriFieldTypeGeometry)
                {
                    var sr = ProtobufGeometryUtils.FromSpatialReferenceMsg(
                        objectClassMsg.SpatialReference);
                    field = FieldUtils.CreateShapeField(geometryType, sr, 1000, true, false);
                }

                if (result.Fields.FindField(field.Name) < 0)
                {
                    result.AddField(field);
                }
                else
                {
                    _msg.DebugFormat("Field {0} is duplicate or has been added previously",
                                     field.Name);
                }
            }

            return(result);
        }