| Обсуждение |
| Поиск объекта на карте на основе связанной табличной информации [ Роман Ларченко ]Вторник, 7 сентября 2010, 06:19
На сайте в описании возможностей программы нашел
"поиск объекта на карте на основе связанной табличной информации "
Но прочитав справку раздел "Связь карт с таблицами", так и не нашел как это делается.
Укажите, пожалуйста, главу, где это описывается.
Нашел только как по объекту на карте посмотреть содержание табличной информации (тоесть ровно наоборот) |
|
| [ Роман Ларченко ]Вторник, 7 сентября 2010, 07:17
Все. Извиняюсь. Нашел кнопки "выделить" и "отобразить".
Аможет подскажете как через com-интерфейс это сделать. Хоть в какую сторону смотреть. |
|
| [ Роман Ларченко ]Вторник, 7 сентября 2010, 08:17
можете кинуть небольшой пример (на чем угодно) открытия карты и выделение объекта по ключу.
Например объект связан с таблицей. Инужно по данному значению из таблицы открыть карту, найти и выделить этот объект.
Дело в том, что принимается решение о покупке и надо быстро набросать тестовое приложение. |
|
| [ ObjectLand Support ]Вторник, 7 сентября 2010, 12:10
|
| [ Роман Ларченко ]Среда, 8 сентября 2010, 09:33
Я нашел примеры с использованием набора записей.
А если не открывать его, например мне известен номер объекта - скажем 10.
Открыл окно темы. Возможно просто выделить там объект с номером 10? |
|
| [ ObjectLand Support ]Среда, 8 сентября 2010, 11:23
|
| [ Роман Ларченко ]Четверг, 9 сентября 2010, 03:23
Делаю так
strGDBPath="C:\CLR\City"
THEME_NAME ="Тема 1"
LAYER_NAME = "Строения"
FEATURETYPE_NAME = "Здание"
THEME_WIDTH = 400
THEME_HEIGHT = 400
Dim GDB,objGDB,objGDBTheme,objGDBLayer,objGDBFeatureType,objGDBFeaturesetCondition,objGDBThemeBrowser
Set GDB=CreateObject("GDBEngine.Application")
Set objGDB=GDB.OpenGDB(strGDBPath,1,"","","")
Set objGDBTheme = objGDB.Themes(THEME_NAME)
Set objGDBLayer = objGDBTheme.Layers(LAYER_NAME)
Set objGDBFeatureType = objGDBLayer.FeatureTypes(FEATURETYPE_NAME)
Set objGDBFeaturesetCondition = objGDBTheme.CreateFeaturesetCondition(0,7)
objGDBFeaturesetCondition.Layer=objGDBLayer
objGDBFeaturesetCondition.FeatureNumbers=1039
objGDBTheme.FeaturesetConditions.Append(objGDBFeaturesetCondition)
Set objGDBThemeBrowser = GDB.CreateThemeBrowser(objGDBTheme)
objGDBThemeBrowser.SetPosition 10, 10
objGDBThemeBrowser.SetSize 600, 600
objGDBThemeBrowser.Visible=true
objGDBThemeBrowser.Active=true
MsgBox 1
Тема открылась, но никакой объект не выделен.
Но если откруть в окошке связаннуб таблицу, выделить запись с кодом 1039, и потом нажаь кнопочку "выделить связанные объекты", то нужное здание выделяется.
Что я делаю не так? Помогите пожалуйста. |
|
| [ Роман Ларченко ]Четверг, 9 сентября 2010, 07:43
Число 1039 это значения поля связи.
Уже два дня бьюсь... Штудирую справку и примеры, но ничего сделать не могу. Не ожидал, что это окажется такой нетривиальной задачей.. |
|
| [ Objectland Support ]Четверг, 9 сентября 2010, 12:51
Вы используете значение поля таблицы в качестве номера геометрии, что неправильно. Вам надо:
1. Построить выборку, содержащую запись (записи) таблицы с заданным значением поля (полей) [пример 15].
2. Создать критерий селекции геометрий по выборке, полученной на предыдущем шаге [пример 45, критерий 5].
3. Установить критерий селекции геометрий в тему и открыть ее. |
|
| [ Роман Ларченко ]Пятница, 10 сентября 2010, 06:58
То есть просто по внутреннему номеру, не открывая таблиц и выборок невозможно? |
|
| [ Роман Ларченко ]Пятница, 10 сентября 2010, 09:13
Решил для удобства в vb.net
Так тоже не работает! Открывается тема, но объект не выделяется?
или нужно обязательно по запросу?
Module Module1
Sub Main()
Dim strGDBPath As String = "C:\CLR\City"
Dim THEME_NAME As String = "Тема 1"
Dim LAYER_NAME As String = "Строения"
Dim FEATURETYPE_NAME As String = "Здание"
Dim THEME_WIDTH As Integer = 400
Dim THEME_HEIGHT As Integer = 400
Dim gdb As GDBEngine, objGDB As GDBGeoDatabase, objGDBTheme As GDBTheme, _
objGDBLayer As GDBLayer, objGDBFeatureType As GDBFeatureType, _
objGDBFeaturesetCondition As GDBFeaturesetCondition
Dim objGDBThemeBrowser As GDBThemeBrowser
gdb = New GDBEngine
objGDB = gdb.OpenGDB(strGDBPath, 1, "", "", "")
objGDBTheme = objGDB.Themes.Item(THEME_NAME)
objGDBLayer = objGDBTheme.Layers.Item(LAYER_NAME)
objGDBFeatureType = objGDBLayer.FeatureTypes.Item(FEATURETYPE_NAME)
objGDBFeaturesetCondition = objGDBTheme.CreateFeaturesetCondition( _
GdbLogicalOps.gdbLogicalNone, _
GdbFeaturesetOperations.gdbFeaturesetByTable)
objGDBFeaturesetCondition.Layer = objGDBLayer
Dim objGDBTable As GDBTable
objGDBTable = objGDB.ExternalDatabases.Item("TestDB").Tables.Item(16)
objGDBFeaturesetCondition.Table = objGDBTable
objGDBFeaturesetCondition.FeatureType = objGDBFeatureType
objGDBTheme.FeaturesetConditions.Append(objGDBFeaturesetCondition)
objGDBThemeBrowser = gdb.CreateThemeBrowser(objGDBTheme)
objGDBThemeBrowser.SetPosition(10, 10)
objGDBThemeBrowser.SetSize(600, 600)
objGDBThemeBrowser.Visible = True
objGDBThemeBrowser.Active = True
Console.ReadKey()
End Sub
End Module |
|
| [ Роман Ларченко ]Пятница, 10 сентября 2010, 10:08
Переделал на запрос - ничего не изменилось. В таблице (и в выборке), только одна запись, которая связана с объектом на этой теме.
Тема открывается, но объект не выделяется.
Imports GDBEngineLib
Module Module1
Sub Main()
Dim strGDBPath As String = "C:\CLR\City"
Dim THEME_NAME As String = "Тема 1"
Dim LAYER_NAME As String = "Строения"
Dim FEATURETYPE_NAME As String = "Здание"
Dim THEME_WIDTH As Integer = 400
Dim THEME_HEIGHT As Integer = 400
Dim gdb As GDBEngine, objGDB As GDBGeoDatabase, objGDBTheme As GDBTheme, _
objGDBLayer As GDBLayer, objGDBFeatureType As GDBFeatureType, _
objGDBFeaturesetCondition As GDBFeaturesetCondition
Dim objGDBThemeBrowser As GDBThemeBrowser
gdb = New GDBEngine
objGDB = gdb.OpenGDB(strGDBPath, 1, "", "", "")
objGDBTheme = objGDB.Themes.Item(THEME_NAME)
objGDBLayer = objGDBTheme.Layers.Item(LAYER_NAME)
objGDBFeatureType = objGDBLayer.FeatureTypes.Item(FEATURETYPE_NAME)
objGDBFeaturesetCondition = objGDBTheme.CreateFeaturesetCondition( _
GdbLogicalOps.gdbLogicalAnd, _
GdbFeaturesetOperations.gdbFeaturesetByQuery)
objGDBFeaturesetCondition.Layer = objGDBLayer
Dim testdb As GDBExternalDatabase = objGDB.ExternalDatabases.Item("TestDB")
Dim objGDBQuery As GDBQuery = testdb.Queries.Item("ttt")
objGDBFeaturesetCondition.Query = objGDBQuery
objGDBFeaturesetCondition.FeatureType = objGDBFeatureType
objGDBTheme.FeaturesetConditions.Append(objGDBFeaturesetCondition)
objGDBThemeBrowser = gdb.CreateThemeBrowser(objGDBTheme)
objGDBThemeBrowser.SetPosition(10, 10)
objGDBThemeBrowser.SetSize(600, 600)
objGDBThemeBrowser.Visible = True
objGDBThemeBrowser.Active = True
Console.ReadKey()
objGDB.Close()
gdb.Quit()
End Sub
End Module |
|
| [ Objectland Support ]Пятница, 10 сентября 2010, 13:51
После установки критерия селекции геометрий в тему нужно получить набор геометрий темы и установить его в качестве набора селектированных геометрий в окно просмотра темы (после создания окна просмотра темы):
objGDBThemeBrowser.Featureset = objGDBTheme.OpenFeatureset() |
|
| [ Роман Ларченко ]Понедельник, 13 сентября 2010, 05:32
Можно еще один вопрос?
Хотел добавить, чтоб после открытия темы, окно центрировалось на выделенный объект.
Делаю так
objGDBThemeBrowser.ExecuteCommand(GdbBrowserCommands.gdbBrowserCmdFeaturesetShowAll)
Выдает ошибку
"window" not understood
Если же в открытом окне выбрать меню "Селекция\Показать все", то все нормально центрируется.
Делал тоже самое в c++builder
objGDBThemeBrowser.OleFunction("ExecuteCommand",29);
Там все нормально срабатывет, если этот объект в видимых пределах окна.
Если он за границей окна, то выдает ошибку. Но команда меню "Селекция\паказать все" все равно нормально срабатывает.
Как добиться эффекта выполенния команды "Селекция\Показать все"?
Я выполняю не ту команду? |
|
| [ Роман Ларченко ]Понедельник, 13 сентября 2010, 05:40
Уточнил. В c++builder ошибка выдается тоже в любом случае. |
|
| [ Роман Ларченко ]Понедельник, 13 сентября 2010, 05:53
Все! Нашел. Извняюсь за беспокойство.
Dim feature As GDBFeature = objGDBThemeBrowser.Featureset.Feature
objGDBThemeBrowser.Theme.WindowPosToFeature(feature, 1, 1) |
|
| [ Александр ]Среда, 19 января 2011, 19:03
Немножко поздно, но все же есть вопросы по данной теме.
Пробовал делать как описано выше.
Результат не радует.
У меня на С# возникают следующая проблема:
я знаю внутренний номер объекта.
создал выборку в которой должен выбираться этот объект (выборка сохраняется в ВБД нормально)
пытаюсь программно выделить объект, возникает ошибка "records pocket" not understood в строке GDBFeatureset fet = gdbTheme.OpenFeatureset(true);
не могу разобраться что не так делаю, все вроде из примера...
И еще вопрос, можно ли выделить как нибудь объект при просмотре темы, зная его внутренний номер и используя "совместный доступ" т.е.
objGDB = (GDBGeoDatabase)gdbEngine.OpenGDB(...,(int)GdbOpenModes.gdbOpenShared,"", "", ""); |
|
| [ Objectland Support ]Пятница, 21 января 2011, 10:34
Объект можно выделить в теме по его внутреннему номеру с помощью критерия селекции (выше как раз есть пример его использования). Почитайте описание метода Theme::CreateFeaturesetCondition (http://www.objectland.ru/support/doc/comapi/Theme_CreateSelectionCondition.html) и обратите внимание на операцию селекции gdbFeaturesetByFeatureNumbers.
P.S. Доступ к ГБД никакой роли не играет при селекции геометрий. |
|
| [ Александр ]Пятница, 4 февраля 2011, 10:43
Спасибо большое за направление на путь истинный. Почти все заработала.
Возникла проблема с командной "Селекция\Показать все" в C#.
objGDBThemeBrowser.ExecuteCommand(GdbBrowserCommands.gdbBrowserCmdFeaturesetShowAll); - работате, но постоянно выдает исключение "stack overflow".
GDBFeature feature = objGDBThemeBrowser.Featureset.Feature;
objGDBThemeBrowser.Theme.WindowPosToFeature(feature, 1, 1); - в C# не работает или может я не в том месте вызываю её???
Код выглядит так:
objFeaturesetCondition.FeatureNumbers = objectID;
gdbThemeBrowser.Theme.FeaturesetConditions.Append(objFeaturesetCondition);
gdbThemeBrowser.Featureset = objTheme.OpenFeatureset(true);
GDBFeature feat = gdbThemeBrowser.Featureset.Feature;
if (feat != null)
gdbThemeBrowser.Theme.WindowPosToFeature(feat, 1, 1);
//feat не равен null, т.е. команда выше, срабатывает. проверял. но эффекта 0 |
|
| [ Objectland Support ]Понедельник, 7 февраля 2011, 17:29
Проверьте пожалуйста, что возвращает метод gdbThemeBrowser.Featureset.FeatureCount. Могу предположить, что возвращается 0 из-за того что в метод objTheme.OpenFeatureset(true) передается истина. В Вашем случае надо передавать false. Почитайте обязательно описание метода objTheme.OpenFeatureset. |
|
ОтветитьЗнаком «*» отмечены обязательные для заполнения поля. |
| |