Как получить высоту в точке (ArcGis Engine 9.3)
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Да это-то я видел... Только вот хочется головой об стенку биться... Все примеры на C#... Примеров на С++ нет. Попытка перевести примеры с C# на С++ пока успехом не увенчалась... В C# всё просто: самая первая строчка IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass(); не имеет реализации в С++. О RasterWorkspaceFactoryClass() C++ вообще ничего не знает. Просто RasterWorkspaceFactory() - полностью абстрактный и из него ничего нельзя создать...Трындец...
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Пока получается хоть что-то только по третьему варианту, т.е. когда растр уже включён в карту в качестве слоя. А как-нибудь можно идентифицировать автоматом, что данный слой именно растр??? А то я получаю число слоёв - их 26. И я-то знаю, что последний - это и есть растр высот. А если будет не последний? Как программно это определить?
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Пожалуйста вопросы не вперемежку, а по порядку. А то я не смогу Вам помочь.
На сколько я понял вопрос 1: Переписать на С++ строчку
Ответ:
http://edndoc.esri.com/arcobjects/9.0/A ... rsions.htm
И прекратите биться об стенку
На сколько я понял вопрос 1: Переписать на С++ строчку
Код: Выделить всё
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
Ответ:
Код: Выделить всё
IWorkspaceFactoryPtr workspaceFactory(CLSID_RasterWorkspaceFactory);
http://edndoc.esri.com/arcobjects/9.0/A ... rsions.htm
И прекратите биться об стенку

-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Messages
[BCC32 Error] ...cpp (76): E2285 Could not find a match for 'IWorkspaceFactoryPtr::TComInterface(const_GUID)'
Не понравился компилятору такой перевод с C# на С++
А если брать со страницы про перевод из VB в С++ второй вариант, тот, что "// if creating later than defined", то компилятор вроде как проглатывает, а вот компоновщик выдаёт Unresolved external...
[BCC32 Error] ...cpp (76): E2285 Could not find a match for 'IWorkspaceFactoryPtr::TComInterface(const_GUID)'
Не понравился компилятору такой перевод с C# на С++

А если брать со страницы про перевод из VB в С++ второй вариант, тот, что "// if creating later than defined", то компилятор вроде как проглатывает, а вот компоновщик выдаёт Unresolved external...
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Есть подозрение что у вас проект не настроен. Вы в чем программируете?
У меня в VisualStudio все работает. Примеры на С++ с сайта ESRI работают.
Подозреваю, что вы программируете в CBuilder. Если да, то ищите доки как правильно Engine прикрутить.
Т.к. IWorkspaceFactoryPtr автоматически создается препроцессором idl.
Еще можно вручную попробовать определить тип:
У меня в VisualStudio все работает. Примеры на С++ с сайта ESRI работают.
Подозреваю, что вы программируете в CBuilder. Если да, то ищите доки как правильно Engine прикрутить.
Т.к. IWorkspaceFactoryPtr автоматически создается препроцессором idl.
Еще можно вручную попробовать определить тип:
Спойлер
_COM_SMARTPTR_TYPEDEF(IWorkspaceFactory, __uuidof(IWorkspaceFactory));
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Так у меня в первом посте и написано, что пишу в RAD Studio 2010 на С++. Да, это продолжение сибилдера. Но подключал Engine точно так, как пишет народ в сети на форумах: создавал пустой проект типа Package. В него включал необходимый мне элемент ActiveX (ArcGis Engine), а потом инсталлировал его.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Вы выбрали долгий путь. В официальной документации нет примеров для RAD Studio 2010 на С++, только для Visual Studio. По RAD Studio я вам не помогу.
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Хех... Не было выбора... Таково требование: надо реализовать именно в CBuilder. RAD Studio 2010 выбрана как система, к которой ArcGis Engine прикручивается практически без проблем и глюков.Bishop писал(а):Вы выбрали долгий путь.
Вот только вопрос, может подскажете: когда прикручиваю Engine как ActiveX компоненты, то билдер ругается на пересечение OLE_HANDLE и Esrisystem_tlb::OLE_HANDLE. Я ручками переправлял там, где он ругался, именно на Esrisystem_tlb::OLE_HANDLE. Правильно ли я поступал?
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Я использую директиву import.
В принципе конструкцию libid:5E1F7BC3-67C5-4AEE-8EC6-C4B73AAC42ED можно заменить полным путем до olb файла (обычно лежат в папочке com).
Код: Выделить всё
//import esriSystem.olb
#import "libid:5E1F7BC3-67C5-4AEE-8EC6-C4B73AAC42ED" raw_interfaces_only raw_native_types no_namespace named_guids auto_rename exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")
//import esriSystemUI.olb
#import "libid:4ECCA6E2-B16B-4ACA-BD17-E74CAE4C150A" raw_interfaces_only raw_native_types no_namespace named_guids auto_rename exclude("OLE_HANDLE", "OLE_COLOR") exclude("IProgressDialog") rename("JProperty", "IGTDProperty") rename("ICommand", "IGTDCommand")
В принципе конструкцию libid:5E1F7BC3-67C5-4AEE-8EC6-C4B73AAC42ED можно заменить полным путем до olb файла (обычно лежат в папочке com).
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Этот код надо писать в том файле, в котором компилятор ошибки выдаёт??? Я написал...Что с этим кодом, что без него. Все те же ошибки и остались.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Это пример кода. Вам надо в директиве #import указать ваши olb файлы или их GUID. Если вы именно так и сделали, то значит ваш компилятор не знает директивы #import или не правильно с ней работает. Уже не в первый раз читаю что Borland плохо работает с COM от микрософт.
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Больше всего меня поражает вот что: до этого года 4 работал с SXF через mapAPI от Панорамы. Как там всё было великолепно.... Никаких тебе непонятных виртуальных классов, которые фиг знает почему не работают, ни прочей замудрёности, которой у ArcGis выше крыши, а главное - отличная функциональность и легкодоступная документация...
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
У меня вывих мозга... IRaster - это класс. IRaster2 - это интерфейс. Как тогда переписать из C# в С++ вот этот код:
IRaster2 raster2 = (IRaster2)raster;
где raster - экземпляр класса IRaster.
Пишу так:
IRaster2Ptr raster;
raster.CreateInstance(IID_IRaster2);
Пишу именно IID_IRaster2, потому как это единственное, что я смог найти в esriDataSourcesRaster_TLB.h похожее на Raster2. Но в ответ получаю от компоновщика "Unresolved external 'Esridatasourceraster_tlb::IID_IRaster2'
Вот как тут быть?
IRaster2 raster2 = (IRaster2)raster;
где raster - экземпляр класса IRaster.
Пишу так:
IRaster2Ptr raster;
raster.CreateInstance(IID_IRaster2);
Пишу именно IID_IRaster2, потому как это единственное, что я смог найти в esriDataSourcesRaster_TLB.h похожее на Raster2. Но в ответ получаю от компоновщика "Unresolved external 'Esridatasourceraster_tlb::IID_IRaster2'
Вот как тут быть?
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Как получить высоту в точке (ArcGis Engine 9.3)
По слухам всю программную модель для ESRI делали специалисты микрософт. Так что по поводу "кривости" тут еще не понятно к кому апеллировать.
У вас плохо с пониманием COM модели (http://edndoc.esri.com/arcobjects/8.3/G ... oToCOM.htm и http://edndoc.esri.com/arcobjects/8.3/G ... vAOCOM.htm). IRaster и IRaster2 это интерфейсы. А CoClass у них обоих один - Raster.
Код
лишен смысла. Как минимум надо так:
А правильнее с точки зрения приведения типов:
Код
тоже не корректный, т.к. coclass Raster не может создаваться на прямую (The Raster object may be obtained from a RasterLayer or RasterDataset, or it can be cocreated. См. http://edndoc.esri.com/arcobjects/8.3/c ... Raster.htm). Вернее конечно можно, но в специфических случаях, например, создание нового растра на диске.
С точки зрения обычного С++ вы пытаетесь инициализировать виртуальный класс (он же в "понятиях" микрософт - интерфейс), что не может быть - об этом и ошибка.
Вы не сможете программировать под ArcGIS пока не разберетесь с фундаментальными вещами - COM от микрософт.
Вы когда начинали с Панорамой разбираться разве не было трудностей?
В принципе ESRI всех двигает к программированию под нее на C#. Это "бархатный путь" - там нет интерфейсов и все проще. Программирование на С++ - это высший пилотаж, на нем можно сделать все и даже то, что не сделаешь с использованием С#.
У вас плохо с пониманием COM модели (http://edndoc.esri.com/arcobjects/8.3/G ... oToCOM.htm и http://edndoc.esri.com/arcobjects/8.3/G ... vAOCOM.htm). IRaster и IRaster2 это интерфейсы. А CoClass у них обоих один - Raster.
Код
Код: Выделить всё
IRaster2 raster2 = (IRaster2)raster;
лишен смысла. Как минимум надо так:
Код: Выделить всё
IRaster2* pRaster2 = (IRaster2*)pRaster;
А правильнее с точки зрения приведения типов:
Код: Выделить всё
IRaster2Ptr pRaster2(pRaster);
Код
Код: Выделить всё
IRaster2Ptr raster;
raster.CreateInstance(IID_IRaster2);
тоже не корректный, т.к. coclass Raster не может создаваться на прямую (The Raster object may be obtained from a RasterLayer or RasterDataset, or it can be cocreated. См. http://edndoc.esri.com/arcobjects/8.3/c ... Raster.htm). Вернее конечно можно, но в специфических случаях, например, создание нового растра на диске.
С точки зрения обычного С++ вы пытаетесь инициализировать виртуальный класс (он же в "понятиях" микрософт - интерфейс), что не может быть - об этом и ошибка.
Вы не сможете программировать под ArcGIS пока не разберетесь с фундаментальными вещами - COM от микрософт.
Что заставило уйти от Панорамы?Больше всего меня поражает вот что: до этого года 4 работал с SXF через mapAPI от Панорамы. Как там всё было великолепно.... Никаких тебе непонятных виртуальных классов, которые фиг знает почему не работают, ни прочей замудрёности, которой у ArcGis выше крыши, а главное - отличная функциональность и легкодоступная документация...
Вы когда начинали с Панорамой разбираться разве не было трудностей?
В принципе ESRI всех двигает к программированию под нее на C#. Это "бархатный путь" - там нет интерфейсов и все проще. Программирование на С++ - это высший пилотаж, на нем можно сделать все и даже то, что не сделаешь с использованием С#.
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 20 окт 2011, 11:25
- Репутация: 0
Re: Как получить высоту в точке (ArcGis Engine 9.3)
Ну, вообще это код C# и взят он с этой вот страницы:http://help.arcgis.com/en/sdk/10.0/arco ... 01v8000000
Я просто наверное неверно пояснил.
От Панорамы заставило уйти требование заказчика, что надо использовать шэйп-формат картBishop писал(а): Что заставило уйти от Панорамы?
Вы когда начинали с Панорамой разбираться разве не было трудностей?

Не знаю, но к сожалению, пока с шэйпом сложно. Особенно под ArcGis. Вон коллега взял что-то там...MapWinGis, что ли...так он уже высоту вытащил. Но и там, конечно, тоже свои сложности.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя