Страница 1 из 1
Программное управление содержанием слоя
Добавлено: 14 мар 2011, 12:38
Tereha
arcgis engine+c#+.Net
Имеется таблица данных с полями координат XY. В arcgis Desktop можно быстро отобразить данные на карте - Инструменты-> Данные XY. Если этими данными должны пользоваться все пользователи сети с возможностью выполнения выборки данных по запросам - нужно экспортировать данные и сохранить их в виде слоя. Но тогда неясно как изменения в исходной таблице данных сразу отображались на карте.
В связи с этим вопросы
1. Как добавлять данные в существующий слой программно?
2. Как на лету сформировать XY слой программно ? т.е. повторить функцианал arcgis Desctop по отображению на карте XY данных.
Представляется, что предпочтительнее формировать слой в инструментарии arcgis desctop - выбрать символы и другие свойства слоя. А программно только заполнять атрибутивную таблицу, а еще лучше просто написать процедуру типа "Отобразить XY данные по след строке запроса".
Спасибо за любые ссылки !
Re: Программное управление содержанием слоя
Добавлено: 14 мар 2011, 15:25
Дмитрий Барышников
http://resources.esri.com/help/9.3/arcg ... tLayer.htm
Только вместо текстового файла у вас будет результат выборки из базы данных.
Re: Программное управление содержанием слоя
Добавлено: 21 мар 2011, 13:34
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.
Re: Программное управление содержанием слоя
Добавлено: 21 мар 2011, 15:16
Дмитрий Барышников
У вас в первом примере ESRI.ArcGIS.Geodatabase.IFeatureCursor searchCursor = featureClass.Search(qFilter, false); возвращает курсор только для чтения.
Для изменения используйте метод Update
см.
http://forums.esri.com/Thread.asp?c=159&f=1707&t=217138
Только вам маршалинг не нужен наверное.