將空間數(shù)據(jù)導(dǎo)入PostGIS存儲(chǔ)和管理稠屠,是比較常見(jiàn)的需求操禀,PostGIS本身提供了shp2pgsql和pgsql2shp進(jìn)行Shapefile和PostGIS的互轉(zhuǎn)涧窒,如果是其他格式的空間數(shù)據(jù)就無(wú)能為力肌似。我們可以使用QGIS和GDAL來(lái)做數(shù)據(jù)的互操作棵里,QGIS非常好用义黎,但我們有時(shí)候需要自己開(kāi)發(fā)應(yīng)用禾进,GDAL優(yōu)勢(shì)就體現(xiàn)出來(lái)了,其實(shí)廉涕,QGIS也是使用了GDAL泻云。這篇文章咱就說(shuō)說(shuō)利用GDAL的數(shù)據(jù)互操作工具ogr2ogr,將數(shù)據(jù)導(dǎo)入PostGIS中的那些事狐蜕。
轉(zhuǎn)換字段名稱
可通過(guò)-sql
轉(zhuǎn)換導(dǎo)入PostgreSQL的字段名稱宠纯,我們可以將原始數(shù)據(jù)看成是數(shù)據(jù)庫(kù)中的一張表,-sql
參數(shù)指定了一個(gè)標(biāo)準(zhǔn)的sql語(yǔ)句层释,該語(yǔ)句執(zhí)行的結(jié)果會(huì)被保存到結(jié)果數(shù)據(jù)中婆瓜。整個(gè)過(guò)程可以類比PostgreSQL中的create table as select ...
語(yǔ)句。
例如入庫(kù)一個(gè)shapefile文件,數(shù)據(jù)原有的字段是id廉白,name个初,age,現(xiàn)在想入庫(kù)的時(shí)候name改為s_name猴蹂,命令如下:
ogr2ogr -sql “select id, name as s_name, age from layer_name”
數(shù)據(jù)的字段列表可以通過(guò)ogrinfo 判斷院溺。
轉(zhuǎn)換數(shù)據(jù)字段類型
不同于PostgreSQL中的數(shù)據(jù)類型,ogr有一套自己的數(shù)據(jù)類型系統(tǒng):
- character磅轻,對(duì)應(yīng)PostgreSQL中的
Character Types
珍逸; - float,對(duì)應(yīng)PostgreSQL中的
double precision
聋溜; - numeric谆膳,可自定義精度的數(shù)值類型,可對(duì)應(yīng)PostgreSQL中的
numeric
撮躁; - integer摹量,對(duì)應(yīng)PostgreSQL中的
integer
; - date馒胆,對(duì)應(yīng)PostgreSQL中的
date
; - time凝果,對(duì)應(yīng)PostgreSQL中的
time
祝迂; - timestamp,對(duì)應(yīng)PostgreSQL中的
timestamp
器净。
使用COLUMN_TYPES
參數(shù)可以指定數(shù)據(jù)類型轉(zhuǎn)換列表型雳,不同字段使用逗號(hào)分隔。例如我要將一個(gè)shapefile導(dǎo)入PostgreSQL中山害,更改原為int類型的column1
為float纠俭,那么命令可以這么寫:
ogr2ogr -f "Postgresql" PG:"host=localhost port=5432 dbname=test user=user password=pass" -lco COLUMN_TYPES="column1=float" file.shp
如果字段的原始類型不能轉(zhuǎn)換成指定的類型,會(huì)報(bào)錯(cuò)浪慌。
添加轉(zhuǎn)換進(jìn)度
ogr2ogr使用-progress
可以獲得粗略的進(jìn)度信息冤荆,每2.5%就會(huì)輸出一次進(jìn)度。
關(guān)于導(dǎo)入數(shù)據(jù)內(nèi)容亂碼
PostgreSQL是以u(píng)tf8編碼存儲(chǔ)數(shù)據(jù)的权纤,客戶端也默認(rèn)以u(píng)tf8讀取內(nèi)容钓简,然后以u(píng)tf8寫入到數(shù)據(jù)庫(kù)。如果待輸入的文件內(nèi)容編碼非utf8汹想,那么導(dǎo)入數(shù)據(jù)庫(kù)的內(nèi)容外邓,也會(huì)亂碼。
解決問(wèn)題的方法自然就是讓ogr2ogr以正確的編碼讀取文件內(nèi)容古掏,然后再以u(píng)tf8編碼輸入到PostgreSQL损话。ogr2ogr會(huì)根據(jù)PGCLIENTENCODING環(huán)境變量指定的編碼讀取內(nèi)容,因此我們可以在執(zhí)行ogr2ogr入庫(kù)命令之前,可以先設(shè)置該環(huán)境變量為文件內(nèi)容編碼丧枪,這樣光涂,導(dǎo)入的數(shù)據(jù)便不會(huì)再出現(xiàn)亂碼問(wèn)題。