การนำเข้าข้อมูลเวกเตอร์ (Vector data) เข้าสู่ฐานข้อมูล PostGIS

Chingchai Hoomhong
MAPEDIA BLOG
Published in
5 min readOct 21, 2019

วิธีการนำเข้าข้อมูลเวกเตอร์ เช่นการนำเอาข้อมูล ESRI Shapefile เข้าไปในฐานข้อมูล PostGIS นั้นมีหลายวิธีครับ แล้วแต่ว่าผู้ใช้จะสะดวกวิธีไหน วันนี้ผมจะยกตัวอย่างทั้งหมด 4 วิธีด้วยกัน มีดังนี้ครับ

1.การนำเข้าด้วย shp2pgsql ผ่าน Command-line

2.นำเข้าด้วย ogr2ogr ผ่าน OSGeo4W Shell

3.นำเข้าด้วย PostGIS 2.0 Shapefile and DBF Loader Exporter

4.นำเข้าด้วย DB Manager ในโปรแกรม QGIS

1.การนำเข้าด้วย shp2pgsql ผ่าน Command-line

วิธีการนี้จะเปลี่ยนข้อมูล *.shp ให้อยู่ในรูป *.sql แล้วก็เอาไป run ใน pgAdmin

shp2pgsql -I -s 32647 -W "UTF-8" yourshapefile.shp schema.tablename > outputname.sql

รูปแบบและ Options ที่สามารถกำหนดได้

USAGE: shp2pgsql [<options>] <shapefile> [[<schema>.]<table>]
OPTIONS:
-s [<from>:]<srid> Set the SRID field. Defaults to 0.
Optionally reprojects from given SRID (cannot be used with -D).
(-d|a|c|p) These are mutually exclusive options:
-d Drops the table, then recreates it and populates
it with current shape file data.
-a Appends shape file into current table, must be
exactly the same table schema.
-c Creates a new table and populates it, this is the
default if you do not specify any options.
-p Prepare mode, only creates the table.
-g <geocolumn> Specify the name of the geometry/geography column
(mostly useful in append mode).
-D Use postgresql dump format (defaults to SQL insert statements).
-e Execute each statement individually, do not use a transaction.
Not compatible with -D.
-G Use geography type (requires lon/lat data or -s to reproject).
-k Keep postgresql identifiers case.
-i Use int4 type for all integer dbf fields.
-I Create a spatial index on the geocolumn.
-m <filename> Specify a file containing a set of mappings of (long) column
names to 10 character DBF column names. The content of the file is one or
more lines of two names separated by white space and no trailing or
leading space. For example:
COLUMNNAME DBFFIELD1
AVERYLONGCOLUMNNAME DBFFIELD2
-S Generate simple geometries instead of MULTI geometries.
-t <dimensionality> Force geometry to be one of '2D', '3DZ', '3DM', or '4D'
-w Output WKT instead of WKB. Note that this can result in
coordinate drift.
-W <encoding> Specify the character encoding of Shape's
attribute column. (default: "UTF-8")
-N <policy> NULL geometries handling policy (insert*,skip,abort).
-n Only import DBF file.
-T <tablespace> Specify the tablespace for the new table.
Note that indexes will still use the default tablespace unless the
-X flag is also used.
-X <tablespace> Specify the tablespace for the table's indexes.
This applies to the primary key, and the spatial index if
the -I flag is used.
-? Display this help screen.
An argument of `--' disables further option processing.
(useful for unusual file names starting with '-')

1.1 เปิด Command Prompt แล้วเข้าไปที่ path > C:\Program Files\PostgreSQL\10\bin

ตัวอย่างรูปแบบคำสั่ง

C:\Program Files\PostgreSQL\10\bin>shp2pgsql.exe -I -s 32647 -W "UTF-8" c:\Workspace\pl_amphoe.shp public.plk_amphoe > c:\Workspace\plk_amphoe.sql

1.2 จะได้ไฟล์ plk_amphoe.sql ดังภาพด้านล่าง

1.3 ขั้นตอนต่อไป จะต้องนำเอาไฟล์ plk_amphoe.sql นี้ไปรันใน pgAdmin4

1.4 ผลลัพธ์ที่ได้

Note: อีกวิธีนึงง่ายและสะดวกมากๆ เราสามารถเพิ่มข้อมูลผ่าน command-line ได้เลย โดยไม่ต้องใช้ผ่าน pgAdmin4

ตัวอย่างรูปแบบคำสั่ง

psql -d stdb -U postgres -f C:\Workspace\plk_amphoe.sql

ผลลัพธ์ที่ได้

C:\Program Files\PostgreSQL\10\bin>psql -d stdb -U postgres -f C:\Workspace\plk_amphoe.sql
Password for user postgres:
SET
SET
BEGIN
CREATE TABLE
ALTER TABLE
addgeometrycolumn
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -
public.plk_amphoe.geom SRID:32647 TYPE:MULTIPOLYGON DIMS:2
(1 row)
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
CREATE INDEX
COMMIT
ANALYZE

2.นำเข้าด้วย ogr2ogr ผ่าน OSGeo4W Shell

2.1 ในตัวอย่างนี้ผมใช้ GDAL/OGR จากตัวแพ็คเก็จของ OSGeo4W Shell ในโฟลเดอร์ QGIS 3.4

2.2 เริ่มพิมพ์ชุดคำสั่งจากตัวอย่างด้านล่างกันเลย

ogr2ogr -a_srs EPSG:32647 -lco "SCHEMA=public" -lco GEOMETRY_NAME=geom -lco FID=gid -f PostgreSQL "PG:host=localhost port=5432 user=postgres dbname=stdb password=secret" -nlt PROMOTE_TO_MULTI -nln public.plk_tambon c:\Workspace\Vector\pl_tambon.shp -overwrite

2.3 ผลลัพธ์ที่ได้

3.นำเข้าด้วย PostGIS 2.0 Shapefile and DBF Loader Exporter

3.1 เปิดโปรแกรม PostGIS 2.0 Shapefile and DBF Loader Exporter

3.2 คลิกที่ View connection detials… จากนั้นทำการระบุ PostGIS Connection เพื่อทำการเชื่อมต่อกับฐานข้อมูลที่ต้องการ แล้วคลิก OK

ทำการเชื่อมต่อฐานข้อมูล stdb สำเร็จดังภาพด้านล่าง

3.3 คลิกปุ่ม Add File เพื่อ Browse ไปหาข้อมูล Shapfile เราเพื่อเลือกและนำเข้าข้อมูล จากนั้นคลิก Import

3.4 นำเข้าข้อมูลสำเร็จ

3.5 ผลลัพธ์ที่ได้

4.นำเข้าด้วย DB Manager ในโปรแกรม QGIS

4.1 เปิดโปแกรม QGIS และทำการเพิ่มชั้นข้อมูล Shapefile ที่ต้องนำเข้าฐานข้อมูลขึ้นมาดังภาพ

4.2 ไปที่เมนู Database > DB Manager…

จากนั้นคลิกเลือกที่ฐานข้อมูล PostGIS > stdb

4.3 คลิกที่ Import Layer/File… จะปรากฏหน้าต่างใหม่ขึ้นมา ให้เราทำการระบุค่าข้อมูลเพื่อทำการนำเข้า shapefile สู่ฐานข้อมูล stdb ดังภาพ แล้วคลิก OK

4.4 นำเข้าข้อมูลสำเร็จ

4.5 ผลลัพธ์ที่ได้

--

--