Зарегистрируйте вид SDE и слой

11

Я строю простые представления о ArcSDE Oracle RAC 10g. Мои столбцы SHAPE имеют тип данных SDO_GEOMETRY. ArcSDE 9.3.1.

У меня есть несколько таблиц баллов, со следующим планом:

ID (Guid) Имя (строка) Форма (ФОРМА)

Я построил простой взгляд на это в Oracle!

CREATE OR REPLACE VIEW VW_POINTS AS

    SELECT ID, Name, Shape from TABLE_A

        UNION ALL

    SELECT ID, Name, Shape from TABLE_B

        -- etc

Представление в Oracle создано просто отлично. Я зарегистрировал это представление с помощью командной строки:

sdetable -o create_view -T POINTS -t VW_POINTS -c Id, имя, форма и т. д.

Представление ArcSDE создается снова, просто отлично. Я могу использовать ArcObjects для запроса и т. Д. Мне нужно сейчас создать слой. Я пробовал инструменты командной строки, регистр sdelayer -o, но безуспешно. Это дает мне сообщение о том, что мнения не поддерживаются.

Мне нужно будет сделать это несколько раз, иногда используя сложный синтаксис для построения представления.

В чем проблема? Как можно визуализировать эти пространственные виды в виде слоев SDE (мне не нужно редактировать их, просто просмотрите их в ArcMap в пространстве)

Спасибо за вклад!

РЕДАКТИРОВАТЬ

Это скриншот в ArcMap, для вашего удовольствия: P

Скриншот ArcMap для вашего счастья :

В соответствии с просьбой, здесь приходит описание

// create_view C: \ Users \ H> sdetable -o create_view -s сервер -i порт -u пользователь -p pass -T view_airspace_points -t vw_airspace_points_oracle -c "*"

в этот момент я изменил взгляд на оракула, в том числе на число (38,0) перед регистрацией.

// зарегистрировать слой C: \ Users \ H> sdelayer -o зарегистрировать -l view_airspace_points, форма -C OBJECTID, ПОЛЬЗОВАТЕЛЬ - g RTREE -s сервер -i порт -u пользователь -p pass -ep -P HIGH

ArcSDE 9.3.1 для Oracle10g Build 2784 вт 27 октября 10:51:14 2009

Утилита администрирования слоя

Описание слоя ....:

Владелец таблицы ..........: SIGMAGIS2

Имя таблицы ...........: VIEW_AIRSPACE_POINTS

Пространственный столбец .......: ФОРМА

Идентификатор слоя .............: 1398

SRID .................: 79

Минимальный идентификатор формы .....: 1

Смещение ...............:

falsex: -180.000000

фальси: -90.000000

Системные блоки .........: 994200.000000

Смещение по оси Z ..............: 0,000000

Единицы Z ..............: 1.000000

Смещение измерения .......:

Единицы измерения ........:

Кластерный допуск XY.: 2.0

Пространственный индекс ........:

параметр: SPIDX_RTREE

существует: да

форма массива: -2,0,0

Конверт слоя .......:

minx: -180.00000, miny: -90.00000

макс .: 180,00000, макс .: 90,00000

Сущности .............: p

Тип слоя .................: Встроенный пространственный тип

Дата создания ........: 28.06.11 09:28:45

Режим ввода / вывода .............: НОРМАЛЬНЫЙ

Автоблокировка ..........: включена

Точность .............: высокая

Права пользователя ......: ВЫБРАТЬ, ОБНОВИТЬ, ВСТАВИТЬ, УДАЛИТЬ

Система координат ....: GEOGCS ["Долгота / Широта [WGS 84]", DATUM ["WGS 84", SPHEROID ["WGS 84", 6378137.0,298.257223563]], PRIMEM ["Гринвич", 0.0], UNIT [ "Десятичная дробь

Степень», +0,0174532925199433]]

Конфигурация слоя ..: ПО УМОЛЧАНИЮ

Джордж Сильва
источник
Итак, вам нужно создать файл слоя?
DEWright
Нет, мне нужно создать представление внутри базы геоданных, которое действует как класс объектов.
Джордж Сильва
Тогда вам нужно создать пространственный вид, как вы говорите, и я упоминаю ниже; Единственная причина, по которой я вижу, что он не отображается как пространственный слой, - это разрешение. Либо ArcGIS / ArcSDE не зарегистрировали это должным образом; поскольку это просто цель пространственного слоя, объединить пространственные и табличные данные единообразным образом.
DEWright
Когда вы запускаете description_long, например, 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40', какие результаты вы получаете? Нам нужно посмотреть, правильно ли установлены и ссылаются пространственный столбец и тип объекта.
DEWright
1
DE спасибо за предупреждение. Я все сделал правильно, но все равно не работает. :( очень разочаровывает. Это может быть сделано с помощью стека OpenSource довольно легко .
Джордж Сильва

Ответы:

4

У меня было это (и подобные проблемы) в прошлом. Это всегда сводилось к двум вещам:

  1. Пространственная таблица имела некоторые поврежденные / недействительные геометрии. Проблема с ArcMap заключается в том, что как только он находит неправильную геометрию, он прекращает рендеринг.

  2. Регистрация слоя неверна. Я также обнаружил, что регистр sdelayer -o не всегда работает правильно, и вам нужно «помассировать» регистрационные записи.

Поэтому, чтобы проверить, является ли слой действительным, сначала используйте функцию SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT . Затем используйте функцию проверки ArcSDE sdelayer -o feature_info -r invalid ..., чтобы получить недопустимые объекты в соответствии с ArcSDE. Возможно вместе со списком sdelayer -o (см. Здесь )

Для проверки регистрации вы должны вернуться в схему ArcSDE. Таблицы, которые управляют регистрацией: SDE.LAYERS, SDE.TABLE_REGISTRY, SDE.COLUMN_REGISTRY, SDE.SPATIAL_REFERENCES и SDE.GEOMETRY_COLUMNS. Один трюк, который я использую, заключается в том, что у меня обычно есть «базовый» слой, который похож (в том, что касается типов геометрии и столбцов первичного ключа), который отображается в ArcMap. Затем я сравниваю регистрационные записи, между отображаемым слоем и тем, который не отображается. Вы будете удивлены, узнав, что делает изменение на 1 в целочисленном столбце! :-)

Совет по COLUMN_REGISTRY - все, что вам нужно сделать, это убедиться, что столбец первичного ключа (который определен как ROWID_COLUMN в SDE.TABLE_REGISTRY) и пространственный столбец правильны (или совпадают с отображаемым слоем). Игнорировать все остальные столбцы. Если вы добавите слой в ArcMap, вошедший в систему как владелец таблицы, недостающие записи в таблице COLUMN_REGISTRY будут добавлены автоматически.

Позвольте мне знать, если это помогает!

mapoholic
источник
спасибо за вклад! Я попробую это первым делом завтра! Я надеюсь, что вы правы! Благодаря!
Джордж Сильва
ответил маполик. Это работало для разных типов регистраций, но не для UNIONED. Тем не менее, это удивительный совет. Спасибо за ответ.
Джордж Сильва
6

То, что вы ищете, это пространственное представление , теперь единственная серьезная проблема, которую вы увидите здесь, это то, что вам нужно быть осторожным с полями, к которым вы присоединяетесь. Это довольно хороший процесс, я использую его везде, где я обобщил свою БД, чтобы общаться с тонкими пространственными данными.

    sdetable -o create_view -T emp_region_view -t "employees,world.regions" 
-c "employees.name,employees.emp_id,world.regions.reg_id,world.regions.rname,world.regions.region"
-a "employee,eid,rid,region,area" -w "employees.emp_id = world.regions.emp_id"
-s myodbserver -i sde:oracle11g:ora1 -u gdb -p gdb.bdg

Это должно помочь вам на пути к тому, что вы хотите. Ключ заставляет ваши поля отображаться правильно. Я обычно делаю вид с минимальным необходимым мне количеством, а затем использую пользовательский интерфейс для редактирования этого вида после регистрации в SDE, чтобы сделать мои более тонкие настройки.

DEWright
источник
Здравствуйте DE Я пробовал этот метод, но он не работает. Насколько я понимаю, ArcSDE создает команду «CREATE FORCE VIEW» с указанием столбцов перед рукой и регистрирует только те столбцы, которые вы объявили в предложении. Я попытался создать пустое представление (используя только класс пространственных объектов, чтобы получить геометрическое определение) и заменить его другим определением. Хорошо, я могу запросить это через ArcMap, но геометрия НЕ отображается на карте.
Джордж Сильва
1
Если вы перетащите пространственное представление из ArcCatalog в ArcMap, оно не отобразится с геометрическими данными?
Бритт Уэскотт
Как указывалось ранее, слой не отображается в предварительном просмотре ArcMap или ArcCatalog, но он указан как слой с правильной геометрией и может запрашиваться в ArcMap.
Джордж Сильва
1
Когда вы запускаете description_long, например, 'sdetable -o description_long -t victoria -u sasha -p polar.bear -i esri_40', какие результаты вы получаете? Нам нужно посмотреть, правильно ли установлены и ссылаются пространственный столбец и тип объекта.
DEWright
Я опубликую результаты здесь!
Джордж Сильва
3

Одна вещь, которую я вижу отсутствующей, - это уникальный целочисленный столбец, который ArcObjects может использовать для идентификатора объекта. Попробуйте создать одну последовательность, которая будет поддерживать уникальные значения для этого столбца идентификатора. Затем создайте триггеры вставки в каждой из таблиц, чтобы заполнить столбец идентификатора sequence.nextval.

В вашей команде sdelayer -o register обязательно установите флаг -C для столбца целочисленного идентификатора с ключевым словом USER, чтобы esri не пытался управлять столбцом за вас.

jrockers
источник
1
Здравствуйте jrockers, процесс регистрации просто работает отлично. прочитайте мой собственный ответ в ветке. Я использую сгенерированный Oracle столбец (ROWNUM), приведенный как числовой (38,0). Спасибо за совет, но я уже попробовал это.
Джордж Сильва
3

Я как бы просканировал ответы, и никто, похоже, не заметил, что запросы на объединение представляют собой небольшую проблему для пространственных представлений с ArcGIS. это потому, что вы почти наверняка получите повторяющиеся объекты. То же самое относится и к внутренним запросам соединения, где предикаты соединения не гарантируют уникальную «родительскую» запись. в любом случае, хотя представление может соответствовать всем требованиям регистрации, оно не будет вести себя правильно

Роб Макферсон
источник
Спасибо за вклад Роб. Если вы внимательно посмотрите на вид, который я написал, он генерирует OID на лету, используя Oracles ROWNUM. Они гарантированно будут уникальными.
Георгий Сильва
1
Я не уверен на 100% в использовании rownum, если данные отображаются в arcmap (например). Rownum является функцией набора запросов оракула. таким образом, каждый раз, когда вы выполняете запрос, вы получаете новый набор значений rownums, начинающийся с 1. Это может означать, что каждый сдвиг / увеличение и т. д. будет производить объект 1, и любой процесс, ожидающий использовать кэшированные объекты, потерпит неудачу, так как последующие запросы будут производить новый результат. Вы рассматривали инструмент создания таблицы запросов как вариант, чтобы ArcGIS добавила для вас столбец objectid?
Роб Макферсон
2

Спасибо всем, кто просматривал эту ветку.

Ну, процесс немного сложен, но можно зарегистрировать сложный запрос как слой, просто нужно немного хитро подумать. Я еще не уверен, как это повлияет на производительность, но я постараюсь держать это в курсе. У меня также есть проблемы с просмотром точек в ArcMap, но я буду исследовать дальше.

Прежде всего, создайте сложный пространственный вид в вашей РСУБД. Просто убедитесь, что у вас есть столбец INTEGER UNIQUE NOT NULL в представлении, который можно использовать позже для регистрации в ArcSDE.

Мои запросы были просто связкой UNION ALL, похожей на эту:

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX    
        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY

В этой схеме все мои объекты имеют идентификатор PK ID_UNIQUE_ID, который является GUID. Мои ObjectID повторялись во всех классах пространственных объектов, так что это не лучший выбор для нашего суррогатного ObjectID.

Я использовал (в моем случае) виртуальный столбец Oracle rownum, чтобы обернуть все мои запросы и создать представление с эффективным «objectID». Взглянем:

SELECT 
    CAST(ROWNUM AS NUMBER(38,0)) AS "FID",
    OBJECTID,
    ID_UNIQUE_ID,
    AIRSPACE_ID,
    NM_INDICATIVE,
    ELEMENT_TYPE,
    SHAPE 
FROM 
(
    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'ZZZ' AS "ELEMENT_TYPE",SHAPE FROM TB_ZZZ

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'XXX' AS "ELEMENT_TYPE",SHAPE FROM tb_XXX

        UNION ALL

    SELECT OBJECTID, ID_UNIQUE_ID, AIRSPACE_ID, NM_INDICATIVE, 'YYY' AS "ELEMENT_TYPE",SHAPE FROM TB_YYY
)

Я создал представление с запросом выше, и создал представление сверху этого. Этот вид станет пространственным слоем внутри arcsde. Это довольно простой процесс.

После этого я попытался зарегистрировать свое пространственное представление как слой, но всегда не получалось. Когда вы создаете представление поверх него, ArcSDE предполагает, что FID - это НОМЕР (38,10), число с плавающей запятой, в соответствии с утилитой sdetable -o description.

В Oracle это было определение для представления:

  CREATE OR REPLACE FORCE VIEW "schema"."layer_name" ("FID", "OBJECTID", "ID_UNIQUE_ID", "AIRSPACE_ID", "NM_INDICATIVE", "SHAPE") AS 
  SELECT  CAST(fid AS NUMBER(38,0)) AS FID, objectid, id_unique_id, airspace_id, nm_indicative, shape FROM  schema.VW_AIRSPACE_POINTS_ORACLE;

После того, как я заменил колонку fid на приведение, все работало нормально. Я приступил к оформлению слоя и все прошло нормально.

РЕДАКТИРОВАТЬ

Слой отображается в ArcCatalog как точечный слой, и я могу видеть и выбирать таблицу в ArcMap как обычно (точки даже подсвечиваются), но я не могу их символизировать и просматривать как обычный слой. Какие-нибудь мысли?

У кого-нибудь есть идеи, почему это происходит? Все хорошо, за исключением того, что я не могу видеть пространственные объекты внутри ArcMap. Любые идеи?

Джордж Сильва
источник
1
Вы можете многое сделать с производительностью этого представления, если будете поддерживать свои индексы в актуальном состоянии, я настроил запланированные задания для запуска в системах с большим количеством транзакций, чтобы индексы перестраивались каждую ночь. Тогда, когда вы делаете свои соединения, они лучше настроены.
DEWright
Что произойдет, если вы перетащите из arccatalog на новую пустую карту в arcmap?
Кирк Куйкендалл
ArcMap добавляет его в оглавление, но ничего не рендерит. Странно то, что я могу выбирать строки, и геометрия этой строки будет рисоваться (выделено). Когда строки не выделены, ничего не рисуется. Запросы через ArcMap также работают.
Джордж Сильва
1
Интересный. Если вы пишете код arcobjects, как выглядит IGeoDataset.Extent для слоя элементов? А для художественного класса?
Кирк Куйкендалл
Я попробую это! Давайте посмотрим.
Джордж Сильва
2

Пожалуйста, попробуйте выполнить следующую команду: sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]

Прия J
источник
Спасибо за комментарий. Уже пытались пересчитать размер слоя.
Джордж Сильва
2

По моему опыту, когда слой не отображается в Arc, это потому, что отсутствует пространственный индекс. Представления используют пространственный индекс исходной таблицы, но похоже, что вы создаете пространственный индекс для представления в своем заявлении о регистрации.

Есть ли у исходных таблиц пространственные индексы? Если нет, попробуйте создать их в Oracle и перерегистрировать представление без -g.

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

MattL
источник
Я попробую это Мэтт. Я также объединяю несколько геометрий в одно представление, и это очень важно, чтобы это работало. Мы строим линейные строки на представлении, и это объединенное представление должно было стать единственной точкой поддержки для этих слоев. Я пробую другие подходы, так как я не вижу, чтобы это произошло.
Джордж Сильва