SDE 뷰 및 레이어 등록


11

ArcSDE Oracle RAC 10g에 대한 간단한 견해를 만들고 있습니다. 내 SHAPE 열은 SDO_GEOMETRY 데이터 유형입니다. ArcSDE 9.3.1.

다음과 같은 몇 가지 포인트 테이블이 있습니다.

ID (가이드) 이름 (문자열) 모양 (SHAPE)

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

오라클의 관점은 잘 만들어졌습니다. 이 뷰를 명령 행에 등록했습니다.

sdetable -o create_view -T 포인트 -t VW_POINTS -c ID, 이름, 모양 등

ArcSDE 뷰가 다시 생성됩니다. ArcObjects를 사용하여 쿼리 할 수 ​​있습니다. 이제 레이어를 만들어야합니다. sdelayer -o register 명령 행 도구를 사용해 보았지만 성공하지 못했습니다. 그것은 견해가 뒷받침되지 않는다는 메시지를 나에게 준다.

뷰를 빌드하기 위해 복잡한 구문을 사용하여 여러 번이 작업을 수행해야합니다.

무엇이 문제입니까? 이러한 공간 뷰를 SDE 레이어로 시각화하는 방법

입력 주셔서 감사합니다!

편집하다

이것은 ArcMap의 스크린 샷입니다.

ArcMap 행복을위한 스크린 샷 :

요청에 따라, 여기 describe_long이 온다

// 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, USER -g RTREE -s 서버 -i 포트 -u 사용자 -p 패스 -ep -P HIGH

Oracle10g 빌드 2784 용 ArcSDE 9.3.1 2009 년 10 월 27 일 10:51:14

레이어 관리 유틸리티

레이어 설명 .... :

테이블 소유자 .......... : SIGMAGIS2

테이블 이름 ........... : VIEW_AIRSPACE_POINTS

공간 컬럼 ....... : SHAPE

레이어 ID ............ : 1398

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

최소 모양 ID ..... : 1

오프셋 ............... :

거짓 : -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

레이어 유형 ........... : 인라인 공간 유형

창조 일 ........ : 06/28/11 09:28:45

I / O 모드 ............. : 정상

자동 잠금 .......... : 활성화

정밀도 ............. : 높음

사용자 권한 ...... : SELECT, UPDATE, INSERT, DELETE

좌표계 .... : GEOGCS [ "경도 / 위도 [WGS 84]", DATUM [ "WGS 84", SPHEROID [ "WGS 84", 6378137.0,298.257223563]], PRIMEM [ "그리니치", 0.0], UNIT [ "소수

정도 ", 0.0174532925199433]]

레이어 구성 .. : 기본값


레이어 파일을 만들어야합니까?
DEWright

아니요, 지형 데이터베이스 내에서 지형지 물 클래스처럼 작동하는보기를 만들어야합니다.
George Silva

그런 다음 말한대로 공간 뷰를 만들어야합니다. 공간 레이어로 표시되지 않는 유일한 이유는 권한에 대한 것입니다. ArcGIS / ArcSDE가 올바르게 등록하지 않았습니다. 이는 공간 레이어의 목적 일 뿐이므로 공간 및 테이블 형식 데이터를 균일 한 방식으로 결합합니다.
DEWright

뷰에서 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40'과 같은 describe_long을 실행하면 어떤 결과를 얻습니까? 공간 열과 엔티티 유형이 올바르게 설정되고 참조되는지 확인해야합니다.
DEWright

1
경고 해 주셔서 감사합니다. 나는 모든 것을 올바르게했지만 여전히 작동하지 않습니다. :( 매우 실망 스럽습니다. 이것은 OpenSource 스택으로 매우 쉽게 수행 할 수 있습니다 .
George Silva

답변:


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의 DISPLAYS와 비슷한 (기하학 유형과 관련이있는 한 기본 키 열) '베이스'레이어가 있다는 것입니다. 그런 다음 등록 레코드를 비교하고 표시되는 레이어와 그렇지 않은 레이어 사이를 연결합니다. 정수 열에서 1의 변화가 무엇을 만드는지 알게되어 놀랄 것입니다! :-)

COLUMN_REGISTRY에 대한 팁-기본 키 열 (SDE.TABLE_REGISTRY에서 ROWID_COLUMN으로 정의 됨)과 공간 열이 올바른지 (또는 표시되는 계층과 동일한 지) 확인하기 만하면됩니다. 다른 모든 열은 무시하십시오. ArcMap에서 레이어를 테이블 소유자로 로그인하면 COLUMN_REGISTRY 테이블에서 누락 된 항목이 자동으로 추가됩니다.

도움이되는지 알려주세요!


입력에 대한 mapholic 감사합니다! 내일 먼저해볼 게요! 당신이 옳기를 바랍니다! 감사!
George Silva

mapoholic가 대답했습니다. 이것은 다른 유형의 등록에는 적용되었지만 UNIONED에는 등록되지 않았습니다. 그럼에도 불구하고 이것은 놀라운 팁입니다. 답변 해주셔서 감사합니다.
George Silva

6

당신이 찾고있는 것은 Spatial-View입니다 . 이제 여기서 볼 수있는 유일한 주요 문제는 가입하려는 필드에주의를 기울여야한다는 것입니다. 이것은 매우 좋은 프로세스입니다. DB를 일반화 한 곳에서 사용하여 얇은 공간 데이터와 대화합니다.

    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

이것은 당신이 원하는 것에 당신의 길에 잘 도착해야합니다. 핵심은 필드를 올바르게 매핑하는 것입니다. 나는 필요한 최소한으로보기를하고 UI를 사용하여 SDE에 등록 된보기를 편집하여보다 세밀한 조정을 수행합니다.


안녕하세요 DE이 방법을 시도했지만 작동하지 않습니다. 내가 이해하는 것은 ArcSDE가 미리 열을 지정하고 절에서 선언 한 열만 등록하는 "CREATE FORCE VIEW"명령을 생성한다는 것입니다. 빈 뷰를 작성하고 (기능 클래스 만 사용하여 기하학적 정의를 가져옴) 다른 정의로 ​​바꾸려고했습니다. 좋아, ArcMap을 통해 이것을 쿼리 할 수 ​​있지만 지오메트리는지도에 표시되지 않습니다.
George Silva

1
공간 뷰를 ArcCatalog에서 ArcMap으로 드래그하면 형상 데이터와 함께 표시되지 않습니까?
Britt Wescott 2016 년

앞에서 언급했듯이 레이어는 ArcMap 또는 ArcCatalog 미리보기에 표시되지 않지만 올바른 지오메트리 유형의 레이어로 나열되며 ArcMap에서 쿼리 할 수 ​​있습니다.
George Silva

1
뷰에서 'sdetable -o describe_long -t victoria -u sasha -p polar.bear -i esri_40'과 같은 describe_long을 실행하면 어떤 결과를 얻습니까? 공간 열과 엔티티 유형이 올바르게 설정되고 참조되는지 확인해야합니다.
DEWright

결과를 여기에 게시하겠습니다!
George Silva

3

내가 누락 된 것으로 보이는 것은 ArcObjects가 객체 ID에 사용할 수있는 고유 한 정수 열입니다. 이 ID 열에 고유 한 값을 유지하는 단일 시퀀스를 만들어보십시오. 그런 다음 각 테이블에서 삽입 트리거를 작성하여 id 컬럼을 sequence.nextval로 채우십시오.

sdelayer -o register 명령에서 esri가 열을 관리하지 않도록 키워드 USER를 사용하여 -C 플래그를 정수 ID 열로 설정하십시오.


1
안녕하세요, 로커, 등록 과정은 잘 작동합니다. 스레드에 대한 내 대답을 읽으십시오. numeric (38,0)으로 캐스팅 된 Oracle 생성 열 (ROWNUM)을 사용하고 있습니다. 팁 주셔서 감사하지만 이미 시도했습니다.
George Silva

3

답글을 스캔 한 결과 아무도 통합 쿼리가 ArcGIS의 공간보기에서 약간의 문제라는 것을 보지 못했습니다. 이것은 거의 확실하게 중복 objectid로 끝나기 때문입니다. 결합 술어가 고유 한 "부모"레코드를 보장하지 않는 내부 결합 쿼리도 마찬가지입니다. 두 경우 모두보기가 모든 등록 요구 사항을 준수하더라도 올바르게 작동하지 않습니다.


입력 Rob에 감사드립니다. 내가 작성한 뷰를 자세히 살펴보면 Oracles ROWNUM을 사용하여 OID를 즉석에서 생성합니다. 이것들은 독창적입니다.
George Silva

1
데이터가 아크 맵으로 표시되는 경우 행 번호 사용에 대해 100 % 확신하지 못합니다 (예 :). Rownum은 오라클 쿼리 세트의 기능입니다. 따라서 쿼리를 실행할 때마다 1에서 시작하는 새로운 행 번호 집합을 얻습니다. 이는 각 팬 / 줌 등이 1의 objectid를 생성하고 캐시 된 objectid를 사용할 것으로 예상되는 프로세스는 후속 쿼리에서 새 행 번호를 생성하므로 실패한다는 의미입니다 결과. ArcGIS가 objectid 열을 추가하도록하는 옵션으로 쿼리 테이블 만들기 도구를 살펴 보셨습니까?
Rob McPherson

2

이 스레드를 본 모든 덕분에.

프로세스는 약간 복잡하지만 복잡한 쿼리를 계층으로 등록 할 수 있지만 약간의 교묘 한 생각이 필요합니다. 아직 성능에 어떤 영향이 있는지 잘 모르겠지만 업데이트를 유지하려고 노력할 것입니다. ArcMap에서 포인트를 보는 데 문제가 있지만 더 자세히 조사하겠습니다.

우선, RDBMS에서 복잡한 공간 뷰를 작성하십시오. 보기에 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

이 스키마에서 모든 객체는 GUID 인 PK ID_UNIQUE_ID를 갖습니다. 내 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는 sdetable -o describe 유틸리티 프로그램에 따라 FID가 부동 소수점 숫자 인 NUMBER (38,10) 인 것으로 가정합니다.

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의 새로운 빈 맵으로 끌어다 놓으면 어떻게됩니까?
커크 Kuykendall

ArcMap은 TOC에 추가하지만 아무것도 렌더링하지 않습니다. 이상한 점은 행을 선택할 수 있고 해당 행의 형상이 그려집니다 (선택됨). 행을 선택하지 않으면 아무 것도 그려지지 않습니다. ArcMap을 통한 쿼리도 작동합니다.
George Silva

1
흥미 롭군 arcobjects 코드를 작성하면 IGeoDataset.Extent는 피처 레이어에 어떤 모양입니까? 그리고 특징 클래스를 위해?
Kirk Kuykendall 2016 년

나는 그것을 시도 할 것이다! 보자
George Silva

2

다음 명령을 실행하십시오 : sdelayer -o alter -l [-S] [-k] [-i | | ] [-s] [-D] -E calc -u [-p]


의견 주셔서 감사합니다. 이미 레이어의 범위를 다시 계산하려고했습니다.
George Silva

2

필자의 경험에 따르면 레이어가 아크에 표시되지 않으면 공간 인덱스가 없기 때문입니다. 뷰는 소스 테이블의 공간 인덱스를 사용하지만 등록 명령문에서 뷰에 대한 공간 인덱스를 작성하는 것처럼 보입니다.

소스 테이블 중 하나에 공간 인덱스가 있습니까? 그렇지 않은 경우 Oracle에서 작성하고 -g없이보기를 다시 등록하십시오.

또 다른 가능성은 두 테이블의 지오메트리를 단일 열로 결합하는 것입니다.


나는 그 매트를 시도합니다. 또한 여러 기하학을 다른 관점에서 하나로 결합하고 있으며 이것이 작동하는 것이 다소 중요합니다. 뷰에서 선 스트링을 작성하고 있으며 통합 뷰는 해당 레이어에 대한 단일 지원 지점으로 간주되었습니다. 이 일이 일어나지 않기 때문에 다른 접근법을 시도하고 있습니다.
George Silva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.