| Обсуждение |
| COM-Интерфейс [ Виктор Тараруев ] Воскресенье, 22 марта 2009, 19:19
Как встать на один и тот же объект в таблице MDKK System Table и в наборое геометрий objGDBFeatureset? |
|
| [ serge heart ] Понедельник, 23 марта 2009, 08:05
эээ... вопрос странный. что имеется ввиду?
в таблице хранятся записи, а в objGDBFeatureset - ссылки на объекты, - это не одно и то же =)
можно выбрав объект в Featureset, получить запись из таблицы (если он привязан).
например, для конкретного Feature
Table:=GeoDatabase.Tables.Item('MDKK System Table')
query:=GeoDatabase.CreateQuery(Table);
[далее открыть Featureset и позиционироваться на конкретном объекте, а потом...]
Recordset:=Feature.OpenRecordset(query)
можно выбрав запись в таблице, получить привязанные к ней объекты.
например, для конкретной записи
Table:=GeoDatabase.Tables.Item('MDKK System Table')
Recordset:=Table.OpenRecordset(true)
[далее позиционироваться на нужной записи, указать нужный featureType и...]
Featureset:=Recordset.OpenFeatureset(featureType, gdbScopeCurrentRecord, false)
ну и истественно нужно объявить все переменные
(в хэлпе все описано =) ) |
|
| [ ObjectLand Support ] Понедельник, 23 марта 2009, 12:05
Виктор, согласны с serge heart, если потребуется можем предоставить более подробный код. |
|
| [ Виктор Тараруев ] Среда, 25 марта 2009, 12:40
Задача в следующем: получить координаты участков по списку кадастровых номеров. У меня есть список кадастровых номеров участков привязанных на карте. В ПКЕГРЗ из таблицы OBJ я получаю значене поля GID_OBJ, в MDKK System Table данному полю соответствует GID. Первая часть легко решаема. А вот как по выбранной в MDKK System Table записи получить привязанный к ней объект не получается. Желательно код поподробнее и на VBA. Заранее спасибо. |
|
| [ [ ObjectLand Support ] ] Среда, 25 марта 2009, 15:40
Пример написан на Visual Basic 2008.
' Функция GetFeatureByAttribute находит геометрию с заданными атрибутами и возвращает ее номер.
' Для МДКК параметры для функции м.б. например такими:
' TableName = "MDKK System Table"
' FieldName = "GID"
' FieldValue = "{255E4A26-1C26-4FEC-828C-89076790BCD0}"
' ThemeName = "Квартал 01 02 38"
' LayerName = "Кварталы"
Public Function GetFeatureByAttribute(ByVal TableName As String, ByVal FieldName As String, ByVal FieldValue As String, ByVal ThemeName As String, ByVal LayerName As String) As Integer
Dim aQuery As GDBQuery
Dim aField As GDBField
Dim aSearchCondition As GDBFieldSearchCondition
Dim aRecordset As GDBRecordset
GetFeatureByAttribute = 0
' Строим выборку на основе заданной таблицы <TableName>.
' Путем задания критерия поиска в созданной выборке,
' находим набор записей таблицы поле <FieldName> которых содержит значение <FieldValue>.
' Далее работаем с первой записью набора.
aQuery = GeoDatabase.CreateQuery(GeoDatabase.Tables.Item(TableName))
aField = aQuery.Fields.Item(FieldName)
aSearchCondition = aField.CreateSearchCondition(GdbLogicalOps.gdbLogicalNone, GdbQueryRelations.gdbQueryRelEQ, FieldValue, "")
aQuery.FieldSearchConditions.Append(aSearchCondition)
aRecordset = aQuery.OpenRecordset
If (aRecordset.RecordCount = 0) Then Exit Function
aRecordset.MoveFirst()
Dim aLayer As GDBLayer
Dim bFeatureFound As Boolean = False
' Перебираем типы слоя <LayerName> до тех пор, пока набор геометрий для текущей записи набора записей
' будет не пустым. Возвращаем первую геометрию набора.
aLayer = GeoDatabase.Themes.Item(ThemeName).Layers.Item(LayerName)
For i As Integer = 1 To aLayer.FeatureTypes.Count
Dim aFeatureset As GDBFeatureset = Nothing
' Если тип не связан с таблицей на основе которой построен набор записей, то
' возникает исключение!
Try
aFeatureset = aRecordset.OpenFeatureset(aLayer.FeatureTypes.Item(i), GdbScopeTypes.gdbScopeCurrentRecord)
Catch e As COMException
If (e.ErrorCode And &HFFFF) <> 4034 Then Throw
End Try
If (aFeatureset IsNot Nothing) Then
If (aFeatureset.FeatureCount > 0) Then
bFeatureFound = True
aFeatureset.MoveFirst()
GetFeatureByAttribute = aFeatureset.Feature.Number
End If
aFeatureset.Close()
End If
If bFeatureFound Then Exit For
Next
aRecordset.Close()
End Function |
|
| [ Виктор Тараруев ] Четверг, 26 марта 2009, 10:52
Private Sub Main()
Dim objGDBEngine As IGDBEngine ' Ядро ObjectLand.
Dim objGDB As IGDBGeoDatabase ' ГБД.
Dim objGDBMap As IGDBMap ' Карта.
Dim objGDBTable As IGDBTable ' Таблица ГБД.
Dim objGDBRecordset As IGDBRecordset ' Получаемый набор записей.
Dim db As Database, S, BS As String, rst, ttt As Recordset, i, j As Long
Dim U As Long
Dim strGDBPath As String ' Путь и имя файла ГБД.
' Установка имени и пути к ГБД.
strGDBPath = "F:\VV\SQLBase_EGRZ\02\Район\" & GDB_NAME
' Создание ядра ObjectLand.
Set objGDBEngine = New GDBEngine
' Открытие ГБД с именем, определенным переменной strGDBPath,
' и атрибутами "Монопольно", "Чтение/Запись", "Без файла изменений".
Set objGDB = objGDBEngine.OpenGDB(strGDBPath, gdbOpenExclusive Or gdbOpenReadWrite Or _
gdbOpenNoChgFile, "", "", "")
' Получение карты из коллекции GeoDatabase::Maps.
Set objGDBMap = objGDB.Maps(MAP_NAME)
Dim objGDBLayer As IGDBLayer ' Участки
' Получение слоя из коллекции Map::Layers.
Set objGDBLayer = objGDBMap.Layers(LAYER_NAME)
Dim objGDBFeatureTypeArea As IGDBFeatureType ' Тип геометрий (площадной).
' Получение типа геометрий из коллекции Layer::FeatureTypes.
Set objGDBFeatureTypeArea = objGDBLayer.FeatureTypes(FEATURETYPE_AREA_NAME)
Dim objGDBFeatureset As GDBFeatureset ' Набор геометрий.
Dim objGDBFeature As IGDBFeature ' Получаемая геометрия.
Set objGDBTable = objGDB.Tables(TABLE_NAME)
Set objGDBRecordset = objGDBTable.OpenRecordset
ReDim XS(400), YS(400), XF(400), YF(400), X(40), Y(40), Metka_S(400), Metka_F(400)
' Запрос GID
BS = "SELECT OBJ.KN_OBJ, OBJ.GID_OBJ FROM Список LEFT JOIN OBJ ON " _
& "Список.[Кадастровый номер земельного участка] = OBJ.KN_OBJ " _
& "WHERE (((OBJ.KN_OBJ) Is Not Null And (OBJ.KN_OBJ)<>"") AND " _
& "((OBJ.GID_OBJ) Is Not Null And (OBJ.GID_OBJ)<>""));"
Set db = CurrentDb()
Set rst = db.OpenRecordset(BS)
rst.MoveFirst
While Not rst.EOF
objGDBRecordset.MoveFirst
While Not objGDBRecordset.EOF
If objGDBRecordset.Fields("GID").Value = rst!GID_OBJ Then
' теперь позиционирую objGDBFeatureset
' СЛЕДУЮЩАЯ СТРОКА ДЛЯ МЕНЯ САМЫЙ НЕПОНЯТНЫЙ МОМЕНТ
Set objGDBFeatureset = objGDBRecordset.OpenFeatureset(objGDBLayer.FeatureTypes(FEATURETYPE_AREA_NAME), gdbScopeRecordset)
' получаю координаты
For i = 1 To objGDBFeatureset.Feature.VertexCount(1)
objGDBFeatureset.Feature.GetVertex 1, i, X(i), Y(i)
Next i
End If
objGDBRecordset.MoveNext
Wend
rst.MoveNext
Wend
End Sub
Подскажите где ошибка? Т.е. когда я по полученным координатам в карте ищу геометрию, она реальна, в нужном слое, но когда я смотрю связанную с данной геометрией таблицу MDKK System Table там другой GID. |
|
| [ ObjectLand Support ] Четверг, 26 марта 2009, 12:35
' СЛЕДУЮЩАЯ СТРОКА ДЛЯ МЕНЯ САМЫЙ НЕПОНЯТНЫЙ МОМЕНТ
objGDBFeatureset = objGDBRecordset.OpenFeatureset(objGDBLayer.FeatureTypes(FEATURETYPE_AREA_NAME), gdbScopeRecordset)
Первое что бросается в глаза это неверный второй параметр gdbScopeRecordset (в коде примера используется gdbScopeCurrentRecord!). Будьте внимательны!
Далее, тип геометрий у вас уже определен:
objGDBFeatureTypeArea = objGDBLayer.FeatureTypes(FEATURETYPE_AREA_NAME
Поэтому, строку позиционирования на геометрии можно написать так:
objGDBFeatureset = objGDBRecordset.OpenFeatureset(objGDBFeatureTypeArea, gdbScopeCurrentRecord)
P.S. В дистрибутиве ObjectLand (или на сайте) можно найти документацию по СОМ интерфейсам и в ней почитать описание методов, которые вызывают вопросы. |
|
| [ Виктор Тараруев ] Четверг, 26 марта 2009, 13:45
УРА! Получилось, можно тему закрывать. Буду в Таганроге зайду в гости.
В моей версии VBA эта строка будет выглядеть так:
Set objGDBFeatureset = objGDBRecordset.OpenFeatureset(objGDBFeatureTypeArea, gdbScopeCurrentRecord) |
|
| [ Дроваль Валентин ] Пятница, 16 апреля 2021, 16:09
Добрый день, использую python для создания COM, ГДБ, Карта, Слой, Тип создаются нормально, но вот создать саму геометрию в типе нет возможности, т.к. GDBFeatureset не содержит необходимых методов/свойств.
Для работы через python использую библиотеку comtypes. |
|
| [ Владимир Полянский ] Пятница, 16 апреля 2021, 18:10
|
ОтветитьЗнаком «*» отмечены обязательные для заполнения поля. |
| |