inValid Geometry 해결.md
· 1.2 KiB · Markdown
Неформатований
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()함수를 이용하여 어떤놈들인지 찾아본다.
```sql
select pnu from lsmd_cont_ldreg where not ST_IsValid(geom)
```
이놈들을 ST_MakeValid()이용해 유효한 geom으로 업데이트해준다.
(단, geom이 없어질수도, 하나의pnu에 여러 geom이 생기거나 예기치 못한 방식으로 처리될 수 있으니 주의바람)
```sql
update lsmd_cont_ldreg
set geom = ST_MakeValid(geom)
where not ST_IsValid(geom)
```
깔끔하게 처리될 줄 알았지만 여전히 동일한 오류가 발생했다.
나머지 유효하지않은 데이터들은 약간의 보정값을 주어 해결했다.
```sql
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;
```
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 not 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;