---
# System prepended metadata

title: 1.postgis概述
tags: [postgreSQL, postGIS]

---

# 1.postgis概述
- SQL為互動式語言(輸入指令即回傳)、內嵌式語言(可內嵌在其他語言，例如PHP)
- SQL有四大語言:資料查詢語言(DQL)、資料定義語言(DDL)、資料操縱語言(DML)、資料控制語言(DCL)
    - 資料定義語言 (DDL):CREATE、ALTER、DROP
    - 資料操縱語言 (DML):INSERT、UPDATE、DELETE
    - 資料查詢語言 (DQL):WHERE子句…
#### 1.1 座標紀錄與資料索引
- spatial data type:geometry、geography、raster、topology
- geometry:point、linestring、polygon、multipoint、multilinestring、multipolygon、**geometrycollection**
- OGC定義兩種描述幾何的格式，WKB(Well-Know Binary)、**WKT(Well-Know Text)**
- ++常用++索引:GiST、R-Tree
:::info
PostgreSQL支持索引接口:B-Tree、R-Tree、GiST、BRIN、hash、gin、[*sp-gist](https://github.com/digoal/blog/blob/master/201706/20170627_01_pdf_003.pdf)、brin、rum、bloom、zombodb、bitmap index、varbitx
:::
#### 1.2 patial_ref_sys表
- 存放OGC規範的空間參考，一般以SRID識別每個空間參考
- 空間參考的定義包含兩個部分：
    - srtext以字串描述的空間參考
    - proj4text以字串描述PROJ.4投影定義
#### 1.3 在POSTGIS創建一張表
- 使用FME
- 透過pgAdmin的query tool下指令，如下
```SQL=
DROP TABLE IF EXISTS public.polygontest; 
CREATE TABLE public.polygontest (
    name varchar(10),
    description varchar(50),
    town varchar(10),
    X double precision,
    Y double precision,
    gid serial PRIMARY KEY,
    geom geometry(Multipolygon,3826)
    );
CREATE INDEX idx_polygontest_geom ON public.polygontest USING GIST(geom); 
```
#### 1.4 POSTGIS geometry check
- 空間資料是否合法，有以下兩種方式:使用ST_IsValid()、在空間欄位中加入constraint
```SQL=
-- 方法1:使用ST_IsValid()
SELECT ST_IsValid('LINESTRING(0 0, 1 1)'), ST_IsValid('LINESTRING(0 0,0 0)')
-- 方法2:在既有表格的空間欄位中加入constraint
ALTER TABLE cities
ADD CONSTRAINT GeomValidCheck
CHECK (ST_IsValid(geom))
```
- 方法1適合用來檢查既有資料，CPU占用資源較大；方法2適合用在資料表變動頻率高，當我們嘗試輸入一個不合法的幾何型態時，會得到一個錯誤。

###### tags: `postgreSQL` `postGIS`