Официальный сайт геоинформационной системы (ГИС) ObjectLandОфициальный сайт геоинформационной системы (ГИС) ObjectLand
  
 
ПОИСК ПО САЙТУ:
google.com
КАРТА САЙТА
 
главная / поддержка / форум
E-MAIL:ПАРОЛЬ: 
регистрация

Обсуждение

 Поиск объекта на карте на основе связанной табличной информации [ Роман Ларченко ]
Вторник, 7 сентября 2010, 06:19

На сайте в описании возможностей программы нашел
"поиск объекта на карте на основе связанной табличной информации "
Но прочитав справку раздел "Связь карт с таблицами", так и не нашел как это делается.
Укажите, пожалуйста, главу, где это описывается.
Нашел только как по объекту на карте посмотреть содержание табличной информации (тоесть ровно наоборот)

  [ Роман Ларченко ]
Вторник, 7 сентября 2010, 07:17

Все. Извиняюсь. Нашел кнопки "выделить" и "отобразить".
Аможет подскажете как через com-интерфейс это сделать. Хоть в какую сторону смотреть.

  [ Роман Ларченко ]
Вторник, 7 сентября 2010, 08:17

можете кинуть небольшой пример (на чем угодно) открытия карты и выделение объекта по ключу.
Например объект связан с таблицей. Инужно по данному значению из таблицы открыть карту, найти и выделить этот объект.

Дело в том, что принимается решение о покупке и надо быстро набросать тестовое приложение.

  [ ObjectLand Support ]
Вторник, 7 сентября 2010, 12:10

Подобные примеры смотрите на странице: http://www.objectland.ru/product/fordeveloper/

Напомню, что приложение ObjectLand Explorer работает только с версией 2.6 (вариант для 2.7 в разработке).

  [ Роман Ларченко ]
Среда, 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, 02:57

Спасибо!

  [ Роман Ларченко ]
Понедельник, 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.

Ответить

Знаком «*» отмечены обязательные для заполнения поля.
Ваше имя:  *
Адрес электронной почты:  
Тема:  *
Сообщение:
 *
Подтверждение:
(не требуется для зарегистрированных пользователей)
 *
 



Copyright © 1999–2012 ГИС ObjectLand
ГИС ObjectLand ® ЗАО «Радом-Т»
Информация о лицензировании
главная | о продукте | скачать | купить | поддержка | новости