# GIS数据处理一_使用PostGIS+QGIS

# 介绍

这里我遇到了一个需求,需要将SQLite的.db数据库中GIS数据导出成shapefile文件

数据库的表结构如下所示,这里存储的是wkt格式的矢量数据

image-20220412225025634

# 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))
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))
1
2
3
4
5
6
7
8
9

# WKB格式

WKB采用二进制进行存储,更方便于计算机处理,因此广泛运用于数据的传输与存储,以二位点Point(1 1)为例:

01 0100 0020 E6100000 000000000000F03F 000000000000F03F
1

# 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);
1
2
3
4

# 思路分析

数据表中存储的是wkt格式的数据,这个数据没法直接转换成shapefile文件,需要转换

这里我想到了两种方式:

# 使用GeoTools

  1. 使用Java的geoTools工具包
  2. 使用java链接到SQLite中,将数据查出
  3. 再用geotools将标准的wkt格式数据转换为geotools中定义的geometry类型数据
  4. 然后借助geotools的方法将数据转换为shapefile文件(这个教程就比较多了)

# 使用PostGIS

  1. 将SQLite数据库中数据表导出成SQL语句
  2. 再插入到postgresql数据库中
  3. 借助postgis这个扩展中的方法,把wkt格式转化为postgis中的geometry格式数据
  4. 再使用QGIS链接postgis数据库,将数据表载入到QGIS中
  5. 使用QGIS的另存为方法将数据导出成shapefile

使用这两种方式都是可以实现wkt-》shapefile文件的这个转换目的

# 具体步骤

这里我使用了第二种方式(由于我比较熟悉postgis的使用)

# 数据导出到PostgreSQL

这里我已经将数据导入到PostgreSQL中了,过程我这里就不详述了,就是数据库表导出SQL再写入,使用Navicat就可以实现

image-20220413000228012

# wkt转geometry

这里使用PostGIS的方法将wkt转换为geometry

新建geom字段存储geometry数据

image-20220413000651506(

转换方法如下:(我这里数据的坐标系为4528,根据具体数来修改坐标系)

update "tablename"
set geom= ST_AsGeoJSON(ST_GeomFromText(
        "TBFW",
        4528));
1
2
3
4

转换后的数据如下,这样QGIS就能识别到该图层了

image-20220413000821507

# QGIS载入PostGIS数据库

在QGIS左侧菜单中,可以找到PostGIS的连接按钮

image-20220413091526024

右击新建连接

image-20220413091725156

填写数据库连接信息

image-20220413091740303

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

image-20220413091855105

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

image-20220413092315776

# 将数据另存为shapefile文件

右击图层,选择导出-》要素另存为

image-20220413092558450

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

image-20220413092634010

导出结果如下所示:

image-20220413092725363

# 总结

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

上次更新时间: 2022年5月20日星期五上午11点16分