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