이언배 연구노트

[Python + PostGIS] Dataframe 의 geometry 를 포함해서 PostGIS로 본문

Python

[Python + PostGIS] Dataframe 의 geometry 를 포함해서 PostGIS로

이언배 2025. 3. 19. 17:18

 

Dataframe 은 어렵다

그래서 geodataframe 은 더 어렵다

그래서 geomdataframe 을 postgis로 보내는 건 더 어렵다.

 

일단, dataframe 가 geometry 를 가지고 있다고 가정하자.

csv, sql로 불러온 geometry column 은 'text' 형태로 불러진다.

 

우리는 text 를 geometry 로 바꿔줄 필요가 있다.

 

# text 형태의 geometry --> geometry object 형태의 geometry
# 내 데이터는 '01060000203B1400000100000001030000000' 이렇게 생겼었다. fromhex 를 쓸 때 주의할 것

df['geom'] = df['geom'].apply(lambda x: wkb.loads(bytes.fromhex(x)))

 

그리고 dataframe 은 멍청해서 저 geometry 도 이해 못하기 때문에, 'geodataframe' 으로 바꿔줘야

geometry column 을 품을 수 있다.

 

df['geom'] = df['geom'].apply(lambda x: wkb.loads(bytes.fromhex(x)))
gdf = gpd.GeoDataFrame(df, geometry = 'geom', crs = 'EPSG:5179') # 'geom' 칼럼을 인정받게 해주자

 

이제 우리는 postgres 로 보내줄 준비가 되었다.

 

지난번에 보였던 대로,

python --> PostGRES 는 sqlalchemy 를 쓰는 게 좋다

 

from sqlalchemy import create_engine

#####################  Connection 을 세팅하자
account_identifier = '목표 컴퓨터' ## 나는 여기에 IP 주소를 입력했더니 통과되었다. localhost도 될듯
user = '아이디' ## Database 생성 시에 사용했던 ID 를 넣자
password = '패스워드'  ##본인의 패스워드도 넣자
DB_name = '데이터베이스이름' ##접속하고자 하는 DB의 이름을 넣자
conn_string = f"postgresql://{user}:{password}@{account_identifier}/{DB_name}"
engine = create_engine(conn_string) ## 위 작성된 string 을 바탕으로 connection 을 위한 instance 를 만들었다.

#####################  Connection 을 세팅하자
df['geom'] = df['geom'].apply(lambda x: wkb.loads(bytes.fromhex(x)))
gdf = gpd.GeoDataFrame(df, geometry = 'geom', crs = 'EPSG:5179')

# 여기서 흥미로운 건, 보통 sql로 보낼 때에는 'to_sql' 을 썼었는데, geometry 가 추가되고 'to_postgis' 함수를 쓴다는 거다
gdf.drop(columns = 'index').to_postgis('geo_data', con = engine, chunksize = 1000, if_exists = 'replace')

 

728x90