이상한 짓

세계지도 shape 파일을 Oracle DB에 저장하기

행복한휴학생 2019. 11. 9. 21:13

1.   데이터

1)    TM_WORLD_BOUNDERS_SIMPL-0.3

https://www.igismap.com/download-free-shapefile-maps/

지구의 구형을 ‘Equirectangular projection’을 통해 2차원 지도로 만들고 각 나라에 대한 boundaryshape파일로 제공한다.

2)    Majorrivers_0_0

https://datacatalog.worldbank.org/dataset/major-rivers-world

지구에 존재하는 주요 강(river)들을 shape파일로 제공한다.

2.   데이터 가공 및 입력

일단 본 데이터들은 shape 파일이기때문에 이를 oracle table에 입력시키기 위해서는 데이터 가공이 필요하다.

따라서 shape파일에서 csv파일을 추출하여 각 나라의 attribute를 확인하고 xml파일을 추출하여 각 나라의 polygon 좌표를 추출한다. EDS Viewer 이용

이 데이터들을 oracle 질의문으로 가공하는데 이때 python 언어를 사용한다.

1)    shp파일에서 추출한 csv파일 attribute가 들어있다.

2)    shp파일에서 추출한 xml파일 – polygon의 좌표가 들어있다.

3)    SQL_Gen.py

csv파일과 xml파일을 읽어 이를 SQL value insert문으로 변환시켜준다.

 

 

polygon의 크기가 너무 커지면 SDO_ORDINATE_ARRAY안에 한번에 넣을 수 없는 상황이 발생하는데 이 때는 PL/SQL문을 사용하여 ARRAY EXTEND를 사용한다.

이렇게 가공된 SQL 문을 Oracle SQL Developer 프로그램을 통해서 Table에 삽입한다.

 

(LANDS 삽입 하나의 독립된 land를 기준으로 삽입. 한 나라가 여러개의 land를 가질 수 있음.)

 

 

 

 

(River 삽입)

 

 

 

 

 

3.   질의

1)    각 나라의 넓이 구하기

-      질의문

-      질의 결과

 

2)    미국을 거쳐 흘러가는 모든 강의 이름 구하기

-      질의문

계산 속도를 최적화 하기위해 먼저 미국에 속해있는 land들을 US라는 하나의 view로 묶었고 그 후 미국의 MBR disjoint하지 않는 강을  US_river라는 view로 추려내었다. 마지막으로 정확히 두 view 사이에 어떤 interact가 있는지 질의하여 최종적으로 미국에서 흐르는 강의 정보를 얻을 수 있었다.

-      질의 결과