一、加载空间数据
PostGIS受到各种库和应用程序的支持,为加载数据提供了许多选项。
我们将首先从数据库备份文件加载我们的工作数据,然后回顾使用常用工具加载不同GIS数据格式的一些标准方法。
1.1 加载备份文件
1.在PgAdmin浏览器中,右键单击nyc数据库图标,然后选择Restore…选项。
image
2.浏览到数据目录的位置,并选择nyc_data.backup 文件 image
3.单击Restore options选项卡,向下滚动到Do not save部分,并将Owner切换为Yes。 image
4.单击Restore按钮。 数据库恢复应该运行到完成,没有错误。 image
5.加载完成后,右键单击nyc数据库,并选择Refresh选项来更新关于数据库中存在哪些表的客户端信息。 image
1.2 用ogr2ogr加载
ogr2ogr是一个命令行实用程序,用于在GIS数据格式(包括公共文件格式和公共空间数据库)之间转换数据。
Windows:
- ogr2ogr的构建版本可以从GIS Internals.下载。
- ogr2ogr是作为QGIS安装的一部分,可以通过QGIS4W Shell菜单访问
- 可以从MS4W下载ogr2ogr的构建版本。
MacOS: - 如果您安装了Postgres。 然后你会在/Applications/Postgres.app/Contents/Versions/*/bin目录中找到ogr2ogr 。
- 或者,你可以从KyngChaos下载一个独立的GDAL版本并安装它。
- 最后,如果你已经安装了HomeBrew,你可以安装gdal包来访问ogr2ogr
Linux: - 如果您通过包安装Linux,那么ogr2ogr应该已经作为gdal或libgdal包的一部分安装在您的PATH中。
postgis讲习班数据目录包括一个2000/子目录,其中包含2000年人口普查的形状文件,这些文件已被2010年人口普查的数据淘汰。 我们可以使用这些文件来练习数据加载,以避免与已经使用备份文件加载的数据产生名称冲突。
export PGPASSWORD=mydatabasepassword
ogr2ogr \
-nln nyc_census_blocks_2000 \
-nlt PROMOTE_TO_MULTI \
-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \
Pg:'dbname=nyc host=localhost user=pramsey port=5432' \
nyc_census_blocks_2000.shp
ogr2ogr有大量的选项,我们在这里只使用其中的一小部分。 下面是对该命令的逐行解释。
export PGPASSWORD=mydatabasepassword
我们不是在连接字符串中传递密码,而是将它放在环境中,这样当命令运行时,它就不会在进程列表中显示。
ogr2ogr \
可执行文件的名字! 您可能需要确保可执行文件的位置在您的PATH中,或者使用可执行文件的完整路径,这取决于您的设置。
-nln nyc_census_blocks_2000 \
nln选项代表“新层名称”,并设置将在目标数据库中创建的表名称。
-nlt PROMOTE_TO_MULTI \
nlt选项代表“新图层类型”。 特别是对于形状文件的输入,新的图层类型通常是“multi-part geometry”,所以需要提前告诉系统使用“MultiPolygon”而不是“Polygon”作为几何类型。
-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \
lco选项代表“图层创建选项”。 不同的驱动程序有不同的创建选项,我们在这里为PostgreSQL驱动程序使用了三个选项。
- GEOMETRY_NAME 设置几何列的列名。 我们更喜欢“geom”而不是默认值,这样我们的表就可以匹配workshop的标准列名。
- FID 设置主键列名。 同样,我们更喜欢“gid”,这是workshop使用的标准。
- PRECISION 控制数据库中数字字段的表示方式。当加载一个形状文件时,默认是使用数据库“numeric”类型,这比简单的数字类型(如“integer”和“double precision”)更精确,但有时更难处理。我们使用“NO”来关闭“numeric”类型。
Pg:'dbname=nyc host=localhost user=pramsey port=5432' \
在ogr2ogr中,参数的顺序大致是:可执行文件、选项、目标位置、源位置。所以这是目标位置,PostgreSQL数据库的连接字符串。“Pg:”部分是驱动程序名,然后连接字符串包含在引号中(因为它可能有嵌入的空格)。
nyc_census_blocks_2000.shp
本例中的源数据集是我们正在读取的形状文件。在一个调用中读取多个层是可能的,方法是将连接字符串放在这里,然后在它后面添加一列层名,但在本例中,我们只有一个要加载的形状文件。
1.3 shapefiles 那是什么?
你可能会问自己——“这个形状的东西是什么?”一个" shapefile "通常指的是一个文件集合,文件带有.shp, .shx, .dbf和其他扩展名,这些扩展名都是基于一个通用前缀名(例如,nyc_census_blocks)。实际的shapefile与扩展名为.shp的文件特别相关。但是,如果没有所需的支持文件,.shp文件本身是不完整的。
必须包含的的文件:
-
.shp—形状格式;要素几何本身
-
.shx—形状索引格式;要素几何的位置索引
-
.dbf—属性格式;在dBase III中,每个形状的列表属性
可选的文件: -
.prj—投影格式;坐标系统和投影信息,一个使用wkt文本格式描述投影的纯文本文件
shp2pgsql实用程序将形状数据从二进制数据转换为一系列SQL命令,然后在数据库中运行以加载数据,从而使形状数据在PostGIS中可用。
1.4 用shp2pgsql加载
shp2pgsql将Shapefile转换为SQL。它是一个转换实用程序,是PostGIS代码库的一部分,随PostGIS软件包一起发货。如果您在计算机上本地安装PostgreSQL,您可能会发现shp2pgsql已经随它一起安装,并且可以在安装的可执行目录中找到它。
与ogr2ogr不同,shp2pgsql并不直接连接到目标数据库,它只是发出与输入形状文件等效的SQL。将SQL传递给数据库由用户决定,可以通过“管道”,也可以通过将SQL保存到文件并加载它。
下面是一个示例调用,加载与之前相同的数据:
export PGPASSWORD=mydatabasepassword
shp2pgsql \
-D \
-I \
-s 26918 \
nyc_census_blocks_2000.shp \
nyc_census_blocks_2000 \
| psql dbname=nyc user=postgres host=localhost
下面是对该命令的逐行解释。
shp2pgsql \
可执行程序!它读取源数据文件,并发出SQL,该SQL可以被定向到文件或通过管道传输到psql,以直接加载到数据库中。
-D \
D标志告诉程序生成“dump格式”,这比默认的“insert格式”加载速度快得多。
-I \
I标志告诉程序在加载完成后在表上创建一个空间索引。
-s 26918 \
s标志告诉程序数据的“空间引用标识符(SRID)”是什么。本次测试的源数据都在“UTM 18”中,其SRID为26918(见下文)。
nyc_census_blocks_2000.shp \
要读取的源形状文件。
nyc_census_blocks_2000 \
在创建目标表时要使用的表名。
| psql dbname=nyc user=postgres host=localhost
实用程序正在生成一个SQL流。“|”操作符接受该流并将其作为psql数据库终端程序的输入。psql的参数只是目标数据库的连接字符串。
1.5 SRID 26918?这又是什么?
大多数导入过程是不言自明的,但即使是有经验的GIS专业人员也可能会遇到SRID。
“SRID”代表“空间参考标识符”。它定义了数据的地理坐标系统和投影的所有参数。SRID很方便,因为它将关于地图投影(可能相当复杂)的所有信息打包到一个数字中。
你可以通过在线数据库查看我们研讨会地图投影的定义,
或者直接在PostGIS内部查询spatial_ref_sys表。
SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;
PostGIS spatial_ref_sys 表是ogc标准表,它定义了数据库已知的所有空间参考系统。PostGIS附带的数据列出了超过3000个已知的空间参考系统,以及在它们之间转换/重新投射所需的细节。
在这两种情况下,您都可以看到26918空间引用系统的文本表示(为了清晰起见,此处进行了精心打印):
PROJCS["NAD83 / UTM zone 18N",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6269"]],
PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4269"]],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-75],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","26918"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]
如果你打开nyc_neighborhoods.prj 文件,您将看到相同的投影定义。
你从当地机构(如纽约市)收到的数据通常会出现在由“国家飞机”或“UTM”标记的本地投影中。我们的投影是“通用横切墨卡托(UTM) 18区北”或EPSG:26918。
网友评论