Программное управление содержанием слоя

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Программное управление содержанием слоя

Сообщение Tereha »

arcgis engine+c#+.Net
Имеется таблица данных с полями координат XY. В arcgis Desktop можно быстро отобразить данные на карте - Инструменты-> Данные XY. Если этими данными должны пользоваться все пользователи сети с возможностью выполнения выборки данных по запросам - нужно экспортировать данные и сохранить их в виде слоя. Но тогда неясно как изменения в исходной таблице данных сразу отображались на карте.
В связи с этим вопросы
1. Как добавлять данные в существующий слой программно?
2. Как на лету сформировать XY слой программно ? т.е. повторить функцианал arcgis Desctop по отображению на карте XY данных.
Представляется, что предпочтительнее формировать слой в инструментарии arcgis desctop - выбрать символы и другие свойства слоя. А программно только заполнять атрибутивную таблицу, а еще лучше просто написать процедуру типа "Отобразить XY данные по след строке запроса".
Спасибо за любые ссылки !
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программное управление содержанием слоя

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

http://resources.esri.com/help/9.3/arcg ... tLayer.htm
Только вместо текстового файла у вас будет результат выборки из базы данных.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Программное управление содержанием слоя

Сообщение Tereha »

Я что- то не правильно делаю при обновлении слоя. При нажатии на кнопку "Обновить содержание слоя" , я сначала удаляю предыдущее содержимое

Код: Выделить всё

        public void clearSetOfFeatures() {

            ESRI.ArcGIS.Geodatabase.IQueryFilter qFilter = new ESRI.ArcGIS.Geodatabase.QueryFilter();
            qFilter.WhereClause = "";
            qFilter.SubFields = "name";

            ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = null;
            int indOfLayer = getIndexLayerByName("chs2011");
            ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = axTOCControl1.ActiveView.FocusMap.get_Layer(indOfLayer) as ESRI.ArcGIS.Carto.IFeatureLayer;
            ESRI.ArcGIS.Geodatabase.IFeatureCursor cursor = featureLayer.Search(qFilter, true);
            
            featureClass = featureLayer.FeatureClass;
            ESRI.ArcGIS.Geodatabase.IFeature feature =null;

            // Create a ComReleaser for cursor management.
            using (ESRI.ArcGIS.ADF.ComReleaser comReleaser = new ESRI.ArcGIS.ADF.ComReleaser())
            {
                // Create and manage a cursor.
                ESRI.ArcGIS.Geodatabase.IFeatureCursor searchCursor = featureClass.Search(qFilter, false);
                comReleaser.ManageLifetime(searchCursor);

                // Delete the retrieved features.

                while ((feature = searchCursor.NextFeature()) != null)
                {
                    {
                        feature.Delete();
                    }
                }
            }
        }
Затем в цикле, перебирающем все строки в моей таблице XY данных в MySQL базе, вызываю процедуру отображения очередной точки

Код: Выделить всё

        public void setEvent(db1DataSet.eventsRow row)
        {
            ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = null;
            int indOfLayer = getIndexLayerByName("chs2011");
            ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = axTOCControl1.ActiveView.FocusMap.get_Layer(indOfLayer) as ESRI.ArcGIS.Carto.IFeatureLayer;
            
            axTOCControl1.SelectItem(featureLayer);
            featureClass = featureLayer.FeatureClass;
            
            ESRI.ArcGIS.Geodatabase.IFeature feature = featureClass.CreateFeature();
            ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();
            point.X = row.X;
            point.Y = row.Y;
            feature.Shape = point;
            int i = feature.Fields.FindField("select");
            feature.set_Value(i, 1);
            i = feature.Fields.FindField("name");
            feature.set_Value(i, row.name);
            i = feature.Fields.FindField("event_type");
            feature.set_Value(i, row.event_type);

            i = feature.Fields.FindField("X");
            feature.set_Value(i, row.X);
            i = feature.Fields.FindField("Y");
            feature.set_Value(i, row.Y);

            //i = feature.Fields.FindField("id");
            //feature.set_Value(i, row.id);
            feature.Store();

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

Re: Программное управление содержанием слоя

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

У вас в первом примере ESRI.ArcGIS.Geodatabase.IFeatureCursor searchCursor = featureClass.Search(qFilter, false); возвращает курсор только для чтения.
Для изменения используйте метод Update
см. http://forums.esri.com/Thread.asp?c=159&f=1707&t=217138
Только вам маршалинг не нужен наверное.
Ответить

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

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

Сейчас этот форум просматривают: Semrush [Bot] и 9 гостей