public void SupplyResource(RefugeeSite site)
        {
            do
            {
                IFeatureClass facilityClass  = _repositoryCol.FeatureClass;
                IQueryFilter  facilityFilter = _repositoryCol.ValidFilter();

                if (facilityClass.FeatureCount(facilityFilter) == 0)
                {
                    LogHelper.Error("没有足够的" + site.ResourceName());
                    break;
                }
                _roadNetwork.SetFacilities(facilityClass, facilityFilter);

                IQueryFilter  siteFilter = _refugeSiteCol.SiteFilter(site);
                IFeatureClass siteClass  = _refugeSiteCol.FeatureClass;
                _roadNetwork.SetIncidents(siteClass, siteFilter);

                SupplyRoute route = _roadNetwork.FindRoute();
                if (route == null)
                {
                    LogHelper.Error("剩余的" + site.ResourceName() + "因为路径不通无法配送");
                    break;
                }
                Repository repo   = _repositoryCol.FindRepoByID(route.RepoID);
                int        amount = 0;
                if (repo.Remain >= site.ResourceInNeed)
                {
                    amount = site.ResourceInNeed;
                }
                else
                {
                    amount = repo.Remain;
                }

                _repositoryCol.SupplyResource(repo, amount);
                site.ReplenishResource(amount);
                //_refugeSiteCol.ReplenishResource(site, amount);

                route.SetMessagePara(site.ResourceName(), amount, site.ResourceUnit());
                route.IncidentID = site.OID;

                AddRouteFeature(route);
                _siteRoutes.Add(route);
            }while (site.ResourceInNeed > 0);

            IFeatureClassManage manage = this._outputFC as IFeatureClassManage;

            manage.UpdateExtent();
        }
        private void AddRouteFeature(SupplyRoute route)
        {
            int idxResource   = this._outputFC.FindField(SupplyRoute.ResourceField);
            int idxAmount     = this._outputFC.FindField(SupplyRoute.AmountField);
            int idxUnit       = this._outputFC.FindField(SupplyRoute.UnitField);
            int idxRepoID     = this._outputFC.FindField(SupplyRoute.RepoIDField);
            int idxIncidentID = this._outputFC.FindField(SupplyRoute.IncidentIDField);

            IFeature f = _outputFC.CreateFeature();

            f.set_Value(idxAmount, route.Amount);
            f.set_Value(idxResource, route.Resource);
            f.set_Value(idxUnit, route.Unit);
            f.set_Value(idxRepoID, route.RepoID);
            f.set_Value(idxIncidentID, route.IncidentID);

            f.Shape = route.Route;

            f.Store();
        }
Exemplo n.º 3
0
        internal SupplyRoute FindRoute()
        {
            IFeatureCursor cursor = null;

            try
            {
                IGPMessages gpMessages = new GPMessagesClass();
                SetSolverSettings(this.Attribute);

                if (!m_NAContext.Solver.Solve(m_NAContext, gpMessages, null))
                {
                }

                IFeatureClass routeClass = m_NAContext.NAClasses.get_ItemByName(OUTPUTCLASSNAME) as IFeatureClass;

                cursor = routeClass.Search(null, false);
                IFeature fcRoute = cursor.NextFeature();
                if (fcRoute == null)
                {
                    return(null);
                }

                IPolyline geoRoute           = fcRoute.ShapeCopy as IPolyline;
                IPoint    facilityQueryPoint = geoRoute.FromPoint;

                int         id          = FindFacilityID(facilityQueryPoint);
                SupplyRoute resultRoute = new SupplyRoute()
                {
                    RepoID = id, Route = geoRoute
                };
                return(resultRoute);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ComReleaser.ReleaseCOMObject(cursor);
            }
        }