문제

다음과 같은 간단한 테이블이 있습니다.

CREATE TABLE tbl_test
(
  id serial NOT NULL,
  poly polygon NOT NULL
)
WITH (OIDS=FALSE);

그런 다음 다각형으로 행을 삽입하려고합니다.

insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))

이 오류가 발생합니다.

"폴리"열은 유형 다각형이지만 발현은 형상 유형입니다.

절름발이입니다. 그래서 첫 번째 질문은 다음과 같습니다.

  1. 정말 캐스팅해야하나요?

어쨌든, 캐스팅 후에는 작동합니다. 그리고 지금 나는 간단한 st_contains 쿼리를하려고합니다.

select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))

오류가 발생합니다.

ERROR:  function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
                                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

내가 무엇을해야합니까?

다음 작품 :

select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))

그러나 그것은 아마도 두 주장이 유형의 형상이기 때문일 것입니다. 테이블 데이터에 대한 실제 쿼리는 작동하지 않습니다.

대답:

도이! 문제는 내가 만든 DB가 PostGIS 템플릿 DB를 기반으로하지 않았다는 것입니다 (따라서 관련 함수 및 지오메트리 열 테이블 등이 없었습니다). 결론적으로 PostGis가 DB에 수백 가지의 기능, 행 및 몇 개의 테이블을 추가해야하므로 GIS 지원이 완전히 절름발이임을 알 수 있습니다. 그것은 스키마의 백업이 훨씬 더 복잡하고 매우 오류가 발생하기 쉽습니다 (하늘은 addgeometryColumn을 호출하고 지오메트리 열을 직접 추가하는 것을 소홀히하는 경우 하늘을 금지합니다).

도움이 되었습니까?

해결책

다각형은 Postgis가 위에 구축하는 기본 Postgres 유형입니다. PostGIS 함수로 Geometry 열을 활성화합니다 select AddGeometryColumn(...). 그렇지 않으면 직선 다각형으로 작업하고 있습니다.

=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
    point    
-------------
 (2.25,3.25)
(1 row)

이것이 다각형의 중심점입니다

=> select circle(space) from gt where id = 1;
             circle             
--------------------------------
 <(2.25,3.25),1.93994028704315>
(1 row)

이것은 Postgres로 표현 된 다각형의 최소 경계 원입니다. circle 유형. 모든 기하학적 연산자가 문서화됩니다 여기 : http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html 기본 다각형에는 투영 데이터, SRID 등이 없으므로 PostGIS에서 작동하는 경우 사전 설정과 운이 좋은 경우에는 불이행 될 수 있습니다. 그러나 물론 하위 지구 규모로 단순히 기하학이 필요한 경우가 많이 있습니다.

다른 팁

좋아요, 이상하게도 다음 훨씬 더 간단한 구문 작업을 알았습니다.

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

그러나 저는 이러한 기능 세트와 연산자의 차이점을 알아 내기 위해 고군분투하고 있습니다. 이 짧은 구문 (실제로 OpenGIS를 준수하지 않음)이 동일한 공간 인덱스 등을 활용합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top