ST_Intersection을 사용하는 방법?


15

다음은 내가하려는 일에 대한 간략한 요약입니다. Postgres에 3 개의 테이블 'a'와 'b'가 있고 각각에 다각형 열이 있고 'c'에 점 열이 있습니다. 내가 여기서하려고하는 것은 'a', 'b'와 'c'사이의 기하학 교차점을 가져 와서 그러한 기하학을 OpenLayers 벡터 레이어에 표시하는 것입니다.

OpenLayers의 String에서 모든 종류의 지오메트리를 표시하는 방법을 이미 알고 있지만 PostGIS의 ST_Intersection 함수에 문제가 있습니다.

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

여기서 a.geom과 b.geom은 형상 열 이며이 오류 메시지가 나타납니다.

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

또한 ST_AsText를 사용하여 결과 지오메트리를 텍스트로 표현하려고했습니다.

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

그러나 그것은 나 에게이 오류 메시지를 보냅니다 :

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

내가 뭘 잘못하고 있는지 모르겠다. OpenLayers에 Polygons의 WKT가 표시되도록하고 싶습니다 .WKT에서 형상을 표시하는 방법은 다음과 같습니다.

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

업데이트 : 다음을 시도했습니다.

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

하지만 다음 오류 메시지가 나타납니다.

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

유효한 다각형 만 평가되고 있는지 확인하기 위해 isvalid를 추가했지만 오류가 ST_Intersection (a, b)에 있음을 알리고 있습니다 .a, b 및 c는 동일한 SRID를 가지고 있으므로 혼란 스럽습니다. 미안합니다. 너무 많이 묻지 만 PostGIS에 익숙하지 않아서 많이 귀찮게하지 않기를 바랍니다. 감사.


1
무엇을 SELECT PostGIS_Full_Version();반환합니까?
Mike T

POSTGIS = "1.4.0"GEOS = "3.1.0-CAPI-1.5.0"PROJ = "릴 4.7.1, 2009 년 9 월 23 일"USE_STATS
Uriel

답변:


8

교차점에서 NULL을 반환하면 실패한다고 생각합니다. 따라서 WKT를 작성하기 전에 실제로 교차점이 있는지 확인하는 where 절을 추가해야합니다.


나는 이것을 시도했다. 'AND ST_isvalid (b.geom) ='t '; 그러나 동일한 오류를 반환했습니다. ** ERROR : 함수 st_intersection (a, b)가 없습니다. 힌트 : 주어진 이름 및 인수 유형과 일치하는 함수가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수도 있습니다. ** 당신이 저를 도울 수 있다면 정말 고맙겠습니다.
Uriel

summary (a.geom) 및 summary (b.geom)을 사용하여 값을 조사하십시오.
underdark

요약 -------------------------- 1 개의 고리 고리 0을 가진 다각형 [BS]에는 4 개의 점이 있습니다. 1 개의 고리 고리를 가진 다각형 [BS]에는 5가 있습니다. 포인트 1 개의 링을 갖는 다각형 [BS] 링 0은 10 개의 포인트
를가집니다

하지 ST_Intersection에 (a, b) 예,이어야 ST_Intersection에 (a.geom, b.geom)
언더 다크

6

실마리는

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

오류 메시지에 따르면 st_intersection을 그런 식으로 사용할 수 없습니다. 다른 답변을 요약하면 다음과 같이 사용해야합니다.

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK 사용하는 것은 의미가 없다 ST_Overlaps와st_intersects를 같은 문장 들이 꽤 유사하다 .


4

다른 다각형 레이어 사이에서 테스트했는데 레이어 중 하나에 잘못된 형상이 있으면 실패했습니다. ST_isvalid (the_geom)를 사용하여 다각형의 유효성을 확인 했습니까? 열쇠 일 수도 있습니다.


나는 이것을 시도했다. 'AND ST_isvalid (b.geom) ='t '; 그러나 동일한 오류를 반환했습니다. ** ERROR : 함수 st_intersection (a, b)가 없습니다. 힌트 : 주어진 이름 및 인수 유형과 일치하는 함수가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수도 있습니다. ** 왜 작동하지 않는지 모르겠습니다
Uriel

2

다음과 같이 해보십시오 :

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

출처


나는 그것을 시도했지만 동일한 오류 메시지를 반환합니다 : 힌트 : 주어진 이름과 인수 유형과 일치하는 함수가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수도 있습니다.
Uriel

"INNER JOIN b ON ST_Intersection (a.geom, b.geom)"을 사용하면 어떻습니까?
CaptDragon

오류 : JOIN / ON의 인수는 유형 기하학이 아닌 부울 유형이어야합니다.
Uriel

shizer ...이 유형의 쿼리가 저에게 효과적이기 때문에 데이터 또는 무언가에 문제가 있어야합니다.
CaptDragon

AND ST_isvalid (a.geom) = 't'를 추가하고 ST_isvalid (b.geom) = 't';를 추가했습니다. 마지막에는 유효한 도형 만 평가하는 것이지만 오류는 st_intersection (a, b)에 있습니다.
Uriel

1

유효하지 않은 지오메트리를 제외하려고 시도했지만 작동하지 않았으므로 결국 모든 유효하지 않은 지오메트리를 삭제하고 다음을 사용해야했습니다.

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

보시다시피 ST_Intersection (a, b) 부분을 생략했으며 이것이 효과적이었습니다. 어쨌든 나를 도와 준 모든 사람 덕분에 내 선택에서 잘못된 지오메트리를 제외시키는 방법을 찾을 수 없었습니다. 밖에있다.


0

이 문제가 한 번있었습니다.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

이 방법을 사용하여이 오류를 해결할 수있었습니다.
- 사용 QGIS은
- 데이터베이스에서 추가 벡터 레이어는
- 오류 메시지에서 지점을 가지고 QGIS에서 검색
   "QuickWKT는"(플러그인)을 찾는 데 사용할 수 있습니다
- 그럼 당신은 문제가 선 스트링 볼
편집 모드를 켭니다 -
- 녹색 노드를 표시하려면 "노드 도구"를 선택하십시오 (노드 문제점)
-노드를 오버랩 노드에서 멀리 이동
-변경 사항 저장

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