您的位置:首页 > 其它

创建ServiceArea

2016-04-15 10:39 405 查看
/// <summary>

/// Services the area.

/// </summary>

/// <param name="networkDataset">The network dataset.</param>

public void ServiceArea(INetworkDataset networkDataset)

{

log.WriteLog("开始创建ServiceArea...");

IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();

IWorkspace workspace = workspaceFactory.OpenFromFile(Functions.g_WorkSpacePath, 0);

IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;

CreateSolverContext(networkDataset);

if (!LoadLocations(featureWorkspace, Functions.g_Hospital))

{

log.WriteLog("LoadLocations失败!");

}

log.WriteLog("ServiceArea创建完成!");

}

/// <summary>

/// Geodatabase function: get network dataset

/// </summary>

/// <param name="networkDataset">Input network dataset</param>

/// <returns>DE network dataset</returns>

public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)

{

// Cast from the network dataset to the DatasetComponent

IDatasetComponent dsComponent = networkDataset as IDatasetComponent;

// Get the data element

return dsComponent.DataElement as IDENetworkDataset;

}

/// <summary>

/// Create NASolver and NAContext

/// </summary>

/// <param name="networkDataset">Input network dataset</param>

private void CreateSolverContext(INetworkDataset networkDataset)

{

if (networkDataset == null) return;

//Get the Data Element

IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);

INASolver naSolver = new NAServiceAreaSolverClass();

m_NAContext = naSolver.CreateContext(deNDS, naSolver.Name);

((INAContextEdit)m_NAContext).Bind(networkDataset, new GPMessagesClass());

}

/// <summary>

/// Loads the locations.

/// </summary>

/// <param name="featureWorkspace">The feature workspace.</param>

/// <param name="inputFacilities">The input facilities.</param>

/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>

private bool LoadLocations(IFeatureWorkspace featureWorkspace, string inputFacilities)

{

IFeatureClass inputFeatureClass = null;

try

{

inputFeatureClass = featureWorkspace.OpenFeatureClass(inputFacilities);

}

catch (Exception)

{

log.WriteLog("Specified input feature class does not exist");

return false;

}

INamedSet classes = m_NAContext.NAClasses;

INAClass naClass = classes.get_ItemByName("Facilities") as INAClass;

// delete existing locations, except barriers

naClass.DeleteAllRows();

// Create a NAClassLoader and set the snap tolerance (meters unit)

INAClassLoader naClassLoader = new NAClassLoaderClass();

naClassLoader.Locator = m_NAContext.Locator;

((INALocator3)naClassLoader.Locator).MaxSnapTolerance = 500;

naClassLoader.NAClass = naClass;

// Create field map to automatically map fields from input class to NAClass

INAClassFieldMap naClassFieldMap = new NAClassFieldMapClass();

naClassFieldMap.CreateMapping(naClass.ClassDefinition, inputFeatureClass.Fields);

naClassLoader.FieldMap = naClassFieldMap;

// Avoid loading network locations onto non-traversable portions of elements

INALocator3 locator = m_NAContext.Locator as INALocator3;

locator.ExcludeRestrictedElements = true;

locator.CacheRestrictedElements(m_NAContext);

// load network locations

int rowsIn = 0;

int rowsLocated = 0;

IQueryFilter qf = new QueryFilterClass();

qf.WhereClause = "aaaaaaaaaaa";

naClassLoader.Load(inputFeatureClass.Search(qf, true) as ICursor, null, ref rowsIn, ref rowsLocated);

if (rowsLocated <= 0)

{

log.WriteLog("Facilities were not loaded from input feature class");

return false;

}

// Message all of the network analysis agents that the analysis context has changed

INAContextEdit naContextEdit = m_NAContext as INAContextEdit;

naContextEdit.ContextChanged();

return true;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: