Shapefile文件批量导入数据库
一、序言
导航数据制作中元数据入库是非常重要的一个环节。本文简要介绍Shp文件批量导入数据库的思路及实现。
二、基本设计
2.1 方案
Shapefile导入数据库,常用数据库Postgresql、mysql、oracle等通用做法是先将shapefile转换成符合对应数据库的sql脚本(包含导入语句及数据记录),执行脚本将数据导入到对应数据库。
以Postgresql为例,Postgresql内置shp2pgsql.exe工具,支持将Shp数据转换成符合postgresql的sql脚本。使用psql执行生成的sql脚本(insert语句)将数据导入数据库。
备注:本文中shp2pgsql、psql均已加入系统环境变量PATH,因此可直接使用命令而不需要指定绝对路径。
2.2 数据流
图 1 数据流示意图
三、详细设计
3.1 导入一个Shapefile
3.1.1 Shapefile转储至SQL脚本
假设你已经拥有一个Shapefile格式文件集且文件存放在路径为SHP_PATH,目标SQL脚本路径为DEST_SQL。 如下图
SHP_PATH = F:\SHP
DEST_SQL = F:\TEMP_SQL
图 2 shapefile格式包含文件
Shp2pgsql命令将shapefile转成sql,命令如下(cmd环境):
> shp2pgsql -s 4326 -g the_geom -a -D -W utf-8 "SHP_PATH\Junction.dbf" junction > "DEST_SQL\Junction.sql"
Shp2pgsql基本用法: shp2pgsql shapfile.dbf table > table.sql //将shapfile.dbf 转储为table.sql
Shp2pgsql命令详细参数请参考帮助文档(在cmd环境下输入shp2pgsql 命令即可调出)。
--下文将详细介绍Junction.sql脚本内容--
打开sql脚本如下
图3 Junction.sql内容
SET CLIENT_ENCODEING TO UTF8;//设定客户端编码为UTF8
SET STANDARD_CONFIRMING_STRING TO ON; //打开标准字符串开关
BEGIN;
COPY "junction" ("id","name","name_eng","altname","altnam_eng","type","country","version",the_geom) FROM stdin;
//(服务端)从标准输 入COPY数据至表单”junction“
Data Record 一条记录
\.
COMMIT;//提交
SQL脚本里实际只有一条COPY语句和数据记录集,Shp2pgsql命令本质就是将shapefile中数据转储到SQL脚本称为数据记录集,COPY命令即将数据集拷贝至数据库表单。由此可知,只需(在服务端)运行此脚本,即可将数据导入数据库。下文将详细介绍如何执行此脚本及数据流的具体过程。
3.1.2 运行SQL脚本
Psql是一个以终端为基础的 PostgreSQL 前端。它允许你交互地键入查询,把它们发出给 PostgreSQL, 然后看看查询的结果。另外,输入可以来自一个文件。注:此段描述来源于Postgresql帮助文档
>psql -h 192.168.10.19 -d test -U postgres -f "DEST_SQL\Junction.sql" // 调用psql执行生成的sql文件,在数据库test中创建表单
psql -f filename 实际是打开文件,将命令逐行发送到服务端stdin。脚本内COPY命令指定stdin数据流,接着开始将文件中数据记录集发送到服务端stdin,服务端从stdin接收数据存储至数据库表单。注意:此过程要求数据库已创建,且已经存在表单junction。
3.2 批量导入Shapefiles
重点,待续
四、注释
五、参考