Программное создание SHP-слоя

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Программное создание SHP-слоя

Сообщение BodyZ »

Доброго времени суток.
Подскажите пожалуйста как можно программно создать новый SHP-слой.
При этом систему координат скопировать из имеющегося произвольного слоя.
Заранее спасибо
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программное создание SHP-слоя

Сообщение Дмитрий Барышников »

Вам шейп-файл создать надо или слой в карте (ArcMap)? С использование ArcObject или без?
BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

Доброго время суток. :wink:
Спасибо что откликнулись :P
Надо конечно сделать слой :!: , но если бы он сохранялся как Shp-файл и Lyr. :?:
То так, был бы мой вопрос полным.
Заранее Вам спасибо. Жду Вашей помощи. :D
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программное создание SHP-слоя

Сообщение Дмитрий Барышников »

BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

Большое Вам спасибо за помощь. :D
Но я не могу понять как работать с IFeatureWorkspace? :oops:
Они там могут быть унаследованы двумя способами.
Подскажите где можно почитать об этом.
Заранее спасибо
BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

Большое спасибо :D
Буду пробовать
BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

Доброго времени суток.
Простите за долгое молчание :wink:
Подскажите пожалуйста от какого объекта (или каким образом) получается входной параметр
IWorkspace workspace в этом примере:
http://resources.esri.com/help/9.3/arcg ... 3DF855.htm
В моем случае мне необходимо создать:
1. Базу геоданных на локальной машине;
2. В созданной базе геоданных создать и заполнить значениями Shp-файл (Точечных объектов);
3. Открыть созданный Shp-файл в проекте ArcMap в виде слоя;
4. В открытом слое задать необходимые условные обозначения точкам, в зависимости от параметра.
И все это желательно проделать в автоматическом режиме. :roll:
Возможно ли это? :?:
Заранее спасибо за ответ. :)
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программное создание SHP-слоя

Сообщение Дмитрий Барышников »

Все возможно
Для получения IWorkspace см.
http://resources.esri.com/help/9.3/arcg ... xample.htm
http://edndoc.esri.com/arcobjects/9.0/c ... actory.htm

Уточните какую базу вы создавать хотите enterprise, personal или file?

По созданию шейпа в базе см.
http://edndoc.esri.com/arcobjects/9.2/N ... 1d4fb6.htm
BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

BodyZ писал(а):Доброго времени суток.
Простите за долгое молчание :wink:
Подскажите пожалуйста от какого объекта (или каким образом) получается входной параметр
IWorkspace workspace в этом примере:
http://resources.esri.com/help/9.3/arcg ... 3DF855.htm
В моем случае мне необходимо создать:
1. Базу геоданных на локальной машине;
2. В созданной базе геоданных создать и заполнить значениями Shp-файл (Точечных объектов);
3. Открыть созданный Shp-файл в проекте ArcMap в виде слоя;
4. В открытом слое задать необходимые условные обозначения точкам, в зависимости от параметра.
И все это желательно проделать в автоматическом режиме. :roll:
Возможно ли это? :?:
Заранее спасибо за ответ. :)
Пункт 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;
        }
Подскажите пожалуйста, каким образом можно изменить значки для точечных объектов,
в зависимости от атрибутивных данных?
Заранее спасибо
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программное создание SHP-слоя

Сообщение Дмитрий Барышников »

BodyZ
Участник
Сообщения: 70
Зарегистрирован: 04 сен 2009, 16:47
Репутация: 1

Re: Программное создание SHP-слоя

Сообщение BodyZ »

Большое спасибо. :D
По ссылке все нашел что надо.
Там же есть и отличные куски готового кода. :!:
Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей