鐵人賽2019 Day16 WKT與PostGIS的運算

  1. 1. WKT
  2. 2. WKB
  3. 3. WKT與GeoDataFrame
  4. 4. PostGIS

在昨天的文章中,我們要把資料倒入PostGIS前,需要使用geoalchemy2把坐標資料轉成WKT element,今天來理解一下WKT

WKT

WKT的全寫是(Well Known Text),是OGC SFS(Simple Features Interface Standard)對於資料庫中GIS資料的架構定義,全文可從連結下載,另外SQL語法對於GIS處理的定義,也是在這份文件中定義,大多數GIS資料庫都有提供SFS的基本定義及功能。

有關SFS的幾何類型參考下圖:
https://ithelp.ithome.com.tw/upload/images/20181031/20107816auFnhEeYJX.png
(取自OGC)

WKT是以文字方式表達幾何,以下從網站上擷取一些類型(取自WIKI)
https://ithelp.ithome.com.tw/upload/images/20181031/20107816yTOer2h25Y.png

WKB

WKB(Well Known Binary)顧名思義就是將WKT加以binary編碼,[1]有對於WKB位數儲存有一些說明,而WKB主要是讓WKT更加緊湊。

WKT與GeoDataFrame

PostGIS的空間屬性是根據OGC SFS,
前幾天有提到Geopandas的空間資料是使用shapely的定義,昨天的範例主要是透過geoalchemy2將shapely的geometry轉為PostGIS的geometry,以方便幾何資料的ORM

1
2
3
4
5
from 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_sql

1
2
3
4
from 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可以進行操作,大致包含了
https://ithelp.ithome.com.tw/upload/images/20181031/20107816tdHE4yn5MT.png
(取自OGC)

我們把SQL語法執行並直接用GeoDataFrame接,例如我們要對每一個線段做buffer

1
2
3
sql='select ST_buffer(rail.geom,0.0001) as geometry from public.rail '
df = gpd.GeoDataFrame.from_postgis(sql, engine, geom_col='geometry' )
df

https://ithelp.ithome.com.tw/upload/images/20181031/20107816kajGxaeFtb.png

而其他的幾何操作,可以參考PostGIS Reference