在昨天的文章中,我們要把資料倒入PostGIS前,需要使用geoalchemy2把坐標資料轉成WKT element
,今天來理解一下WKT
WKT
WKT的全寫是(Well Known Text),是OGC SFS(Simple Features Interface Standard)對於資料庫中GIS資料的架構定義,全文可從連結下載,另外SQL語法對於GIS處理的定義,也是在這份文件中定義,大多數GIS資料庫都有提供SFS的基本定義及功能。
有關SFS的幾何類型參考下圖:
(取自OGC)
WKT是以文字方式表達幾何,以下從網站上擷取一些類型(取自WIKI)
WKB
WKB(Well Known Binary)顧名思義就是將WKT加以binary編碼,[1]有對於WKB位數儲存有一些說明,而WKB主要是讓WKT更加緊湊。
WKT與GeoDataFrame
PostGIS的空間屬性是根據OGC SFS,
前幾天有提到Geopandas的空間資料是使用shapely的定義,昨天的範例主要是透過geoalchemy2將shapely的geometry轉為PostGIS的geometry,以方便幾何資料的ORM1
2
3
4
5from geoalchemy2 import Geometry, WKTElement
gdf=gpd.read_file('data/Rail/Rail.shp',encoding='utf-8')
gdf['geom'] = gdf['geometry'].apply(lambda x: WKTElement(x.wkt, srid=3826))
gdf.drop('geometry', 1, inplace=True)
type(gdf.at[0,'geom'] )
結果為geoalchemy2.elements.WKTElement
to_sql1
2
3
4from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:postgres@localhost:5432/public')
gdf.to_sql('rail', engine, if_exists='replace', index=False, schema='public'
,dtype={'geom': Geometry('LINESTRING', srid= 3826)})
PostGIS
OGC SFS有定義幾何運算的實踐,在PostGIS可以進行操作,大致包含了
(取自OGC)
我們把SQL語法執行並直接用GeoDataFrame接,例如我們要對每一個線段做buffer1
2
3sql='select ST_buffer(rail.geom,0.0001) as geometry from public.rail '
df = gpd.GeoDataFrame.from_postgis(sql, engine, geom_col='geometry' )
df
而其他的幾何操作,可以參考PostGIS Reference