コード例 #1
0
        async private Task <bool> CopyFeatures2(IFeatureClass source, IFeatureUpdater fdb, IFeatureClass dest, FieldTranslation fTrans, BinaryTree2Builder treeBuilder)
        {
            List <BinaryTree2BuilderNode> nodes;

            if (treeBuilder == null || (nodes = treeBuilder.Nodes) == null)
            {
                _errMsg = "Spatial Index is not defined...";
                return(false);
            }

            if (ReportAction != null)
            {
                ReportAction(this, "Copy Features (" + dest.Name + ")");
            }
            int featcounter = 0;

            foreach (BinaryTree2BuilderNode node in nodes)
            {
                if (!_cancelTracker.Continue)
                {
                    break;
                }

                RowIDFilter filter = new RowIDFilter(source.IDFieldName);
                filter.IDs       = node.OIDs;
                filter.SubFields = "*";

                using (IFeatureCursor fCursor = await source.GetFeatures(filter))
                {
                    if (fCursor == null)
                    {
                        _errMsg = "Fatal error: sourcedb query failed...";
                        return(false);
                    }

                    int copycounter = await CopyFeatures(fCursor, node.Number, fdb, dest, fTrans, featcounter);

                    if (copycounter < 0)
                    {
                        fCursor.Dispose();
                        return(false);
                    }
                    featcounter = copycounter;

                    fCursor.Dispose();
                }
            }
            if (ReportProgress != null)
            {
                ReportProgress(this, featcounter);
            }
            return(true);
        }
コード例 #2
0
        async public Task <IFeatureCursor> NetworkPathEdges(NetworkEdgeCollectionOutput edgeCollection)
        {
            if (_nfc == null)
            {
                return(null);
            }

            RowIDFilter filter = new RowIDFilter(String.Empty);

            foreach (NetworkEdgeOutput edge in edgeCollection)
            {
                filter.IDs.Add(edge.EdgeId);
            }

            return(await _nfc.GetEdgeFeatures(filter));
        }
コード例 #3
0
        async public Task <IFeatureCursor> NetworkPathEdges(Dijkstra.NetworkPath networkPath)
        {
            if (_nfc == null)
            {
                return(null);
            }

            RowIDFilter filter = new RowIDFilter(String.Empty);

            foreach (Dijkstra.NetworkPathEdge edge in networkPath)
            {
                filter.IDs.Add(edge.EId);
            }

            return(await _nfc.GetEdgeFeatures(filter));
        }
コード例 #4
0
        private bool CopyFeatures(IFeatureClass source, IFeatureUpdater fdb, IFeatureClass dest, FieldTranslation fTrans, DualTree tree)
        {
            if (tree == null || tree.Nodes == null)
            {
                _errMsg = "Spatial Index is not defined...";
                return(false);
            }

            if (ReportAction != null)
            {
                ReportAction(this, "Copy Features (" + dest.Name + ")");
            }
            int featcounter = 0;

            foreach (SpatialIndexNode node in tree.Nodes)
            {
                if (!_cancelTracker.Continue)
                {
                    break;
                }

                RowIDFilter filter = new RowIDFilter(source.IDFieldName);
                filter.IDs       = node.IDs;
                filter.SubFields = "*";

                using (IFeatureCursor fCursor = source.GetFeatures(filter))
                {
                    if (fCursor == null)
                    {
                        _errMsg = "Fatal error: sourcedb query failed...";
                        return(false);
                    }
                    if (!CopyFeatures(fCursor, node.NID, fdb, dest, fTrans, ref featcounter))
                    {
                        fCursor.Dispose();
                        return(false);
                    }
                    fCursor.Dispose();
                }
            }
            if (ReportProgress != null)
            {
                ReportProgress(this, featcounter);
            }
            return(true);
        }
コード例 #5
0
ファイル: FormDataTable.cs プロジェクト: am2222/gViewGisOS
            private void RelationTreeNode_Click(object sender, EventArgs e)
            {
                IFeatureSelection target = (this.TableRelation.LeftTable == this.DatasetElement ? this.TableRelation.RightTable : this.TableRelation.LeftTable) as IFeatureSelection;

                if (target == null)
                {
                    return;
                }

                target.ClearSelection();

                if (this.DatasetElement is IFeatureSelection &&
                    ((IFeatureSelection)this.DatasetElement).SelectionSet is IIDSelectionSet)
                {
                    IIDSelectionSet selSet = (IIDSelectionSet)((IFeatureSelection)this.DatasetElement).SelectionSet;
                    if (selSet != null && selSet.IDs != null && selSet.IDs.Count > 0)
                    {
                        string      relationField = this.TableRelation.LeftTable == this.DatasetElement ? this.TableRelation.LeftTableField : this.TableRelation.RightTableField;
                        RowIDFilter filter        = new RowIDFilter(((ITableClass)this.DatasetElement.Class).IDFieldName);
                        filter.IDs       = selSet.IDs;
                        filter.SubFields = relationField;
                        ICursor cursor = ((ITableClass)this.DatasetElement.Class).Search(filter);

                        IRow row = null;
                        while ((row = Next(cursor)) != null)
                        {
                            object val = row[relationField];
                            if (val == null)
                            {
                                continue;
                            }

                            IQueryFilter selFilter = this.TableRelation.LeftTable == this.DatasetElement ? this.TableRelation.GetRightFilter("*", val) : this.TableRelation.GetLeftFilter("*", val);
                            target.Select(selFilter, CombinationMethod.Union);
                        }
                    }
                }

                target.FireSelectionChangedEvent();

                if (_mapDocument != null && _mapDocument.Application is IMapApplication)
                {
                    ((IMapApplication)_mapDocument.Application).RefreshActiveMap(DrawPhase.Selection);
                }
            }
コード例 #6
0
        async public Task <IFeatureCursor> NetworkPathEdges(Dijkstra.Nodes nodes, string fields)
        {
            if (_nfc == null)
            {
                return(null);
            }

            //StringBuilder sb = new StringBuilder();
            //sb.Append("FDB_OID in (");
            //foreach (Dijkstra.Node node in nodes)
            //{
            //    //if (node.Dist > maxDistance)
            //    //    continue;
            //    if (sb.Length > 12)
            //        sb.Append(",");
            //    sb.Append(node.EId);
            //}
            //sb.Append(")");

            //QueryFilter filter = new QueryFilter();
            //filter.AddField("FDB_OID");
            //filter.AddField("FDB_SHAPE");
            //if (!String.IsNullOrEmpty(fields))
            //{
            //    foreach (string field in fields.Split(','))
            //        filter.AddField(field);
            //}
            //filter.WhereClause = sb.ToString();
            RowIDFilter filter = new RowIDFilter(String.Empty);

            foreach (Dijkstra.Node node in nodes)
            {
                filter.IDs.Add(node.EId);
            }
            if (!String.IsNullOrEmpty(fields))
            {
                foreach (string field in fields.Split(','))
                {
                    filter.AddField(field);
                }
            }

            return(await _nfc.GetEdgeFeatures(filter));
        }
コード例 #7
0
        async public Task <IFeature> GetEdgeFeature(int eid)
        {
            RowIDFilter filter = new RowIDFilter(String.Empty);

            filter.IDs.Add(eid);
            filter.AddField("*");

            IFeatureCursor cursor = await GetEdgeFeatures(filter);

            if (cursor == null)
            {
                return(null);
            }

            IFeature feature = await cursor.NextFeature();

            cursor.Dispose();

            if (feature != null && feature.FindField("FCID") != null && feature.FindField("OID") != null &&
                _edgeFcs.ContainsKey((int)feature["FCID"]))
            {
                IGraphEdge edge = _pageManager.GetEdge(eid);
                try
                {
                    if (edge != null && edge.FcId == -1) // Complex Edge
                    {
                        filter = new RowIDFilter("FDB_OID");
                        filter.IDs.Add((int)feature["OID"]);
                        filter.AddField("*");
                        IFeatureClass fc = _edgeFcs[(int)feature["FCID"]];
                        using (IFeatureCursor c = await fc.GetFeatures(filter))
                        {
                            return(await c.NextFeature());
                        }
                    }
                }
                catch { }
            }
            return(feature);
        }
コード例 #8
0
        public IFeature GetEdgeFeature(int eid)
        {
            RowIDFilter filter = new RowIDFilter(String.Empty);

            filter.IDs.Add(eid);
            filter.AddField("*");

            IFeature feature = null;

            using (IFeatureCursor cursor = GetEdgeFeatures(filter))
            {
                feature = cursor.NextFeature;
            }

            if (feature != null && feature.FindField("FCID") != null && feature.FindField("OID") != null &&
                _edgeFcs.ContainsKey(Convert.ToInt32(feature["FCID"])))
            {
                IGraphEdge edge = _pageManager.GetEdge(eid);
                try
                {
                    if (edge != null && edge.FcId == -1) // Complex Edge
                    {
                        filter = new RowIDFilter("FDB_OID");
                        filter.IDs.Add(Convert.ToInt32(feature["OID"]));
                        filter.AddField("*");
                        IFeatureClass fc = _edgeFcs[Convert.ToInt32(feature["FCID"])];
                        using (IFeatureCursor c = fc.GetFeatures(filter))
                        {
                            return(c.NextFeature);
                        }
                    }
                }
                catch { }
            }

            return(feature);
        }
コード例 #9
0
        public ExportFeatureClassDialog(IDisplay display, IFeatureLayer sourceFeatureLayer)
        {
            InitializeComponent();

            _sourceFeatureClass = sourceFeatureLayer.Class as IFeatureClass;

            #region Filter
            //All Features
            //Selected Features
            //Features in actual extent
            cmbExport.Items.Add(new ExportMethodItem("All Features", null));

            if (sourceFeatureLayer is IFeatureSelection &&
                ((IFeatureSelection)sourceFeatureLayer).SelectionSet != null &&
                ((IFeatureSelection)sourceFeatureLayer).SelectionSet.Count > 0)
            {
                ISelectionSet selectionSet = ((IFeatureSelection)sourceFeatureLayer).SelectionSet;
                IQueryFilter  selFilter    = null;
                if (selectionSet is IIDSelectionSet)
                {
                    selFilter = new RowIDFilter(_sourceFeatureClass.IDFieldName, ((IIDSelectionSet)selectionSet).IDs);
                }
                else if (selectionSet is IGlobalIDSelectionSet)
                {
                    selFilter = new GlobalRowIDFilter(_sourceFeatureClass.IDFieldName, ((IGlobalIDSelectionSet)selectionSet).IDs);
                }
                else if (selectionSet is IQueryFilteredSelectionSet)
                {
                    selFilter = ((IQueryFilteredSelectionSet)selectionSet).QueryFilter.Clone() as IQueryFilter;
                }

                if (selFilter != null)
                {
                    selFilter.SubFields = "*";
                    ExportMethodItem item = new ExportMethodItem("Selected Features", selFilter);
                    cmbExport.Items.Add(item);
                    cmbExport.SelectedItem = item;
                }
            }

            if (display != null && display.Envelope != null)
            {
                SpatialFilter dispFilter = new SpatialFilter();
                dispFilter.SubFields = "*";

                dispFilter.FilterSpatialReference = display.SpatialReference;
                dispFilter.Geometry        = display.Envelope;
                dispFilter.SpatialRelation = spatialRelation.SpatialRelationIntersects;

                cmbExport.Items.Add(new ExportMethodItem("Features in actual extent", dispFilter));
            }

            if (cmbExport.SelectedIndex == -1)
            {
                cmbExport.SelectedIndex = 0;
            }
            #endregion

            _listViewItem       = new FeatureClassListViewItem(_sourceFeatureClass, 255);
            gvFields.DataSource = _listViewItem.Fields;

            panelStep1.Dock = panelStep2.Dock = DockStyle.Fill;
            SetPanelVisibity();
        }
コード例 #10
0
ファイル: FormChartWizard.cs プロジェクト: am2222/gViewGisOS
        private void FormChartWizard_Load(object sender, EventArgs e)
        {
            #region Tab Chart Type

            foreach (gvChart.gvChartType chartType in gvChart.ChartTypes)
            {
                lstChartTypes.Items.Add(chartType);
            }
            lstChartTypes.SelectedItem = 0;

            Series ser1 = new Series("Serie 1");
            ser1.Points.AddXY("A", 10);
            ser1.Points.AddXY("B", 6);
            ser1.Points.AddXY("C", 8);
            ser1.Points.AddXY("D", 12);
            ser1.Points.AddXY("E", 3);
            ser1.Color     = Color.Red;
            ser1.ChartArea = "Area1";

            Series ser2 = new Series("Serie 2");
            ser2.Points.AddXY("A", 5);
            ser2.Points.AddXY("B", 3);
            ser2.Points.AddXY("C", 7);
            ser2.Points.AddXY("D", 8);
            ser2.Points.AddXY("E", 6);
            ser2.Color     = Color.Blue;
            ser2.ChartArea = "Area1";

            _gvChart.Series.Add(ser1);
            _gvChart.Series.Add(ser2);
            _gvChart.Refresh();

            #endregion

            #region Tab Data

            ITableClass tc = (ITableClass)_layer.Class;
            foreach (IField field in _layer.Fields)
            {
                if (field.type == FieldType.biginteger ||
                    field.type == FieldType.Double ||
                    field.type == FieldType.Float ||
                    field.type == FieldType.integer ||
                    field.type == FieldType.smallinteger)
                {
                    lstSeries.Items.Add(new FieldItem()
                    {
                        Field = field
                    });
                }

                if (field.type != FieldType.binary &&
                    field.type != FieldType.GEOGRAPHY &&
                    field.type != FieldType.GEOMETRY &&
                    field.type != FieldType.Shape)
                {
                    cmbDataFields.Items.Add(new FieldItem()
                    {
                        Field = field
                    });
                }
            }
            if (cmbDataFields.Items.Count > 0)
            {
                cmbDataFields.SelectedIndex = 0;
            }

            #region Filter
            //All Features
            //Selected Features
            //Features in actual extent
            cmbFeatures.Items.Add(new ExportMethodItem("All Features", new QueryFilter()));

            if (_layer is IFeatureSelection &&
                ((IFeatureSelection)_layer).SelectionSet != null &&
                ((IFeatureSelection)_layer).SelectionSet.Count > 0)
            {
                ISelectionSet selectionSet = ((IFeatureSelection)_layer).SelectionSet;
                IQueryFilter  selFilter    = null;
                if (selectionSet is IIDSelectionSet)
                {
                    selFilter = new RowIDFilter(tc.IDFieldName, ((IIDSelectionSet)selectionSet).IDs);
                }
                else if (selectionSet is IGlobalIDSelectionSet)
                {
                    selFilter = new GlobalRowIDFilter(tc.IDFieldName, ((IGlobalIDSelectionSet)selectionSet).IDs);
                }
                else if (selectionSet is IQueryFilteredSelectionSet)
                {
                    selFilter = ((IQueryFilteredSelectionSet)selectionSet).QueryFilter.Clone() as IQueryFilter;
                }

                if (selFilter != null)
                {
                    selFilter.SubFields = "*";
                    ExportMethodItem item = new ExportMethodItem("Selected Features", selFilter);
                    cmbFeatures.Items.Add(item);
                    cmbFeatures.SelectedItem = item;
                }
            }

            if (_display != null && _display.Envelope != null)
            {
                SpatialFilter dispFilter = new SpatialFilter();
                dispFilter.SubFields = "*";

                dispFilter.FilterSpatialReference = _display.SpatialReference;
                dispFilter.Geometry        = _display.Envelope;
                dispFilter.SpatialRelation = spatialRelation.SpatialRelationIntersects;

                cmbFeatures.Items.Add(new ExportMethodItem("Features in actual extent", dispFilter));
            }

            if (cmbFeatures.SelectedIndex == -1)
            {
                cmbFeatures.SelectedIndex = 0;
            }
            #endregion

            #endregion
        }
コード例 #11
0
        async public Task <NetworkTracerOutputCollection> Trace(INetworkFeatureClass network, NetworkTracerInputCollection input, gView.Framework.system.ICancelTracker cancelTraker)
        {
            if (network == null || !CanTrace(input))
            {
                return(null);
            }

            GraphTable         gt     = new GraphTable(network.GraphTableAdapter());
            NetworkSourceInput source = input.Collect(NetworkTracerInputType.SourceNode)[0] as NetworkSourceInput;
            NetworkWeighInput  weight =
                input.Contains(NetworkTracerInputType.Weight) ?
                input.Collect(NetworkTracerInputType.Weight)[0] as NetworkWeighInput :
                null;

            Dijkstra dijkstra = new Dijkstra(cancelTraker);

            dijkstra.reportProgress += this.ReportProgress;
            dijkstra.MaxDistance     = _properties.Distance;
            if (weight != null)
            {
                dijkstra.GraphWeight    = weight.Weight;
                dijkstra.WeightApplying = weight.WeightApplying;
            }
            dijkstra.ApplySwitchState = input.Contains(NetworkTracerInputType.IgnoreSwitches) == false &&
                                        network.HasDisabledSwitches;
            Dijkstra.ApplyInputIds(dijkstra, input);

            dijkstra.Calculate(gt, source.NodeId);

            NetworkTracerOutputCollection output = new NetworkTracerOutputCollection();

            #region Knoten/Kanten <= Distance
            Dijkstra.Nodes dijkstraNodes = dijkstra.DijkstraNodesWithMaxDistance(_properties.Distance);
            if (dijkstraNodes == null)
            {
                return(null);
            }

            List <int> edgeIds = new List <int>();
            foreach (Dijkstra.Node dijkstraNode in dijkstraNodes)
            {
                if (dijkstraNode.EId < 0)
                {
                    continue;
                }

                int index = edgeIds.BinarySearch(dijkstraNode.EId);
                if (index < 0)
                {
                    edgeIds.Insert(~index, dijkstraNode.EId);
                }

                if (Math.Abs(dijkstraNode.Dist - _properties.Distance) < double.Epsilon)
                {
                    // ToDo: Flag einfügen!!
                }
            }

            output.Add(new NetworkEdgeCollectionOutput(edgeIds));
            #endregion

            #region Knoten/Kanten > Distance
            Dijkstra.Nodes cnodes = dijkstra.DijkstraNodesDistanceGreaterThan(_properties.Distance);
            foreach (Dijkstra.Node cnode in cnodes)
            {
                Dijkstra.Node node = dijkstra.DijkstraNodes.ById(cnode.Pre);
                if (node == null)
                {
                    continue;
                }

                IGraphEdge graphEdge = gt.QueryEdge(cnode.EId);
                if (graphEdge == null)
                {
                    continue;
                }

                RowIDFilter filter = new RowIDFilter(String.Empty);
                filter.IDs.Add(graphEdge.Eid);
                IFeatureCursor cursor = await network.GetEdgeFeatures(filter);

                if (cursor == null)
                {
                    continue;
                }

                IFeature feature = await cursor.NextFeature();

                if (feature == null)
                {
                    continue;
                }

                IPath path = null;
                if (cnode.Id != graphEdge.N2 && cnode.Id == graphEdge.N1)
                {
                    ((Polyline)feature.Shape)[0].ChangeDirection();
                }

                double trimDist = _properties.Distance - node.Dist;
                string label    = _properties.Distance.ToString();
                if (weight != null)
                {
                    double w = gt.QueryEdgeWeight(weight.Weight.Guid, cnode.EId);
                    switch (weight.WeightApplying)
                    {
                    case WeightApplying.Weight:
                        trimDist *= w;
                        break;

                    case WeightApplying.ActualCosts:
                        trimDist = ((IPolyline)feature.Shape)[0].Length * trimDist * w;      // ??? Prüfen
                        break;
                    }
                    label += "\n(" + Math.Round(node.GeoDist + trimDist, 2).ToString() + ")";
                }
                path = ((IPolyline)feature.Shape)[0].Trim(trimDist);
                Polyline polyline = new Polyline();
                polyline.AddPath(path);

                output.Add(new NetworkEdgePolylineOutput(cnode.EId, polyline));

                output.Add(new NetworkFlagOutput(
                               polyline[0][polyline[0].PointCount - 1],
                               label));
            }
            #endregion

            return(output);
        }
コード例 #12
0
        async public Task Render()
        {
            if (_layer == null)
            {
                return;
            }

            if (_layer.SelectionRenderer == null)
            {
                return;
            }

            if (!(_layer is IFeatureSelection))
            {
                return;
            }

            IFeatureClass fClass = _layer.FeatureClass;

            if (fClass == null)
            {
                return;
            }

            ISelectionSet selectionSet = ((IFeatureSelection)_layer).SelectionSet;

            if (selectionSet == null)
            {
                return;
            }

            IDataset dataset = _map[_layer];

            if (dataset == null)
            {
                return;
            }

            if (!(dataset is IFeatureDataset))
            {
                return;
            }

            IGeometry filterGeom = _map.Display.Envelope;

            if (_map.Display.GeometricTransformer != null)
            {
                filterGeom = MapHelper.Project(fClass, _map.Display);
                //filterGeom = (IGeometry)_map.Display.GeometricTransformer.InvTransform2D(filterGeom);
            }

            IQueryFilter filter = null;

            //List<int> IDs=new List<int>();  // Sollte nicht null sein...
            if (selectionSet is ISpatialIndexedIDSelectionSet)
            {
                List <int> IDs = ((ISpatialIndexedIDSelectionSet)selectionSet).IDsInEnvelope(filterGeom.Envelope);
                filter = new RowIDFilter(fClass.IDFieldName, IDs);
            }
            else if (selectionSet is IIDSelectionSet)
            {
                List <int> IDs = ((IIDSelectionSet)selectionSet).IDs;
                filter = new RowIDFilter(fClass.IDFieldName, IDs);
            }
            else if (selectionSet is ISpatialIndexedGlobalIDSelectionSet)
            {
                List <long> IDs = ((ISpatialIndexedGlobalIDSelectionSet)selectionSet).IDsInEnvelope(filterGeom.Envelope);
                filter = new GlobalRowIDFilter(fClass.IDFieldName, IDs);
            }
            else if (selectionSet is IGlobalIDSelectionSet)
            {
                List <long> IDs = ((IGlobalIDSelectionSet)selectionSet).IDs;
                filter = new GlobalRowIDFilter(fClass.IDFieldName, IDs);
            }
            else if (selectionSet is IQueryFilteredSelectionSet)
            {
                filter = ((IQueryFilteredSelectionSet)selectionSet).QueryFilter.Clone() as IQueryFilter;
            }

            if (filter == null)
            {
                return;
            }

            filter.AddField(fClass.ShapeFieldName);

            #region Clone Layer

            IFeatureRenderer selectionRenderer = null;

            lock (lockThis)
            {
                // Beim Clonen sprerren...
                // Da sonst bei der Servicemap bei gleichzeitigen Requests
                // Exception "Objekt wird bereits an anderer Stelle verwendet" auftreten kann!
                selectionRenderer = (IFeatureRenderer)_layer.SelectionRenderer.Clone(new CloneOptions(_map,
                                                                                                      false,
                                                                                                      maxLabelRefscaleFactor: _layer.MaxRefScaleFactor));
            }

            #endregion

            selectionRenderer.PrepareQueryFilter(_layer, filter);

            using (IFeatureCursor fCursor = (fClass is ISelectionCache) ? ((ISelectionCache)fClass).GetSelectedFeatures(_map.Display) : await fClass.GetFeatures(filter))
            {
                if (fCursor != null)
                {
                    //_layer.SelectionRenderer.Draw(_map, fCursor, DrawPhase.Geography, _cancelTracker);
                    IFeature feature;
                    while ((feature = await fCursor.NextFeature()) != null)
                    {
                        if (_cancelTracker != null)
                        {
                            if (!_cancelTracker.Continue)
                            {
                                break;
                            }
                        }

                        selectionRenderer.Draw(_map, feature);
                    }
                    fCursor.Dispose();
                }
            }
        }
コード例 #13
0
        async public Task <IFeatureCursor> GetEdgeFeatures(IQueryFilter filter)
        {
            if (_edgeFcs.Count == 0)
            {
                return(null);
            }

            if (filter is SpatialFilter)
            {
                List <IFeatureClass> edgeFcs = new List <IFeatureClass>();
                if (_edgeFcs != null)
                {
                    foreach (IFeatureClass fc in _edgeFcs.Values)
                    {
                        edgeFcs.Add(fc);
                    }
                }
                return(new NetworkFeatureCursor(_fdb, _name, edgeFcs, null, filter));
            }

            if (filter is RowIDFilter)
            {
                RowIDFilter idFilter = (RowIDFilter)filter;

                Dictionary <int, QueryFilter> rfilters = new Dictionary <int, QueryFilter>();
                Dictionary <int, Dictionary <int, List <FieldValue> > > additionalFields = new Dictionary <int, Dictionary <int, List <FieldValue> > >();
                foreach (int eid in idFilter.IDs)
                {
                    IGraphEdge edge = _pageManager.GetEdge(eid);
                    if (edge == null || _edgeFcs.ContainsKey(edge.FcId) == false)
                    {
                        continue;
                    }

                    if (!rfilters.ContainsKey(edge.FcId))
                    {
                        string idFieldName    = "FDB_OID";
                        string shapeFieldName = "FDB_SHAPE";

                        IFeatureClass fc = edge.FcId >= 0 ? await _fdb.GetFeatureclass(edge.FcId) : null;

                        if (fc != null)
                        {
                            idFieldName    = fc.IDFieldName;
                            shapeFieldName = fc.ShapeFieldName;
                        }

                        rfilters.Add(edge.FcId, new RowIDFilter(edge.FcId >= 0 ? idFieldName : "EID"));
                        rfilters[edge.FcId].AddField(shapeFieldName);
                        additionalFields.Add(edge.FcId, new Dictionary <int, List <FieldValue> >());

                        rfilters[edge.FcId].IgnoreUndefinedFields = true;
                        rfilters[edge.FcId].AddField(shapeFieldName);
                        if (filter.SubFields.IndexOf("*") != -1)
                        {
                            rfilters[edge.FcId].AddField("*");
                        }
                        else
                        {
                            foreach (string field in filter.SubFields.Split(' '))
                            {
                                if (field == shapeFieldName)
                                {
                                    continue;
                                }
                                if (fc.Fields.FindField(field) != null)
                                {
                                    rfilters[edge.FcId].AddField(fc.Fields.FindField(field).name);
                                }
                            }
                        }
                    }

                    ((RowIDFilter)rfilters[edge.FcId]).IDs.Add(edge.FcId >= 0 ? edge.Oid : edge.Eid);
                    additionalFields[edge.FcId].Add(edge.FcId >= 0 ? edge.Oid : edge.Eid, new List <FieldValue>()
                    {
                        new FieldValue("_eid", edge.Eid)
                    });
                }
                if (rfilters.ContainsKey(-1))
                {
                    RowIDFilter complexEdgeFilter = (RowIDFilter)rfilters[-1];
                    QueryFilter ceFilter          = new QueryFilter(complexEdgeFilter);
                    ceFilter.WhereClause = complexEdgeFilter.RowIDWhereClause;
                    rfilters[-1]         = ceFilter;
                }
                return(new CursorCollection <int>(_edgeFcs, rfilters, additionalFields));
            }

            return(null);
        }
コード例 #14
0
        async public Task Run(string[] args)
        {
            string inFile  = String.Empty;
            string outFile = String.Empty;
            string targetConnectionString        = String.Empty;
            IEnumerable <string> dontCopyFeatues = null;
            Guid targetGuid = new Guid();

            for (int i = 1; i < args.Length - 1; i++)
            {
                switch (args[i].ToLower())
                {
                case "-mxl":
                    inFile = args[++i];
                    break;

                case "-target-connectionstring":
                    targetConnectionString = args[++i];
                    break;

                case "-target-guid":
                    var guid = args[++i];
                    switch (guid.ToLower())
                    {
                    case "sqlserver":
                        targetGuid = new Guid("3B870AB5-8BE0-4a00-911D-ECC6C83DD6B4");
                        break;

                    case "postgres":
                        targetGuid = new Guid("33254063-133D-4b17-AAE2-46AF7A7DA733");
                        break;

                    case "sqlite":
                        targetGuid = new Guid("36DEB6AC-EA0C-4B37-91F1-B2E397351555");
                        break;

                    default:
                        targetGuid = new Guid(guid);
                        break;
                    }
                    break;

                case "-out-mxl":
                    outFile = args[++i];
                    break;

                case "-dont-copy-features-from":
                    dontCopyFeatues = args[++i].Split(',').Select(n => n.Trim().ToLower());
                    break;
                }
            }

            if (String.IsNullOrEmpty(inFile) ||
                String.IsNullOrEmpty(targetConnectionString) ||
                targetGuid.Equals(new Guid()))
            {
                throw new IncompleteArgumentsException();
            }

            if (String.IsNullOrEmpty(outFile))
            {
                outFile = String.IsNullOrEmpty(inFile) ? String.Empty : inFile.Substring(0, inFile.LastIndexOf(".")) + "_fdb.mxl";
            }

            XmlStream stream = new XmlStream("");

            stream.ReadStream(inFile);

            MxlDocument doc = new MxlDocument();
            await stream.LoadAsync("MapDocument", doc);

            var pluginManager = new PlugInManager();

            #region Destination Dataset

            IFeatureDataset targetFeatureDataset = pluginManager.CreateInstance(targetGuid) as IFeatureDataset;
            if (targetFeatureDataset == null)
            {
                throw new Exception("Plugin with GUID '" + targetGuid.ToString() + "' is not a feature dataset...");
            }
            await targetFeatureDataset.SetConnectionString(targetConnectionString);

            await targetFeatureDataset.Open();

            var targetDatabase = (IFDBDatabase)targetFeatureDataset.Database;

            #endregion Destination Dataset

            var map = doc.Maps.FirstOrDefault() as Map;

            var featureLayers = map.TOC.Layers.Where(l => l is IFeatureLayer)
                                .Select(l => (IFeatureLayer)l);

            if (map.Datasets != null)
            {
                int datasetId = 0;
                foreach (var dataset in map.Datasets.ToArray())
                {
                    Console.WriteLine();
                    Console.WriteLine($"Dataset: { dataset.DatasetName }");
                    Console.WriteLine($"         { dataset.GetType() }");
                    Console.WriteLine("-------------------------------------------------------");

                    foreach (var dsElement in map.MapElements.Where(e => e.DatasetID == datasetId))
                    {
                        if (dsElement?.Class == null)
                        {
                            continue;
                        }

                        var featureLayer = featureLayers.Where(l => l.DatasetID == datasetId && l.Class == dsElement.Class)
                                           .FirstOrDefault();

                        if (featureLayer == null)
                        {
                            continue;
                        }

                        Console.WriteLine();
                        Console.WriteLine($"FeatureLayer: { featureLayer.Title }");
                        Console.WriteLine($"       Class: { dsElement.Class.Name }");
                        Console.WriteLine($"              { dsElement.Class.GetType() }");
                        Console.WriteLine();

                        var sourceFc = dsElement.Class as IFeatureClass;
                        if (sourceFc == null)
                        {
                            Console.WriteLine("Class is not a FeatureClass");
                            continue;
                        }

                        #region Create Target Featureclass (if not exists)

                        string targetFcName = dsElement.Class.Name;
                        if (targetFcName.Contains("."))
                        {
                            targetFcName = targetFcName.Substring(targetFcName.LastIndexOf(".") + 1);
                        }

                        var targetFc = (await targetFeatureDataset.Element(targetFcName))?.Class as IFeatureClass;

                        if (targetFc != null)
                        {
                            var count = await targetFc.CountFeatures();

                            if (count > 0)
                            {
                                Console.Write($"Already exists in target fdb ({ count } features)");
                            }
                            else
                            {
                                if (!await targetDatabase.DeleteFeatureClass(targetFcName))
                                {
                                    throw new Exception($"Can't delete existing (empty) featureclass { targetFcName }");
                                }
                            }
                        }
                        else
                        {
                            var fcId = await targetDatabase.CreateFeatureClass(
                                targetFeatureDataset.DatasetName,
                                targetFcName,
                                new GeometryDef()
                            {
                                GeometryType     = sourceFc.GeometryType,
                                HasM             = sourceFc.HasM,
                                HasZ             = sourceFc.HasZ,
                                SpatialReference = sourceFc.SpatialReference
                            },
                                new Fields(sourceFc.Fields.ToEnumerable().Select(f =>
                            {
                                if (f != null && f.type == FieldType.ID && f.name.ToUpper().Equals("FDB_OID") == false)      // also include original ID Column
                                {
                                    return(new Field(f.name, FieldType.integer));
                                }
                                return(f);
                            })));

                            if (fcId <= 0)
                            {
                                throw new Exception($"Can't create featureclass { targetFcName }: { targetDatabase.LastErrorMessage }");
                            }

                            targetFc = (await targetFeatureDataset.Element(targetFcName)).Class as IFeatureClass;
                            if (targetFc == null)
                            {
                                throw new Exception($"Can't load target FeatureClass { targetFcName }");
                            }

                            var copyFeatures = dontCopyFeatues == null ||
                                               (!dontCopyFeatues.Contains(sourceFc.Name.ToLower()) && !dontCopyFeatues.Contains(targetFc.Name.ToLower()));

                            if (copyFeatures)
                            {
                                var sIndexDef = new gViewSpatialIndexDef(null, 62);

                                var tree2 = await SpatialIndex2(
                                    targetDatabase,
                                    sourceFc,
                                    sIndexDef);

                                tree2.Trim();

                                List <long> nids = new List <long>();
                                foreach (BinaryTree2BuilderNode node in tree2.Nodes)
                                {
                                    nids.Add(node.Number);
                                }
                                await((AccessFDB)targetDatabase).ShrinkSpatialIndex(targetFcName, nids);
                                await((AccessFDB)targetDatabase).SetSpatialIndexBounds(targetFcName, "BinaryTree2", tree2.Bounds, tree2.SplitRatio, tree2.MaxPerNode, tree2.maxLevels);
                                await((AccessFDB)targetDatabase).SetFeatureclassExtent(targetFcName, tree2.Bounds);

                                #endregion Create Target Featureclass (if not exists)

                                var      featureBag = new List <IFeature>();
                                IFeature feature    = null;
                                int      counter    = 0;

                                Console.WriteLine("Copy features:");

                                if (sourceFc is IFeatureClassPerformanceInfo && ((IFeatureClassPerformanceInfo)sourceFc).SupportsHighperformanceOidQueries == false)
                                {
                                    using (var memoryFeatureBag = new FeatureBag())
                                    {
                                        #region Read all Features to FeatureBag (Memory)

                                        //
                                        //  eg. SDE Multiversion Views are very slow, queiried win OID Filter!!
                                        //
                                        Console.WriteLine("Source feature class do not support high performance oid quries!");

                                        QueryFilter filter = new QueryFilter()
                                        {
                                            WhereClause = "1=1"
                                        };
                                        filter.AddField("*");

                                        Console.WriteLine("Read all features to memory feature bag...");

                                        using (var featureCursor = await sourceFc.GetFeatures(filter))
                                        {
                                            if (featureCursor == null)
                                            {
                                                throw new Exception($"Can't query features from soure featureclass: { (sourceFc is IDebugging ? ((IDebugging)sourceFc).LastException?.Message : "") }");
                                            }

                                            while ((feature = await featureCursor.NextFeature()) != null)
                                            {
                                                memoryFeatureBag.AddFeature(feature);
                                                counter++;

                                                if (counter % 10000 == 0)
                                                {
                                                    Console.Write($"...{ counter }");
                                                }
                                            }
                                        }

                                        #endregion Read all Features to FeatureBag (Memory)

                                        #region Write to target featureclass

                                        Console.WriteLine($"...{ counter }");
                                        Console.WriteLine("copy feature to target feature class");
                                        counter = 0;

                                        foreach (BinaryTree2BuilderNode node in tree2.Nodes)
                                        {
                                            foreach (var memoryFeature in memoryFeatureBag.GetFeatures(node.OIDs))
                                            {
                                                memoryFeature.Fields.Add(new FieldValue("$FDB_NID", node.Number));
                                                featureBag.Add(memoryFeature);
                                                counter++;

                                                if (counter % 10000 == 0)
                                                {
                                                    await Store(targetDatabase, targetFc, featureBag, counter);
                                                }
                                            }
                                        }

                                        #endregion Write to target featureclass
                                    }

                                    GC.Collect();
                                }
                                else
                                {
                                    #region Query all per Oid and Node

                                    foreach (BinaryTree2BuilderNode node in tree2.Nodes)
                                    {
                                        RowIDFilter filter = new RowIDFilter(sourceFc.IDFieldName);
                                        filter.IDs       = node.OIDs;
                                        filter.SubFields = "*";

                                        using (var featureCursor = await sourceFc.GetFeatures(filter))
                                        {
                                            if (featureCursor == null)
                                            {
                                                throw new Exception($"Can't query features from soure featureclass: { (sourceFc is IDebugging ? ((IDebugging)sourceFc).LastException?.Message : "") }");
                                            }

                                            while ((feature = await featureCursor.NextFeature()) != null)
                                            {
                                                feature.Fields.Add(new FieldValue("$FDB_NID", node.Number));
                                                featureBag.Add(feature);
                                                counter++;

                                                if (counter % 10000 == 0)
                                                {
                                                    await Store(targetDatabase, targetFc, featureBag, counter);
                                                }
                                            }
                                        }
                                    }

                                    #endregion Query all per Oid and Node
                                }
                                await Store(targetDatabase, targetFc, featureBag, counter);

                                await((AccessFDB)targetDatabase).CalculateExtent(targetFcName);
                            }
                        }

                        dsElement.Title = targetFc.Name;
                        ((DatasetElement)dsElement).Class = targetFc;
                    }

                    ((MapPersist)map).SetDataset(datasetId, targetFeatureDataset);
                    datasetId++;
                }
            }

            map.Compress();

            stream = new XmlStream("");
            stream.Save("MapDocument", doc);

            Console.WriteLine($"Write: { outFile }");
            stream.WriteStream(outFile);
            Console.WriteLine("succeeded...");
        }