Программно работать с feature и с featurelayer.

0 голосов
спросил 15 Апр, 09 от Garom (240 баллов) в категории Программные продукты Esri
Приветствую, господа.
Я пишу программу на 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). При запуске инструмента ошибок не возникает, но никакого слоя не появляется.Подскажите решение.

5 Ответы

0 голосов
ответил 19 Апр, 09 от Garom (240 баллов)

Проблему можно рассмотреть с другой стороны. В примере 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, или это папка программы? Какой файл, какого расширения должен в ней храниться?

0 голосов
ответил 23 Апр, 09 от Dido_kz1 (11,020 баллов)
    я бы так сделал бы, для создания фичеклассов сделал бы в акркаталоге инструмент( хотя стандарными средствами можно было бы) и в аркмапе добавлял созданные фичекласс
хотя можно и в аркмапе можно создать програмно,но ты говоришь,что без проблем создаешь, по моему ты забыл добавить созданный слои в аркмап :-)
при созданий ты же указываешь путь(Workspace),т.е локальная база или SDE база
0 голосов
ответил 26 Апр, 09 от Garom (240 баллов)

Когда я говорю, что ошибок не возникает, это просто означает, что 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 бывает трёх форматов: mdb, pdb, sde.
Формат mdb - формат access, встречается повсеместно и я не знаю, к какому именно файлу нужно прописывать путь.
Формат pdb - создаётся при компиляции моих программ, других файлов с тем же разрешением у меня на диске нет. Я прописывал путь к такому файлу моей программы, но ничего не изменилось.
Третий формат, sde у меня на компе не встречается.
Отсюда и вопросы: какая локальная база имеется в виду и в какую директорию прописывать путь? Фичерслой создаётся "с нуля", базы данных у него ещё нет. (Или имеется в виду какая-то другая база, не фичер слоя?)
Или другой вопрос: можно ли получать значение свойства workspace фичеркласса как-то иначе, не прописывая директорию?
0 голосов
ответил 28 Апр, 09 от Dido_kz1 (11,020 баллов)
когда я обычно СОМ объекты пишу, делаю так:
 Select Case pDataSet.Workspace.Type
            Case 1:
            Case 2:
            Case 3:
  End Select
1:(esriLocalDatabaseWorkspace) расширение mdb
2:(esriRemoteDatabaseWorkspace) расширение sde
3:( esriFileSystemWorkspace) расширение gdb
получать значение свойства workspace фичеркласса:
Dim My_FeatureClass As IFeatureClass
Dim My_FeatureLayer As IFeatureLayer
 
  Set My_FeatureLayer = MyLayer
  Set My_FeatureClass = My_FeatureLayer.FeatureClass
 
  Dim pDataSet As IDataset
  Set pDataSet = My_FeatureLayer.FeatureClass
примерно так :)
0 голосов
ответил 20 Май, 09 от Garom (240 баллов)
Благодарю за помощь, Dido_kz! С добавлением FeatureLayer на карту более-менее разобрался, но возник новый вопрос: как записать 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 по сути своей растровое изображение, а не какое-нибудь векторное!
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...