# GIS数据处理一_使用PostGIS+QGIS
# 介绍
这里我遇到了一个需求,需要将SQLite的.db数据库中GIS数据导出成shapefile文件
数据库的表结构如下所示,这里存储的是wkt格式的矢量数据

# WKT与WKB格式介绍
OpenGIS 规范定义了两种表示空间对象的标准方式:Well-Know Text (WKT) 形式和Well-Known Binary(WKB) 形式。WKT 和 WKB 都包含矢量几何要素的对象类型和构成对象的坐标的信息。WKT可读性强,更方便阅读识别,而在实际数据传输和存储中则以WKB形式。
# WKT格式
三种基本类型
点(POINT),线(LINESTRING), 面(POLYGON)
POINT(0 0)
POINT Z (0 0 0) Z 一般代表高程信息
POINT ZM (0 0 0 0) Z 一般代表高程信息,M一般代表其他信息如距离、温度、浓度等
LINESTRING(0 0,1 1,1 2)
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
2
3
4
5
6
7
8
9
三种扩展类型
多点(MULTIPOINT), 多线(MULTILINESTRING), 多个多边形(MULTIPOLYGON)
MULTIPOINT((0 0),(1 2))
MULTIPOINT Z ((0 0 0),(1 2 3))
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
2
3
4
5
6
7
8
9
# WKB格式
WKB采用二进制进行存储,更方便于计算机处理,因此广泛运用于数据的传输与存储,以二位点Point(1 1)为例:
01 0100 0020 E6100000 000000000000F03F 000000000000F03F
# WKT与WKB格式转换
这里使用了postgis
bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);
2
3
4
# 思路分析
数据表中存储的是wkt格式的数据,这个数据没法直接转换成shapefile文件,需要转换
这里我想到了两种方式:
# 使用GeoTools
- 使用Java的geoTools工具包
- 使用java链接到SQLite中,将数据查出
- 再用geotools将标准的wkt格式数据转换为geotools中定义的geometry类型数据
- 然后借助geotools的方法将数据转换为shapefile文件(这个教程就比较多了)
# 使用PostGIS
- 将SQLite数据库中数据表导出成SQL语句
- 再插入到postgresql数据库中
- 借助postgis这个扩展中的方法,把wkt格式转化为postgis中的geometry格式数据
- 再使用QGIS链接postgis数据库,将数据表载入到QGIS中
- 使用QGIS的另存为方法将数据导出成shapefile
使用这两种方式都是可以实现wkt-》shapefile文件的这个转换目的
# 具体步骤
这里我使用了第二种方式(由于我比较熟悉postgis的使用)
# 数据导出到PostgreSQL
这里我已经将数据导入到PostgreSQL中了,过程我这里就不详述了,就是数据库表导出SQL再写入,使用Navicat就可以实现

# wkt转geometry
这里使用PostGIS的方法将wkt转换为geometry
新建geom字段存储geometry数据

转换方法如下:(我这里数据的坐标系为4528,根据具体数来修改坐标系)
update "tablename"
set geom= ST_AsGeoJSON(ST_GeomFromText(
"TBFW",
4528));
2
3
4
转换后的数据如下,这样QGIS就能识别到该图层了

# QGIS载入PostGIS数据库
在QGIS左侧菜单中,可以找到PostGIS的连接按钮

右击新建连接

填写数据库连接信息

连接好后,就能查看到拥有geometry字段的表(也就是图层)

将图层拖入QGIS,如下所示:

# 将数据另存为shapefile文件
右击图层,选择导出-》要素另存为

选择需要导出的格式、坐标系和字符编码等

导出结果如下所示:

# 总结
不仅可以使用代码来处理学数据,会使用第三方的GIS工具也是可以很方便的来处理;具体的选择因业务来确定,如果是固定逻辑的业务推荐使用代码来操作,如果是临时处理下数据(没有固定的逻辑)就可以使用工具来处理,简化代码开发时间。