ArcGIS 도구를 통해 SQL의 언어에 어느 정도 액세스 할 수 있습니까?


10

그 질문은 너무 불필요하게 들립니다 ...
어쨌든 ArcGIS에서 SQL의 사용법을 탐구하도록 요청 받았습니다. 모든 서버 측 스토리지 및 DB 관리 / 대규모 편집에 SDE DB를 사용합니다. 그러나 ArcGIS의 툴에 SQL이 얼마나 통합되어 있는지 자세히 알아 보려고합니다. 필드 계산기 도구를 사용할 때 SQL 구문이 작동 하지 않는다고 명확하게 설명하는 ArcGIS 10 도움말 의 SQL 쿼리 참조 안내서 에 메모가 있습니다 . 필자는 필드 값을 계산할 때 데이터베이스 자체에서 직접 정보를 가져와 맹 글링하는 것이 매우 유용하기 때문에 매우 실망 스러웠습니다.

ArcGIS에서 SQL을 사용하려고 할 때 발생할 수있는 가장 큰 한계와 함정은 무엇입니까? SQL과 통합 될 때 어떤 도구가 최고의 기능성을 보입니까?

더 명확한 질문을하기 위해 예가 필요한 경우, 주어진 지역에서 특정 유형의 관심 지점 수를 추적하려고합니다. 각 지점에는 유형과 지역을 설명하는 속성이 있습니다. 현재 솔루션에는 계산 및 데이터 검색을 위해 커서를 많이 사용하지만 간단한 SQL 쿼리 가이 모든 것을 할 수 있다는 점이 우수합니다. 불행히도, 기능이 존재하지 않는 것 같습니다.

아니면?


쿼리 된 테이블이 버전 화되어 있습니까?
Michael Todd

버전? 나는 그 용어에 익숙하지 않다고 생각합니다.
Nathanus

1
레이어 버전을 지정하면 이전 기능을 유지하면서 레이어를 변경할 수 있습니다. 따라서 기능이 삭제되면 현재 버전의 레이어에 해당 기능이 더 이상 존재하지 않음이 표시됩니다. 그러나이 기능은 실제로 "기본"계층에 여전히 존재하며 GIS 도구를 사용하여 기능을 표시하는 다른 버전의 계층을 볼 수 있습니다. ArcCatalog에서 도면층을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하여 도면층의 버전을 지정할 수 있습니다. 일반 탭의 맨 아래에는 버전 관리라는 섹션이 있으며 여기에 레이어 버전이 있는지 여부를 알려주는 정보가 있습니다.
Michael Todd

답변:


9

Python을 사용하려면 ArcSDESQLExecute 명령을 살펴보십시오 . 이를 통해 임의의 SQL을 실행할 수 있지만 SDE를 통해 연결해야합니다. 쿼리 결과가 행 집합 인 경우 속성은 Python 목록 목록으로 반환됩니다. 그렇지 않으면 SQL이 성공적으로 실행되면 True를 반환하고 그렇지 않으면 None을 반환합니다. 다음도 참조 : ArcSDE 연결을 사용하여 SQL 실행


나는 확실히 그렇게 할 것입니다! 이것은이 맥락에서 내가 찾던 것과 같습니다. 고마워
Nathanus

5

사용자 정의 ArcObject를 작성하는 경우 ExecuteSQL 메소드 를 사용하여 SDE 작업 영역에 대해 임의의 SQL을 실행할 수 있습니다 . 이 메소드는 INSERT, UPDATE 또는 일부 스토어드 프로 시저와 같은 결과 세트를 리턴하지 않는 쿼리로 제한됩니다.

ArcMap UI를 통해 작업하는 경우 옵션이 조금 더 제한적입니다. Calculate Field를 통해 SQL을 사용할 수없는 이유는 표현식이 실제로 VBScript 및 / 또는 Python이기 때문입니다. VBScript 또는 Python을 사용하여 임의의 SQL 식을 실행하고 결과 커서에서 값을 가져올 수 있지만 권장하지는 않습니다.

또는 Regan의 답변을 사용하고 쿼리 계층을 만들 수 있습니다 . 읽기 전용 데이터의 경우 이것이 최선의 방법입니다. 데이터를 업데이트해야하는 경우 약간 더 복잡합니다. "새"값으로 쿼리 계층을 만들고 기존 테이블에 대해 조인을 수행 한 다음 계산 필드를 사용해야합니다. 이를 ExecuteSQL과 결합하여 복잡한 업데이트를 수행 한 다음 결과를 볼 수 있습니다.

마지막 대안은 ArcSDE 테이블에 대해 SQL을 직접 실행하는 것입니다.


1
마지막 포인트 (테이블에 대해 SQL을 직접 실행)는 내 버전 관리 질문을 한 이유입니다. 데이터베이스 수준의 SQL 쿼리는 기본 계층에서 가져 오므로 (멀티 버전 뷰를 설정하지 않는 한) 계층 버전이 지정된 경우 작동하지 않습니다.
Michael Todd

내가하고있는 일은 주로 파이썬에서 이루어 지지만 UI의 실제 기능은 ArcObjects에 의존하는 것처럼 보입니다.
Nathanus

파이썬 기능을 포함하여 모든 것이 ArcObject에 내장되어 있습니다.
James Schek

Python의 ArcSDESQLExecute가 결과를 반환 할 수 있다면 IWorkspace.ExecuteSQL을 통해 어떻게 달성 할 수 있습니까?
Petr Krebs

@petr 당신은 직접 할 수 없습니다 ... 나는 내 대답을 업데이트했습니다.
James Schek


1

사용중인 RDBMS에 따라 피처 데이터를 다시 가져 오지 않는 한 ArcObjects 또는 arcpy 외부의 SQL 라이브러리를 활용할 수 있습니다. 매일 사용하는 SQL Server 데이터베이스의 많은 쿼리는 본질적으로 공간적이지 않으므로 .NET 내부의 System.Data 클래스 또는 Python 응용 프로그램 내부의 pymssql Python 라이브러리를 사용합니다. 공간 데이터를 사용해야하는 경우 쿼리 계층이 가장 좋습니다. 쿼리 계층에서 유일하게주의 할 점은 공간 데이터 유형 (표준 SDEBINARY 유형이 아님)을 사용하여 저장된 데이터로만 작업 할 수 있다는 것입니다.


이것은 강렬 해지기 시작했다. 내 필요를보다 신중하게 평가해야한다고 생각합니다. "공간"데이터가 필요하지 않을 것입니다. 다각형 및 점 / 선 자체와 같은 것을 의미하는 것이 아니라 단순히 텍스트 / 정수 필드의 값입니다.
Nathanus

지오메트리 유형을 반환해야하는 경우 표준 ArcObjects / arcpy 데이터 액세스를 사용합니다. "테이블 형식의"데이터에 액세스하는 경우 (공간 유형이 포함되지 않은 경우) 일반 SqlConnections를 사용하여 데이터베이스를 호출하면됩니다 (SQL Server의 경우 연결 유형이 다를 수 있음). 결과는 ICursor에서 얻는 것보다 더 유연합니다. 그래도 귀하의 질문을 이해하고 필드 계산기를 사용하는 것으로 제한되면 원시 SQL을 사용할 수 없습니다.
SagebrushGIS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.