PostGIS简单应用
目录
最近抽空研究并简单实践了一把PostGIS,把自己的一些过程和心得和大家分享一下,呵呵。
[编辑]
基本概念
- PostgreSQL:不唠叨了,关系性数据库。
- OpenGIS:Open Geodata Interoperation Specification,也就是开放的地理数据互操作规范,它建立了一个规范,使得应用系统开发者可以在单一的环境和单一的工作流中,使用分布于网上 的任何地理数据和地理处理。
- PostGIS:postgresql的一个扩展。在遵循OpenGIS规范下,提供空间对象、空间索引、空间操作函数和空间操作符等空间信息服务功能 (有点类似于Oracle或者MySQL Spatial,不过网上说和Oracle提供的相比,还是有一定差距,我没有试:D)
- Geometry: Geometry可以说是PostGIS最重要的一个概念,是”几何体”的意思,目前支持的几何体类型包含其实例有:点(Point)/线 (linestring)/多边形(polygon)/多点(multipoint)/多线(multilinestring)等
- GIS tools: 一些gis信息处理客户端工具,主要分为浏览器和桌面应用两种,比如:OpenLayers/MapBuilderI(JavaScript) /uDig(Java)/QGIS(C++)
[编辑]
安装
这里我假设你已经安装并配置好了你的PostgreSQL
- debian系统,你可以
# apt-get intall postgis
或者从这里下 载deb包dpkg安装(根据你的系统硬件架构等选择合适的包比如i386/powerpc/a64….)
- 源代码安装
- download
- 安装
#tar zxf postgis-1.3.2.tar.gz #cd postgis-1.3.2 #./configure --with-pgsql=/usr/local/pgsql/bin/pg_config #make #make install
[编辑]
初始化
- 1. 创建你的gis库:
template1=# create database gis;
- 2. 导入PostGIS为PG提供的扩展类型和操作符等
gis=# \i /usr/local/pgsql/share/lwpostgis.sql gis=# \i /usr/local/pgsql/share/spatial_ref_sys.sql
[编辑]
数据处理
- 1. 创建数据
你可以自己创建自己的信息表,也可以从网上或者测试数据,比如国家基础地理信 息系统
- 2. 格式转换
下载的文件为zip格式不同的数据格式均可通过工具(搜一下就知道了)转换成可导入的SQL语 句。我下载了shp格式的,通过shp2pgsql可以进行转换,这个工具在$POSTGIS_SOURCE/loader目录中,另外,如果PG服务器 编码是utf8类型,支持中文(比如一些地里名字信息),需要通过转换一下编码,主要操作如下:
$ unzip -d test *.zip $ shp2pgsql test public.test > sql/tmp.sql $ iconv -f gbk -t utf-8 sql/tmp.sql > sql/gis.sql
- 3. 补充一下
Shapefile格式是GIS矢量文件格式的事实标准,通常由.shp, .shx, .prj, .dbf等文件组成,OpenGIS的实现软件普遍支持Shapefile的读写,如果你是Mapinfo等格式,可能需要Gdal中的ogr工具进行转 换(反正装这个工具我当时挺麻烦的)。我从网上下载相关数据转换格式后进行导入时,其中的数据精度可能操作PG支持的精度,因为PG中NUMERIC precision 5000 must be between 1 and 1000,所以你可能需要手动替换转换后的sql语句然后执行导
入。
[编辑]
客户端测试
我下载了主要铁路/首都和省级行政中心/国界和省界/三种原始信息数据,这里这里用的是QuantumGIS,即QGIS来进行测试
- 1. 安装qgis
debian系统添加相关源后即可安装
# echo "deb http://ppa.launchpad.net/qgis/ubuntu hardy main" >> /etc/apt/sources.list # apt-get update # apt-get install qgis
或者从源 代码安装
- 2. 依次打开”图层”->”添加postgis图层”->”新建”
- 3. 输入你平常的连接信息,无非就是主机/端口之类云云
- 4. 点”测试连接”看一下有没有问题
- 5. “连接”后,然后点”添加”,会出现你刚刚导入的信息表,就可以看见效果了,挺好玩的,祖国的大好河山就呈现在你的屏幕上。
[编辑]
其他的测试
- 1. 查看点的经纬坐标
在前面已经提到,在PostgreSQL中,数据点信息都是保存以Geometry信息保存的,PostGIS支持所有的数据存取和构造方法,如 GeomFromText()、AsBinary(),以及GeometryN()等
gis=# SELECT name, the_geom from res1_4m limit 2; name | the_geom ----------+-------------------------------------------- 北京 | 01010000000000006061185D400000000039F64340 天津 | 010100000000000020064D5D4000000080C8904340
我们可以用更可读的方式去查看,比如
gis=# SELECT name, astext(the_geom) from res1_4m limit 2; name | astext ----------+------------------------------------------ 北京 | POINT(116.38094329834 39.9236145019531) 天津 | POINT(117.203498840332 39.1311187744141)
- 2. 计算距离
PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。如果计算距 离北京-天津:
gis=# SELECT st_distance('01010000000000006061185D400000000039F64340'::geometry, '010100000000000020064D5D4000000080C8904340'::geometry); st_distance ------------------ 1.14221149435196
注意,以上计算的距离为笛卡尔距离,如果要计算实际举例,可以用:
gis=# SELECT st_distance_sphere('01010000000000006061185D400000000039F64340'::geometry, '010100000000000020064D5D4000000080C8904340'::geometry); st_distance_sphere -------------------- 112880.9204021 (1 笔资料列)
补充一下:计算坐标很多时候都是通过一定的公式配合数据函数来完成的,比如球面距离等。写了个简单的例子。
- 3. 计算行政区的面积
gis=# select name area(the_geom) as myarea
- 4. 更多函数使用,可以参见官方文档
[编辑]
测试环境
以上测试基于:
Linux 2.6.24-1-686 #1 SMP Sat Apr 19 00:37:55 UTC 2008 i686 GNU/Linux psql 8.3.3 Quantum GIS - 0.11.0-Metis 'Metis' http://hi.baidu.com/rambochow/blog/item/e585bd25e8ca7b6c35a80fe6.html
转载自:https://blog.csdn.net/wangdeng1314/article/details/7179890