Naposledy aktivní 1756701004

Revize e1c8bef1ffb8cf3f88359a0ea6a92c4eb4f2cd6e

inValid Geometry 해결.md Raw

postgresql의 ST_Intersects()를 사용중 아래와 같이 오류가 발생했다.

오류 발생: SQLSTATE = XX000, SQLERRM = GEOSIntersects: TopologyException: side location conflict at 298600.73221767566 264940.33694780665. This can occur if the input geometry is invalid.

유효하지않은 geom이 존재한다고 한다. ST_IsValid()함수를 이용하여 어떤놈들인지 찾아본다.

select pnu from lsmd_cont_ldreg where ST_IsValid(geom)

이놈들을 ST_MakeValid()이용해 유효한 geom으로 업데이트해준다. (단, geom이 없어질수도, 하나의pnu에 여러 geom이 생기거나 예기치 못한 방식으로 처리될 수 있으니 주의바람)

update lsmd_cont_ldreg
set geom = ST_MakeValid(geom)
where not ST_IsValid(geom)

깔끔하게 해결될 줄 알았지만 여전히 동일한 오류가 발생했다. 나머지 유효하지않은 데이터들은 약간의 보정값을 주어 해결했다.

UPDATE lsmd_cont_ldreg a
SET geom = b.cleaned_geom
FROM (
    SELECT pnu, ST_Union(ST_Buffer(geom, 0.0000001)) AS cleaned_geom
    FROM lsmd_cont_ldreg
    WHERE pnu IN (SELECT pnu FROM invalid_ldreg)
    GROUP BY pnu
) b
WHERE a.pnu = b.pnu;