Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом_(Маша_Зайцева).doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.57 Mб
Скачать
    1. Реализация алгоритма чтения данных на примере формата esri shp с помощью AutoDesk Feature Data Objects

Подробное описание технологии доступа к данным с помощью провайдеров FDO представлено в приложении Б.

Рассмотрим пошаговое выполнение алгоритма на примере доступа к формату SHP, являющемся основным в распространённой ГИС ArcGIS:

  1. создать менеджер соединений, выбрать провайдер, создать соединение:

_connection = FeatureAccessManager.GetConnectionManager().CreateConnection("OSGeo.SHP");

  1. установить свойства соединения:

// filename – имя файла с данными формата SHP _connection.ConnectionInfo.ConnectionProperties.SetProperty("DefaultFileLocation", fileName);

_connection.Open();

  1. извлечь схему описания данных:

IDescribeSchema ids = _connection.CreateCommand(CommandType.CommandType_DescribeSchema) as IDescribeSchema;

_featureSchemaCollection = ids.Execute();

_defPropertyDefinitionCollection = _featureSchemaCollection[0].Classes[0].Properties;

  1. считать данные геометрических объектов:

List<PropertyValueCollection> result = new List<PropertyValueCollection>();

ISelect select = _connection.CreateCommand(CommandType.CommandType_Select) as ISelect;

var source = _connection.ConnectionInfo.ConnectionProperties.GetProperty("DefaultFileLocation");

select.SetFeatureClassName(Path.GetFileNameWithoutExtension(source));

var reader = select.Execute();

while (reader.ReadNext())

{

PropertyValueCollection collection = new PropertyValueCollection();

for (int i=0; i<_defPropertyDefinitionCollection.Count; ++i)

{

var ppc = _defPropertyDefinitionCollection[i];

PropertyValue value = null;

if (ppc.PropertyType == PropertyType.PropertyType_DataProperty)

{

var dataProp = _defPropertyDefinitionCollection[i] as DataPropertyDefinition;

switch(dataProp.DataType)

{

case DataType.DataType_Int32:

value = new PropertyValue(

ppc.Name, new Int32Value(reader.GetInt32(ppc.Name)));

break;

case DataType.DataType_String:

string nameValue = null;;

if (!reader.IsNull(ppc.Name))

nameValue = reader.GetString(ppc.Name);

value = new PropertyValue(ppc.Name, new StringValue(nameValue));

break;

}

}

else if (ppc.PropertyType == PropertyType.PropertyType_GeometricProperty)

{

value = new PropertyValue(ppc.Name, new GeometryValue(reader.GetGeometry(ppc.Name)));

}

collection.Add(value);

}

result.Add(collection);

}

return result;

  1. считать пространственные данные:

SpatialContextInfo info = new SpatialContextInfo();

IGetSpatialContexts context = _connection.CreateCommand(CommandType.CommandType_GetSpatialContexts) as IGetSpatialContexts;

ISpatialContextReader scReader = context.Execute();

if (scReader.ReadNext())

{

info.CoordinateSystem = scReader.GetCoordinateSystem();

info.CoordinateSystemWkt = scReader.GetCoordinateSystemWkt();

info.Description = scReader.GetDescription();

info.Extent = scReader.GetExtent();

info.ExtentType = scReader.GetExtentType();

info.Name = scReader.GetName();

info.XYTolerance = scReader.GetXYTolerance();

info.ZTolerance = scReader.GetZTolerance();

}

return info;

  1. закрыть соединение:

_connection.Close();

Таким же образом происходит единообразный доступ к другим форматам, поддерживаемым FDO, пространственные преобразования, обращения к системам координат. Единый способ доступа к данным позволяет реализовывать и собственные провайдеры. Примечательно, что внутренний формат хранения FDO – язык GML, выбранный за основу проектируемой системы, что снижает риски потери данных при конвертации.