Приветствую, господа.
Я пишу программу на C# и пытаюсь расставить feature на карту, используя featurelayer. Для этого я создаю свой инструмент в toolbox. По задумке, featurelayer добавляется на карту при событии OnCreate. featureclass создаю с нуля, программно задавая название класа, а также типы и названия его полей, включая FID.
IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
oidFieldEdit.Name_2 = "Key";
oidFieldEdit.AliasName_2= "FID";
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
Остальные поля задаю по анологии с примером. featureWorkspace беру так: объект Hook, поступающий в OnCreate интерпритирую как featureWorkspace (myFeatureWorkspace = Hook as IFeatureWorkspace). При запуске инструмента ошибок не возникает, но никакого слоя не появляется.Подскажите решение.
Программно работать с feature и с featurelayer.
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 13 апр 2009, 16:23
- Репутация: 0
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 13 апр 2009, 16:23
- Репутация: 0
Проблема с другого ракурса.
Проблему можно рассмотреть с другой стороны. В примере SimplePointPlugin featureWorkspace и featureClass открываются следующим образом:
//open the workspace
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(@"C:\Data\Data", 0);
//get a featureclass from the workspace
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("points");
В какую директорию надо указывать путь? Это какая-то папка в ArcGis, или это папка программы? Какой файл, какого расширения должен в ней храниться?
//open the workspace
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(@"C:\Data\Data", 0);
//get a featureclass from the workspace
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("points");
В какую директорию надо указывать путь? Это какая-то папка в ArcGis, или это папка программы? Какой файл, какого расширения должен в ней храниться?
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Программно работать с feature и с featurelayer.
mdb, pdb, sde судя по вот этому примеру
пристегивайтесь, турбулентность прямо по курсу
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 13 апр 2009, 16:23
- Репутация: 0
Re: Программно работать с feature и с featurelayer.
Благодарю. Буду пробовать.
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 13 апр 2009, 16:23
- Репутация: 0
Re: Программно работать с feature и с featurelayer.
Когда я говорю, что ошибок не возникает, это просто означает, что Visual Studio 2008 не выдаёт ошибок и компилирует, но безошибочность с точки зрения компилятора не даёт гарантии. К примеру, я могу прописать путь в директорию "C:\hjwywb:*-{" и это не вызовет у компилятора нареканий, ведь это же переменная типа string, а не число.
Я не забыл добавить слой на карту, проблема не в том. В событии onCreate на вход поступает объект hook, его я записываю в свойство m_hookHelper.hook(private IHookHelper m_hookHelper = null;m_hookHelper = new HookHelperClass(); - так я этот m_hookHelper задаю).
Потом, создаю фичеркласс и фичерслой, свойству .FeatureClass фичерслоя даю значение созданного мной фичеркласса. Затем у того же m_hookHelper беру свойство m_hookHelper.FocusMap и вызываю у него метод AddLayer, куда заношу в качестве переменной заданный мной фичерслой. Я уверен, что с этим m_hookHelper дело обстоит нормально, т.к. с его помощью могу вполне нормально рисовать программно, к примеру, всякие треугольники.
Думаю, скорее всего проблема в непонятно каком workspace фичеркласса. Workspace - это вобще база чего? Это база, в которой должен храниться мой будующий слой и её нужно создать самому, с заданием полей таким же, как у моего фичеркласса? Или это информация, указывающая на какие-то параметры ArcGIS, как, к примеру, какой-нибудь объект класса Display, один для всех запускаемых в ArcMap программ-модулей, значение которого задаётся программой ArcMap автоматически при работе?
Вы сказали, что workspace бывает трёх форматов: mdb, pdb, sde.
Формат mdb - формат access, встречается повсеместно и я не знаю, к какому именно файлу нужно прописывать путь. Опять-таки, искать эту базу в недрах папки Arcgis,
Формат pdb - создаётся при компиляции моих программ, других файлов с тем же разрешением у меня на диске нет. Я прописывал путь к такому файлу моей программы, но ничего не изменилось и не появилось.
Третий формат, sde у меня на компе не встречается.
Отсюда и вопросы: какая база имеется в виду и в какую директорию прописывать путь? Фичерслой создаётся "с нуля", базы данных у него ещё нет( её нужно создать, прежде чем запускать мой модуль?). Или имеется в виду какая-то другая база, не фичерслоя? Объясните кто-нибудь, прошу, что представляет из себя workspace(см. выше мои предположения). И можно ли получать значение свойства workspace фичеркласса как-то иначе, не прописывая директорию?
Я не забыл добавить слой на карту, проблема не в том. В событии onCreate на вход поступает объект hook, его я записываю в свойство m_hookHelper.hook(private IHookHelper m_hookHelper = null;m_hookHelper = new HookHelperClass(); - так я этот m_hookHelper задаю).
Потом, создаю фичеркласс и фичерслой, свойству .FeatureClass фичерслоя даю значение созданного мной фичеркласса. Затем у того же m_hookHelper беру свойство m_hookHelper.FocusMap и вызываю у него метод AddLayer, куда заношу в качестве переменной заданный мной фичерслой. Я уверен, что с этим m_hookHelper дело обстоит нормально, т.к. с его помощью могу вполне нормально рисовать программно, к примеру, всякие треугольники.
Думаю, скорее всего проблема в непонятно каком workspace фичеркласса. Workspace - это вобще база чего? Это база, в которой должен храниться мой будующий слой и её нужно создать самому, с заданием полей таким же, как у моего фичеркласса? Или это информация, указывающая на какие-то параметры ArcGIS, как, к примеру, какой-нибудь объект класса Display, один для всех запускаемых в ArcMap программ-модулей, значение которого задаётся программой ArcMap автоматически при работе?
Вы сказали, что workspace бывает трёх форматов: mdb, pdb, sde.
Формат mdb - формат access, встречается повсеместно и я не знаю, к какому именно файлу нужно прописывать путь. Опять-таки, искать эту базу в недрах папки Arcgis,
Формат pdb - создаётся при компиляции моих программ, других файлов с тем же разрешением у меня на диске нет. Я прописывал путь к такому файлу моей программы, но ничего не изменилось и не появилось.
Третий формат, sde у меня на компе не встречается.
Отсюда и вопросы: какая база имеется в виду и в какую директорию прописывать путь? Фичерслой создаётся "с нуля", базы данных у него ещё нет( её нужно создать, прежде чем запускать мой модуль?). Или имеется в виду какая-то другая база, не фичерслоя? Объясните кто-нибудь, прошу, что представляет из себя workspace(см. выше мои предположения). И можно ли получать значение свойства workspace фичеркласса как-то иначе, не прописывая директорию?
-
- Активный участник
- Сообщения: 194
- Зарегистрирован: 08 фев 2007, 23:29
- Репутация: 1
- Откуда: Симферополь
- Контактная информация:
Re: Программно работать с feature и с featurelayer.
Workspace - это папка или база данных в которой ведется редактирование
По вопросу
//пример создания шейпфайла
public static IFeatureClass createShapeFile(string Name, string Directory, esriGeometryType shapeType, ISpatialReference pSpR)
{
IWorkspaceFactory pWorkspaceFactory=new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFeatWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(Directory, 0);
IFields pFields=new FieldsClass();
IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields; ;
IField pField=new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2= "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDefEdit pGeometryDef = new GeometryDefClass();
pGeometryDef.GeometryType_2 = shapeType;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField);
return pFeatWorkspace.CreateFeatureClass(Name, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
}
public override void OnCreate(object hook)
{
if (hook == null)
return;
m_application = hook as IApplication;
pMXDoc = (IMxDocument)m_application.Document; //ссылка на документ
pEditor=(IEditor)m_application.FindExtensionByName("esriEditor.Editor"); //редактор
}
редактирование слоя
public override void OnClick()
{
//подгружаем слой
IFeatureLayer pFeatLayer=new FatureLayerClass();
pFeatLayer.FeatureClass=createShapeFile(......);
pMXDoc.FocusMap.add_Layer((ILayer) pFeatLayer);
//стартуем редактирование
IDataset pDataset=(IDataset) pFeatLayer.FeatureClass;
pEditor.StartEditing(pDataset.Workspace);
//создаем фич
IFeature pFeature=pFeatureLayer.FeatureClass.CreateFeature();
pFeature.Shape= .. //присвоение геометрии
pFeature.set_Value(pFeature.Fields.FindField("имя поля"),"значение"); //присвоение атрибутивки
pFeature.Store(); //сохранение фичи в слое
....
pEditor.StopEditing(true); //сохранение всех изменений
}
По вопросу
//пример создания шейпфайла
public static IFeatureClass createShapeFile(string Name, string Directory, esriGeometryType shapeType, ISpatialReference pSpR)
{
IWorkspaceFactory pWorkspaceFactory=new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFeatWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(Directory, 0);
IFields pFields=new FieldsClass();
IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields; ;
IField pField=new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2= "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDefEdit pGeometryDef = new GeometryDefClass();
pGeometryDef.GeometryType_2 = shapeType;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField);
return pFeatWorkspace.CreateFeatureClass(Name, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
}
public override void OnCreate(object hook)
{
if (hook == null)
return;
m_application = hook as IApplication;
pMXDoc = (IMxDocument)m_application.Document; //ссылка на документ
pEditor=(IEditor)m_application.FindExtensionByName("esriEditor.Editor"); //редактор
}
редактирование слоя
public override void OnClick()
{
//подгружаем слой
IFeatureLayer pFeatLayer=new FatureLayerClass();
pFeatLayer.FeatureClass=createShapeFile(......);
pMXDoc.FocusMap.add_Layer((ILayer) pFeatLayer);
//стартуем редактирование
IDataset pDataset=(IDataset) pFeatLayer.FeatureClass;
pEditor.StartEditing(pDataset.Workspace);
//создаем фич
IFeature pFeature=pFeatureLayer.FeatureClass.CreateFeature();
pFeature.Shape= .. //присвоение геометрии
pFeature.set_Value(pFeature.Fields.FindField("имя поля"),"значение"); //присвоение атрибутивки
pFeature.Store(); //сохранение фичи в слое
....
pEditor.StopEditing(true); //сохранение всех изменений
}
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 13 апр 2009, 16:23
- Репутация: 0
Как записать bitmap в растровое поле?
Благодарю вас за подробный ответ, Dorofeev!
У меня возник новый вопрос: как записать bitmap в растровое поле?
Среди полей featureclass я добавил поле растрового типа.
Мне нужно было сделать так, чтобы у всех объектов этого класса было определённое значение. Я нашёл пример "How to load a raster dataset to a raster attribute column in a feature class" и хотел изменить его так, чтобы вместо растрового набора, как оно было в примере, в rasterValue записывался нужный мне объект класса Bitmap. Но это мне не удалось. Удивительно, но bitmap нельзя записать в это поле, т.к. по мнению компилятора visual Studio для языка C#, bitmap нельзя преобразовать в raster или в rastervalue, приведя bitmap к их интерфейсам. Я искал какое-нибудь общее свойство, которое позволило бы информацию в bitmap'е занести в интересующее меня поле, но не нашёл. Но ведь это должно как-то производиться, ведь bitmap по сути своей растровое изображение, а не какое-нибудь векторное!
У меня возник новый вопрос: как записать bitmap в растровое поле?
Среди полей featureclass я добавил поле растрового типа.
Мне нужно было сделать так, чтобы у всех объектов этого класса было определённое значение. Я нашёл пример "How to load a raster dataset to a raster attribute column in a feature class" и хотел изменить его так, чтобы вместо растрового набора, как оно было в примере, в rasterValue записывался нужный мне объект класса Bitmap. Но это мне не удалось. Удивительно, но bitmap нельзя записать в это поле, т.к. по мнению компилятора visual Studio для языка C#, bitmap нельзя преобразовать в raster или в rastervalue, приведя bitmap к их интерфейсам. Я искал какое-нибудь общее свойство, которое позволило бы информацию в bitmap'е занести в интересующее меня поле, но не нашёл. Но ведь это должно как-то производиться, ведь bitmap по сути своей растровое изображение, а не какое-нибудь векторное!
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя