QGIS가 Spatialite 뷰를 읽을 수 있습니까?


11

몇 년 동안의 범죄 데이터를 포괄하는 공간 데이터베이스가 있습니다. 단순히 시간 범위 또는 어떤 유형의 범죄가 반환되는지 제한하는 View를 도입하여 사용자의 상호 작용을 단순화 할 수있는 실제 시나리오를 촉진하기 위해 QGIS가이 View를 이와 같이 읽을 수 있는지 알고 싶습니다. 내 데이터베이스에 다른 공간 테이블이 있습니다. 여기서 요점은 분명히 내가 사용할 수있는 모든 가능한보기에 대해 별도의 테이블을 만들고 싶지 않다는 것입니다. 사용자가 데이터 자체를 서브 셋팅하기 위해 데이터베이스와 적절한 SQL을 알 필요가 없도록 단순화하려고합니다. ArcGIS 환경에서 유사한 워크 플로는 사용자가 데이터베이스 (예 : SQL Server)에 액세스하고 제한된 데이터 세트 만 제공하는 ArcMap에서 열 수있는 별도의 레이어 파일을 생성 할 수 있습니다.

데이터베이스에 뷰를 만들었지 만 QGIS의 공간 데이터베이스에 연결할 때 가져올 수있는 기능 클래스 목록에 표시되지 않습니다. 뷰는 공간적으로 간주되지 않습니까? (이것은 나중에 살펴볼 것이지만 이미 알고 있다고 생각합니다. 결론을 기억하지 못합니다.) 어쨌든 원하는 워크 플로우 또는 유사한 ArcGIS 대안을 어떻게 복제 할 수 있습니까? ?

답변:


15

QGIS에서 사용할 수 있으려면 geometry_columns 테이블에 뷰를 등록해야한다고 생각합니다.

다음 예제를 통해 "자신의 Spatial VIEW를 직접 작성" 하는 것이 좋습니다 .

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column)
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry');

어쨌든이 뷰를 실제 공간 뷰가되도록 views_geometry_columns에 등록해야합니다.


그것은 문제인 것 같습니다. 뷰를 만들고 메타 테이블을 확인했습니다. 분명히, 뷰의 지오메트리는 나열되지 않습니다. 뷰의 지오메트리는 어떻게 등록합니까? RecoverGeometryColumn을 시도했지만 테이블이 존재하지 않는다고 알려줍니다. 나는 2.4 버전에 있다고 생각했지만 분명히 Spatialite 3.0 베타를 사용하고 있습니다. 어쩌면 내가 명령을 잘못 구현하고 있습니까? 보기에서 작동하지 않을 수 있습니까? (더 좋습니다!); 명확하게하기 위해, 내 명령은 SELECT RecoverGeometryColumn ( 'tblName', 'SHAPE', 2226, 'POINT', 2);
Bryan Goodrich

4
형상 기반 뷰를 처리하기위한 특수 테이블이 있습니다. VIEWS_GEOMETRY_COLUMNS 값에 INSERT INTO 다음 구문을 사용하십시오 ( '{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);
Nathan W

예 : VIEWS_GEOMETRY_COLUMNS 값에 삽입 ( 'Towns_v1', 'Geometry', 'POINT', 2, 32632, 0);
Nathan W

SELECT * FROM views_geometry_columns;삽입해야하는 것을 확인하는 데 사용 하십시오. gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/…에
Nathan W

2

여기에 설명 된 것과 유사한 뷰에 고유 한 ID를 넣어야 할 수도 있습니다 . PostGIS에서 고유 한 ID로 뷰를 생성 할 수 있습니까?


뷰 생성에서 PK를 명시 적으로 선택하지 않으면 고유 ID가 전달되지 않습니까? 적어도 내가 여기서하고있는 간단한 선택 쿼리의 경우.
Bryan Goodrich

@ BryanGoodrich- 시도해보십시오. 그러나 내가 찾은 한 PostGIS보기에서는 그렇게 작동하지 않습니다.
RyanKDalton

이 뷰는 "SELECT * FROM crime WHERE ..."에 의해 작성되었으며 where-clause에 의해 하위 집합이됩니다. 이것은 PK 열 (rowname, SQLite DB를 채우는 데 사용한 R 테이블의 열 이름에서 생성됨)을 리턴했습니다. 문제는 어두운 부분에서 지적한 바와 같이 메타 테이블에 지오메트리 참조가 필요합니다. 이것은 QGIS가 공간 테이블을 식별하기 위해 사용하는 것이며, 뷰에는 해당 메타 테이블에 레코드가 없습니다.
Bryan Goodrich

알아 둘만 한. 질문을하고 좋은 답변을 가져 주셔서 감사합니다
RyanKDalton 21:53에

2

현재 geometry_columns에 뷰를 등록하려면 (2015 년) 다음과 같이 추가 필드 'read_only'가 필요한 것 같습니다.

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry', 1);

1
지원 문서에 대한 링크를 추가해 주시겠습니까? 감사!
underdark

2

SpatialLite 4.x의 경우 read_only열 추가 와 삽입 된 모든 값을 소문자로 변경 하여 원래 답변에 두 가지 변경이 필요합니다 . 업데이트 된 SQL은 다음과 같습니다.

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'rowid', 'local_councils', 'geometry', 1);

read_only입력란에는 0 또는 1이 허용됩니다 (자세한 설명은 Google 그룹스 의 Sandro Furieri의 의견 참조 ).

이러한 변경 사항 및 기타 4.x 변경 사항에 대한 자세한 내용은 4.0으로 전환 위키 에서 확인할 수 있습니다 .


1
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

NB : nameOfView 및 geometryTable 만 바꾸기

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.