Страница 1 из 1
Программное создание SHP-слоя
Добавлено: 21 июн 2011, 14:38
BodyZ
Доброго времени суток.
Подскажите пожалуйста как можно программно создать новый SHP-слой.
При этом систему координат скопировать из имеющегося произвольного слоя.
Заранее спасибо
Re: Программное создание SHP-слоя
Добавлено: 21 июн 2011, 17:58
Дмитрий Барышников
Вам шейп-файл создать надо или слой в карте (ArcMap)? С использование ArcObject или без?
Re: Программное создание SHP-слоя
Добавлено: 22 июн 2011, 23:38
BodyZ
Доброго время суток.
Спасибо что откликнулись
Надо конечно сделать слой

, но если бы он сохранялся как Shp-файл и Lyr.
То так, был бы мой вопрос полным.
Заранее Вам спасибо. Жду Вашей помощи.

Re: Программное создание SHP-слоя
Добавлено: 23 июн 2011, 07:53
Дмитрий Барышников
Re: Программное создание SHP-слоя
Добавлено: 24 июн 2011, 13:43
BodyZ
Большое Вам спасибо за помощь.
Но я не могу понять как работать с IFeatureWorkspace?
Они там могут быть унаследованы двумя способами.
Подскажите где можно почитать об этом.
Заранее спасибо
Re: Программное создание SHP-слоя
Добавлено: 24 июн 2011, 16:39
Дмитрий Барышников
Re: Программное создание SHP-слоя
Добавлено: 26 июн 2011, 18:18
BodyZ
Большое спасибо
Буду пробовать
Re: Программное создание SHP-слоя
Добавлено: 01 авг 2011, 19:34
BodyZ
Доброго времени суток.
Простите за долгое молчание
Подскажите пожалуйста от какого объекта (или каким образом) получается входной параметр
IWorkspace workspace в этом примере:
http://resources.esri.com/help/9.3/arcg ... 3DF855.htm
В моем случае мне необходимо создать:
1. Базу геоданных на локальной машине;
2. В созданной базе геоданных создать и заполнить значениями Shp-файл (Точечных объектов);
3. Открыть созданный Shp-файл в проекте ArcMap в виде слоя;
4. В открытом слое задать необходимые условные обозначения точкам, в зависимости от параметра.
И все это желательно проделать в автоматическом режиме.
Возможно ли это?
Заранее спасибо за ответ.

Re: Программное создание SHP-слоя
Добавлено: 06 авг 2011, 22:20
Дмитрий Барышников
Re: Программное создание SHP-слоя
Добавлено: 18 авг 2011, 14:41
BodyZ
BodyZ писал(а):Доброго времени суток.
Простите за долгое молчание
Подскажите пожалуйста от какого объекта (или каким образом) получается входной параметр
IWorkspace workspace в этом примере:
http://resources.esri.com/help/9.3/arcg ... 3DF855.htm
В моем случае мне необходимо создать:
1. Базу геоданных на локальной машине;
2. В созданной базе геоданных создать и заполнить значениями Shp-файл (Точечных объектов);
3. Открыть созданный Shp-файл в проекте ArcMap в виде слоя;
4. В открытом слое задать необходимые условные обозначения точкам, в зависимости от параметра.
И все это желательно проделать в автоматическом режиме.
Возможно ли это?
Заранее спасибо за ответ.

Пункт 1-3 реализовал таким образом
Код: Выделить всё
public override void OnClick()
{
// TODO: Add Command_Body_Test.OnClick implementation
//MessageBox.Show("Автоматическое добавление слоя");
IMxDocument pMxDocument = m_application.Document as IMxDocument;
IMap pLocalMap;
IMaps pMaps = pMxDocument.Maps;
ILayer pLayer;
for (int i = 0; i <= pMaps.Count - 1; i++)
{
pLocalMap = pMaps.get_Item(i);
string s1 = pLocalMap.Name;
IEnumLayer pEnumLayer = pLocalMap.get_Layers(null, true);
pEnumLayer.Reset();
pLayer = pEnumLayer.Next();
Form_Select_Layer form = new Form_Select_Layer(m_application);
form.ShowDialog();
if (form.IsNeedCopy)
{
while (pLayer.Name != form.SelectedLayerName)//"Комерційні")
pLayer = pEnumLayer.Next();
// Создание БАЗЫ геоданных
try
{
//Клонирование коллекции колонок
IFieldsEdit pNewFields = new FieldsClass();
IClone pCloneField;
IField pNewField;
IFeatureClass pFClass = (pLayer as IFeatureLayer).FeatureClass;
for (int k = 0; k < pFClass.Fields.FieldCount; k++)
{
pCloneField = (IClone)pFClass.Fields.get_Field(k);
pNewField = (IField)pCloneField.Clone();
pNewFields.AddField(pNewField);
}
// END //Клонирование коллекции колонок
//Клонирование системы координат из исходного слоя
ISpatialReference pSR;
IGeoDataset pGeoDS = (IGeoDataset)pLayer;
IClone pClone = pGeoDS.SpatialReference as IClone;
pSR = (ISpatialReference)pClone.Clone();
// END //Клонирование системы координат из исходного слоя
// Создание базы геоданных
IWorkspace pWorkSpace = CreateFileGdbWorkspace("D:\\Gis\\Testing\\", "SampleBodyTest.gdb");
// END // Создание базы геоданны
// Создание набора данных в базе геоданных
IFeatureDataset ftDataSet = CreateFeatureDataset(pWorkSpace, "DatasetBody", pSR);
// END // // Создание набора данных в базе геоданных
// Создание SHP-файла в наборе данных
IFeatureClass ft_Class = CreateFeatureDatasetFeatureClass(ftDataSet, "body_featureclass", pNewFields, "premier");
// END // Создание SHP-файла в наборе данных
// Добавление созданого SHP-файла в проект
IFeatureLayer pNewLayer = new FeatureLayerClass();
pNewLayer.FeatureClass = ft_Class;
pNewLayer.Name = "добавление получилось";
pMxDocument.AddLayer(pNewLayer);
pMxDocument.ActiveView.Refresh();
// CopyShapFile();
// END // Добавление созданого SHP-файла в проект
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
// END // Создание БАЗЫ геоданных
}
}
MessageBox.Show("Слоев больше нет");
}
//++++++++++++++++
//Из документации
//++++++++++++++++
//Функция создания базы геоданных
public IWorkspace CreateFileGdbWorkspace(string PathToGDB, string NameGDB)
{
try
{
// Instantiate a file geodatabase workspace factory and create a file geodatabase.
// The Create method returns a workspace name object.
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
string NewName = NameGDB;// +DateTime.Now.Date.ToString() + DateTime.Now.Hour.ToString();
IWorkspaceName workspaceName = workspaceFactory.Create(PathToGDB,
NewName,
null,
0);
// Cast the workspace name object to the IName interface and open the workspace.
IName name = (IName)workspaceName;
IWorkspace workspace = (IWorkspace)name.Open();
return workspace;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return null;
}
}
//Не понятно откуда брать параметр --> workspace????
public IFeatureDataset CreateFeatureDataset(IWorkspace workspace, string fdsName, ISpatialReference fdsSR)
{
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
return featureWorkspace.CreateFeatureDataset(fdsName, fdsSR);
}
// End // //Функция создания базы геоданных
public IFeatureClass CreateFeatureDatasetFeatureClass(IFeatureDataset featureDataset,
String featureClassName, IFields fieldsCollection, String shapeFieldName)
{
IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();
IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;
// Use IFieldChecker to create a validated fields collection.
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields validatedFields = null;
fieldChecker.ValidateWorkspace = featureDataset.Workspace;
fieldChecker.Validate(fieldsCollection, out enumFieldError, out validatedFields);
// The enumFieldError enumerator can be inspected at this point to determine
// which fields were modified during validation.
IFeatureClass featureClass = featureDataset.CreateFeatureClass(featureClassName,
validatedFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID,
esriFeatureType.esriFTSimple, fcDesc.ShapeFieldName, "");
return featureClass;
}
Подскажите пожалуйста, каким образом можно изменить значки для точечных объектов,
в зависимости от атрибутивных данных?
Заранее спасибо
Re: Программное создание SHP-слоя
Добавлено: 19 авг 2011, 13:17
Дмитрий Барышников
Re: Программное создание SHP-слоя
Добавлено: 18 сен 2011, 20:14
BodyZ
Большое спасибо.
По ссылке все нашел что надо.
Там же есть и отличные куски готового кода.
