Postgis
2012年2月29日
2015年6月8日重构
2015年7月4日添加数据组织、数据操作
2015年7月6日添加运算符
下载与postgresql对应的postgis安装文件,按照提示进行安装;
postgis-pg91-setup-1.5.3-2.exe
安装完成postgis后,会出现template_postgis模板库和postgis数据库;
扩展sql文件应该在安装目录下,share/extension文件夹中。
可以通过以下几种方式加入扩展。
参考:http://www.xuebuyuan.com/1655300.html
或者使用PgAdmin,拓展-》添加拓展,添加sql文件名,自动生成sql,点击确定添加扩展。
安装完成后,可以看到扩展中的内容,postgis中导入大量函数。所有函数都可以在此处查看。
函数的定义可以架构-》函数中查看定义,详细说明请参见帮助文件。
加载postgis,创建相应的空间数据表。
在定义中选择模板,其它的选项根据需要填写;
成功创建后会在数据表中出现geometry_columns(地理数据)和spatial_ref_sys(所有的地理参考系统)两个表;
目标:将shp格式的矢量数据,存储到postgres中。
D:\Program Files\PostgreSQL\9.1\bin>shp2pgsql
RCSID: $Id: shp2pgsql-core.h 5983 2010-09-1911:27:05Z mcayland $ RELEASE: 1.5
SE_GEOS=1 USE_PROJ=1 USE_STATS=1
USAGE: shp2pgsql[<options>] <shapefile> [<schema>.]<table>
OPTIONS:
-s <srid> Set the SRID field. Defaults to -1.
(-d|a|c|p) These are mutually exclusiveoptions:
-d Drops the table, then recreates it and populates
it with current shape file data.
-a Appends shape file into current table, must be
exactly the same table schema.
-c Creates a new table and populates it, this is the
default if you do not specify anyoptions.
-p Prepare mode, only creates the table.
-g <geocolumn> Specify the name of thegeometry/geography column.
(mostly useful in append mode).
-D Usepostgresql dump format (defaults to SQL insert statments).
-G Usegeography type (requires lon/lat data).
-k Keep postgresql identifiers case.
-i Useint4 type for all integer dbf fields.
-I Create a spatial index on the geocolumn.
-S Generate simple geometries instead of MULTI geometries.
-w Output WKT format (drops M and introduces coordinate drifts).
-W <encoding> Specify the characterencoding of Shape's
attribute column. (default :"WINDOWS-1252").
-N <policy> NULL geometries handlingpolicy (insert*,skip,abort).
-n Only import DBF file.
-? Display this help screen.
执行生成的sql语句,完成数据导入;
这里的空间数据被以字符串的形式存储;将这生成的sql语句以\i或者gui执行,就会生成数据表;
安装完成postgis后,会在pgAdminIII的插件中出现PostGIS Shapefile and DBF loader插件;点击数据库中架构,可以激活该插件。
点击出现导入对话框;在其中输入postgis数据库的连接参数;然后点击Test connection,测试连接;最下方的Import Log出现提示:
Connecting: host=localhost port=5432 user=postgresdbname=hainan password='***'
Connection succeeded.
说明连接成功;否则根据提示重新配置;
连接成功后,点击最上方的shapefile文件选择,出现shapefile文件选择对话框,然后找到需要的shape文件,点击Open就可以加载地图;如果要加载同一目录的多个shapefile文件,可以使用左侧的add按钮,将目录加入左侧的快捷目录中,但是每次只能加载一个文件;
导入之前,在options按钮打开的选项对话框中,选择要使用的编码;因为这里的文件中要使用中文属性,所以要使用gb2312;配置SRID为地图的投影EPSG编号;
点击Import导入地图,成功后出现提示:
…
shapefile import completed.
否则根据提示重新设置;
使用database->split->import shapefile topostgresql,建立连接,添加shp,确定后就可以在postgresql中看到增加的shp表。
目标:在数据表中组织矢量元素的属性和几何。
方法:postgis使用一组postgres函数来处理数据。对空间数据的操作一般用ST_前缀。
参考:Postgis help chaper4-DataManagement。
http://blog.csdn.net/warrenwyf/article/category/705099
数据类型为geometry,存储格式为WKB,元数据可由geometry_columns视图查看。
坐标系统由spatial_ref_sys表维护。
注意:geometry默认为平面坐标,如果设置为球面坐标系统将自动转换为geography类型。
参考:http://www.cnblogs.com/fre2technic/archive/2011/05/09/2041500.html
http://123.125.114.20/view/e52cdcd428ea81c758f578ac.html?re=view
http://wenku.baidu.com/view/5d29b55f312b3169a551a405.html
以WKT为例,其它方式与此相似。
将postgis数据转换为WKT,WKB:ST_asText(the_geom),ST_asBinary。
示例:将数据转换为WKT,WKB
select st_asewkt(the_geom),
st_asText(the_geom),
st_asBinary(the_geom),
the_geom as"Origin"
from "Noded" wheregid=2;
将WKT转换为geom。
selectst_asText(st_geomfromtext('POINT(114 40)',4326));
如:SRID=4326;POINTM(114,40,0.02)
目标:通过sql能够进行空间数据操作。
方法:postgis扩展函数。
参考:http://blog.csdn.net/warrenwyf/article/details/5703349
查看坐标系统
selectst_asewkt(st_setsrid(ST_POINT(114,40),4326))
select st_srid(the_geom) fromroad_noded;
更改坐标系统:
update road_noded set the_geom= st_geomfromtext(ST_AsText(the_geom),4326)
参考:http://blog.csdn.net/cnhome/article/details/6990060
参考:帮助文档。
http://www.cnblogs.com/LCGIS/archive/2013/03/12/2954898.html
selectst_point(-2,1)<->st_point(-3,2);
参考:http://www.cnblogs.com/LCGIS/archive/2013/03/12/2954898.html
SELECT id::integer FROMroad_noded_vertices_pgr
ORDER BY the_geom <->ST_GeometryFromText('POINT(-3 1.6)',4326) LIMIT 1;
可以直接查看属性表;
可以使用postgis中内置的函数查看空间数据,如asewkt(geom);
注意:表名必须使用双引号引起来;
可以通过AddPostgis Layer或者Add vectorlayer两种方式查看postgis的数据,推荐使用addpostlayer,这种方式不用进行编码等的选项选择,可以直接读取源数据库的内容,更加容易操作;
点击add postgislayer 打开添加数据对话框
首先配置postgis数据库参数,配置完成后,点击test connect出现connection to db was successful提示,表明连接成功.
点击add postgislayer 打开添加数据对话框
选择数据源类型为数据库,编码为gb2312,数据库类型为postgresql;
首先配置postgis数据库参数,配置完成后,点击test connect出现连接成功的提示,表明连接成功.
点击Open会出现所有的图层,选择需要的图层,点击OK就会加载到qgis中;
postgresql中存在三种形式的索引,BTrees,RTrees,GiST;
create index indexName on tabname using indextype(indexColumn);
选择要创建索引的表,选择索引类型(这里应使用gist),索引字段(空间字段),就可以创建索引了;
也可以直接使用sql语句创建
CREATE INDEX geom_gist
ONpoint_airdrome_fly USING gist (the_geom);
系统在加载时,默认为每个图层的空间数据都建立了gist索引,所以一般情况不需要特别再创建索引;
在没有postgresql数据库的机器部署程序时,如果无法正确连接到所需的数据库,会造成程序假死;这时应对数据库进行配置,以防止无法连接数据库而造成问题;
在postgresql数据中,有三个配置文件,其中pg_hba.conf文件是用于客户端连接权限设定的.如果文件中不包含对客户端的设置,则无法连接;
在安装目录->data目录下,可以找到pg_hba.conf文件;
用记事本打开,并添加客户端地址及设置;
保存后,用配置编辑器打开;
显示添加内容正确表明设置成功;
目标:将postgis的分析数据保存为新表,并提取出结果数据为不同的几何类型。
方法:
查询保存为新表参见:..\postgresql\postgresql.docx中相关章节。
提取分析结果使用,st_CollectionExtract(collection,type),分析结果如果为collecion类型,可以将其抽取不指定的类,1=point,2=linestring,3=polygon。
参考:http://postgis.net/docs/ST_CollectionExtract.html
示例:
SELECT
st_astext(ST_CollectionExtract(st_split(r.geom,s.the_geom),2)),ST_CollectionExtract(st_split(r.geom,s.the_geom),2)
into stops3
FROM
public.road r,
public.roadwithstop2 s ;