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

Обсуждение

 Поиск в справочникеПоиск в справочнике [ Дмитрий Глубоков ]
Понедельник, 28 февраля 2011, 10:47

Здравствуйте.
У меня такой вопрос: Есть справочник вида -
________________________________________
| КОД | СОКР. ИМЯ | ПОЛНОЕ ИМЯ |
________________________________________
| 1 | стб. дер. | столб деревянный |
________________________________________
| 2 | стб. ж/б. |столб железобетонный|
________________________________________, и т.д.

Поле Код имеет атрибуты - ключевое, уникальное, непустое.
Есть следующий код:

Dim code As Intrger
objGDBLayer = objGDBMap.Layers.Item(LAYER_RAIL) ' текущий слой
objGDBFeatureType = objGDBLayer.FeatureTypes.Item(FEATURETYPE_LIGHT) 'текущий тип геометрий
objGDBTable = objGDB.Tables.Item(TABLE_NAME_REF) ' текущий справочник
objGDBFeatureSet = objGDBFeatureType.OpenFeatureset
objGDBFeatureSet.MoveFirst()
If objGDBFeatureSet.FeatureCount > 0 Then
Do ' ищем объекты типа FEATURETYPE_LIGHT
' имя стиля объекта (в справочнике - ПОЛНОЕ ИМЯ)
obj_name=objGDBFeatureSet.Feature.MapSymbol.Name

......
Здесь требуется код для нахождения в сравочнике "TABLE_NAME_REF" в поле "ПОЛНОЕ НАЗВАНИЕ" = bj_name и присвоение переменной code значения из поля "КОД"
......

objGDBFeatureSet.MoveNext()
Loop Until objGDBFeatureSet.EOF
End If

Пожалуйста помогите.

 Поиск в справочнике [ Дмитрий Глубоков ]
Понедельник, 28 февраля 2011, 11:51

Пробовал такой код:
objGDBFieldSeek = objGDBRecordset.Fields.Item(FIELD_NAME_KEY)
objGDBRecordset.Seek(objGDBFieldSeek, objGDBFeatureSet.Feature.MapSymbol.Name)

Но так как поле "ПОЛНОЕ ИМЯ" не уникальное и не ключевое, то возникает ошибка(((.

 Поиск в справочнике [ Objectland Support ]
Вторник, 1 марта 2011, 13:11

Так как поле ПОЛНОЕ ИМЯ в Вашем справочнике не имеет атрибутов уникальности (ведь это так?), то, в общем случае, при поиске по этому полю Вы можете получить несколько записей.

Или наложите ограничение уникальности на поле ПОЛНОЕ ИМЯ, чтобы находилось не более одной записи, или измените критерий построения выборки (например, постройте выборку, содержащую записи со значением поля ПОЛНОЕ ИМЯ, совпадающим с искомым) и позиционируйтесь на первую запись в выборке или пересмотрите исходные условия и измените задачу (например, рассмотрите возможность использовать в качестве уникального кода внутренний номер условного обозначения).

 Поиск в справочнике [ Petr27 ]
Вторник, 1 марта 2011, 13:40

Вообще можно настроить фильтр в теме и условные обозначения будут показаны нужным стилем. Это лучше, чем устанавливать объектам собственные стили.

 Поиск в справочнике [ Дмитрий Глубоков ]
Вторник, 1 марта 2011, 16:55

Спасибо.
Я сделал пока так (перебором по всем строкам справочника),
Do
If objGDBRecordset.Fields.Item("ПОЛНОЕ ИМЯ").Value = objGDBFeatureSet.Feature.MapSymbol.Name Then
code = objGDBRecordset.Fields.Item("КОД").Value
Exit Do
End If
objGDBRecordset.MoveNext()
Loop Until objGDBRecordset.EOF
Конечно криво, но пока так.

 Поиск в справочнике [ Objectland Support ]
Вторник, 1 марта 2011, 17:21

Опишите в общем виде Вашу задачу, может мы сможем подсказать Вам оптимальное решение.

 Поиск в справочнике [ Дмитрий Глубоков ]
Среда, 2 марта 2011, 08:05

В общем виде, одна из задач такая:
Н-р есть геометрия - "светофор". Светофоры имеют условные знаки - светофор карликовый двухлинзовый, светофор карликовый трехлинзовый, светофор карликовый четырехлинзовый и т.д. Есть справочник, где все это прописано, и каждому виду светофора присвоен уникальный код в справочнике.
К геометрии присоеденена таблица, где этот код надо прописывать вручную.
Задача состоит в том, что-бы автоматически, в зависимости условного знака светофора, добавить код светофора в таблицу.
Соответственно, таких геометрий на карте много.
Я делал так:
- перебирал все геометрии типа "светофор", читал имя стиля(условный знак) текущей геометрии кодом objGDBFeatureSet.Feature.MapSymbol.Name, искал это имя в справочнике, считывал код и записывал его в присоеденённую к геометрии ведомость.

P.S. ещё одна важная проблема; при решении задачи, если условный знак стоит по умолчанию (т.е. не выбран вручную из библиотеки, а используется наследуемый), то при попытке выяснить его имя кодом objGDBFeatureSet.Feature.MapSymbol.Name, выдается ошибка NullReferenceException. Хотя по умолчанию, имя у этого условного знака все-же есть.

 Поиск в справочнике [ Дмитрий Глубоков ]
Среда, 2 марта 2011, 08:30

И еще вопрос: как программно поменять условный знак геометрии?
objGDBFeatureSet.Feature.MapSymbol.Name = "светофор карликовый трехлинзовый"?

 Поиск в справочнике [ Objectland Support ]
Среда, 2 марта 2011, 13:18

Можно использовать в качестве кодов светофоров сразу внутренний номер условного обозначения (MapSymbol.Number), эти же внутренние номера можно использовать в справочнике.

При получении имени/внутреннего номера условного обозначения нужно предварительно проверять, установлено ли условное обозначение для геометрии или используется наследуемое/по умолчанию (Feature.MapSymbol возвращает Null, если условное обозначение не установлено).

Программно установить/поменять условное обозначение геометрии можно с помощью свойства aFeature.MapSymbol, установив это свойство в нужное значение (aFeature.MapSymbol = aMapSymbol), условные обозначения получаются из библиотеки стилей отображения геометрий (локальной aGDB.Library или общей aGBDEngine.SharedLibrary).

 Поиск в справочнике [ Дмитрий Глубоков ]
Среда, 2 марта 2011, 14:40

Огромное спасибо. Задачка потихонечку решается.

 Поиск в справочнике [ ObjectLand Support ]
Среда, 2 марта 2011, 15:41

1. Свойство objGDBFeatureSet.Feature.MapSymbol может возвращать Null если набор геометрий objGDBFeatureSet построен не на основе темы (посмотрите описание свойства MapSymbol по ссылке http://www.objectland.ru/support/doc/comapi/Geometry_MapSymbol.html).

2. Чтобы программно поменять условный знак геометрии надо сначала получить условный знак, а затем присвоить его геометрии:
objMapSymbol = objGDBEngine.SharedLibrary.MapSymbols.Item("светофор карликовый трехлинзовый")
objGDBFeatureSet.Feature.MapSymbol = objMapSymbol

 Поиск в справочнике [ Дмитрий Глубоков ]
Четверг, 3 марта 2011, 13:38

Спасибо за помощь.
Я именно так и сделал.

Dim instance As NullReferenceException

If objGDBFeatureSet.Feature.MapSymbol Is instance Then
objGDBFeatureSet.Feature.MapSymbol = objGDBLibrary.MapSymbols.Item("светофор карликовый трехлинзовый")
End If

Ответить

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



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