PostGIS简单应用

PostGIS简单应用
2010-03-28 下午 8:48

最近抽空研究并简单实践了一把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….)

  • 源代码安装
  1. download
  2. 安装
#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

[编辑]
测试环境

以上测试基于:

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

You may also like...