收藏 分销(赏)

基于开源GIS的电子地图开发.docx

上传人:xrp****65 文档编号:6005508 上传时间:2024-11-25 格式:DOCX 页数:71 大小:5.97MB 下载积分:10 金币
下载 相关 举报
基于开源GIS的电子地图开发.docx_第1页
第1页 / 共71页
基于开源GIS的电子地图开发.docx_第2页
第2页 / 共71页


点击查看更多>>
资源描述
目录 1 开源GIS概述 2 1.1 什么是开源GIS 2 1.2 为什么需要开源GIS 2 1.3 开源GIS项目简介 3 1.3.1 PostGIS简介 3 1.3.2 GeoServer简介 5 1.3.3 OpenLayers简介 7 1.4 体系结构布署 7 1.4.1 基于J2EE 的WebGIS 体系结构 7 1.4.2 WMS 规范和WFS 规范 8 2 基于PostgreSQL和PostGIS的地图呈现 9 2.1 PostgreSQL和PostGIS的安装 11 2.2 PostGIS中的几何类型 12 2.3 PostGIS中空间信息处理的实现 13 2.4 PostGIS中的常用函数 15 2.5 向PostGIS导入shapefile数据 21 2.6 基于PostGIS的地图呈现实例 21 3 OpenLayers实践 23 3.1 项目介绍 24 3.2 源代码总体结构分析 25 3.3 BaseTypes :定义底层类与定制JS内置类 28 3.4 BaseTypes: OpenLayers中定制JavaScript内置类 30 3.5 空间数据的组织与实现 33 3.6 OpenLayers 数据解析—以GML为例 35 3.7 数据渲染分析 37 3.8 地图表现 38 3.9 OpenLayers中的控件 42 3.10 OpenLayers事件机制分析 45 3.11 体系结构 47 3.12 GeoServer自带OpenLayers实例 47 3.13 OpenLayers官网经典例子 57 3.13.1 图层叠加 58 3.13.2 编辑功能 60 3.13.3 书签及样式 63 3.13.4 改变显示内容 64 3.13.5 动画效果 66 3.13.6 获得属性 66 3.13.7 局部放大 67 3.13.8 编辑功能 70 3.13.9 全屏 70 数据来源于百度,网易等论坛 基于开源GIS的电子地图开发 1 开源GIS概述 1.1 什么是开源GIS 顾名思义,开源GIS就是开放源代码的GIS软件。开源:软件开发者以某种协议发布某些软件的源代码,并允许他人在遵守该协议的基础之上可以自由下载、修改、使用和散布其源代码。开源协议:GNU GPL、BSD、LGPL、MIT、MS-PL;开源网站:open source GIS、sourceforge、google code、apache、codeplex。 随着商业GIS的发展而发展壮大,功能性强、技术强劲,背后是来自技术狂热者、科研院所和非盈利机构的大力支持。开放、集成、标准和互操作,跨各类操作平台:linux、windows、mac、mobile;跨各类语言:C、C++、Java、C#、Python、Ruby、Perl、JavaScript、ActionScript;各种层次的产品:桌面、服务器、数据库、客户端、中间件、工具集。 1.2 为什么需要开源GIS 商业软件需要高昂的使用和维护费用,频繁的升级换代和兼容性。其数据格式无法完全的共享和转换,而且商业软件的跨平台支持不够完善。与之对比,开源软件是完全免费使用的,开源软件的发展足以满足常用的需求,提供做种解决方案。 开源GIS项目以及应用领域: 桌面:GRASS、QGIS、UDig 服务器:GeoServer、MapServer(free) 数据库:PostGIS、MySQL Spatial、MS-SQL Spatial 客户端:QGIS、OpenLayers、WorldKit 工具集:JTS(NTS)、GEOS、Shapely、GDAL/OGR 中间件:GeoTools、MapTools 其他:WorldWind、TileCache、Proj4 开源GIS主要应用于:资源管理 (Resource Management) ,资源配置 (Resource Configuration) ,土地信息系统和地籍管理 (Land Information System and Cadastral Applicaiton) ,生态、环境管理与模拟 (Environmental Management and Modeling) 以及分布式地理信息应用 (Distributed Geographic Information Application)等众多领域。 1.3 开源GIS项目简介 开源GIS项目主要有三个方面,即: ·数据库:PostGIS ·服务器:GeoServer ·客户端(B/S):OpenLayers 1.3.1 PostGIS简介 PostGIS是加拿大Refractions公司支持的开源项目,它为开源数据库PostgreSQL提供了空间支持。PostGIS安装后,Postgre SQL中出现一个模版数据库,新建空间数据库时只需以PostGIS为模版即可。PostGIS在SQL级别上实现了基本的空间运算功能。另外绝大多数开源GIS软件(即使是不严格遵守OpenGIS标准的)都支持PostGIS数据表的直接载入,读写等功能。毋庸置疑,PostGIS 是OpenGIS数据源最佳实现。 图 1 PostGIS数据 PostGIS安装和使用: 首先下载(http://www.postgresql.org/)并安装PostgreSQL8.x版本,目前最新的为8.4。安装完毕后设置默认的用户名和密码,添加此用户。然后打开Application Stack Builder选择需要安装的插件,里面选中PostGIS1.5 for PostgreSQL 8.x,选择合适的版本。下载后自动安装。安装后可以看到一个模板数据库和一个默认的空间数据库,之后可以根据模板数据库添加一个空间数据库来使用,里面实现的大量的空间分析和空间应用的函数。同时包含一个shapefile dbf input loader工具。再登录到PostgreSQL中可以进行空间数据的增删改查。 PostGIS 中的几何数据类型 1)OGC 的WKB 和WKT 格式 PostGIS 支持所有OGC 规范的“Simple Features”类型。OGC 定义了两种描述几何对象的格式,WKB(Well-Known Binary)和WKT(Well-Known Text)。WKT 是以文本形式描述,WKB 是以二进制形式描述。使用WKB 和WKT 能够很好的与其他系统数据交换,目前大部分支持空间数据存储的数据库构造空间数据都采用这两种方式。支持的几何对象在Simple Features Geometries 1.0 中包括:Point,Line String,Polygon,Multi-Polygon,Multi Line String,Multi Point,Geometry Collection。 2)EWKT、EWKB 和Canonical 格式 OGC 中定义的WKT 与WKB 只支持二维的几何数据类型,并且不支持空间参考。PostGIS 对OGC 的数据格式进行扩展得到EWKT 和EWKB 格式,主要扩展有3DZ、3DM、4D 坐标和内嵌空间参考支持。每个有效的WKT 和WKB 格式都是有效的EWKT 和EWKB。然而这种数据格式并不稳定,如果与OGC 推出的新数据格式冲突,那么它将来有可能会改变。而目前OGC 的Simple Features1.2 已经推出支持3D,4D 的WKT,WKB 格式,EWKT 与EWKB 的发展方向还需拭目以待。Canonical 格式是一种简单查询结果(没有任何函数调用),并且此格式支持简单的插入、更新和复制,是一种16 进制编码的几何对象。 3)SQL-MM 格式 QL 多媒体及应用包(SQL-MM)格式定义了一些插值曲线,这些插值曲线和EWKT 类似,也支持3DZ、3DM、4D 坐标,但是不支持嵌入空间参考。 PostGIS 中的地理数据类型 在 PostGIS 最近发布的版本1.5.0 中加入了地理数据类型(Geography Type)。这种数据类型直接支持大地坐标(geodetic coordinates),即经纬度。PostGIS 几何数据类型的基础是一个平面,平面上两点之间的最短距离是一条直线。因此,在计算几何图形的面积、距离、长度、交集等操作时可以使用笛卡尔数学计算公式和直线向量。PostGIS地理数据类型的基础是一个球体。球体上两点之间的最短距离是大圆圆弧(great circle arc)。如果要结果更加精确,则需要考虑真实世界的球体形状,这样将使计算变得复杂。因此,基于地理数据类型的功能函数少于基于几何数据类型的功能函数。而且这种数据类型现在还只支持WGS84(SRID (Spatial reference system):4326)的经纬度坐标。PostGIS 地理数据类型现在仅支持最简单的要素:OGC 规范的“Simple Features”类型。在数据格式方面,支持OGC 的WKB 和WKT 格式,也可以使用EWKB 或EWKT 插入数据。 PostGIS 对空间数据的读取 现存的GIS 软件产生的数据格式很多,PostGIS 提供了多种方式支持数据的读取。 1)PSQL 语言 Psql 语言是PostgreSQL 内嵌的一个命令行工具,其语法基本上跟标准的SQL 语法一致,结合标准的SQL 语法和一些PostGIS 的扩展对PostGIS 数据库进行读写操作。 2)使用转换工具 ①PostGIS 自带的转换工具:shp2pgsql、pgsql2shp 可在shapefile 数据与PostGIS 数据库之间转换; ②使用ogr 工具:这个工具PostGIS 自身并没有提供,但它同样是一个开源软件,Ogr 是GDAL的一个组成部分,GDAL 是一个各种GIS 数据格式的转换软件库,ogr 是转换矢量GIS 数据的软件库,目前ogr 所支持的数据格式有以下几种:ESRI Shapefile, MapInfo Tab file, TIGER, s57, DGN, CSV,GML, KML, Interlis, SQLite, ODBC, PostGIS/PostgreSQL, MySQL[11];③使用桌面软件QuantumGIS中的SPIT 插件来将shapefile 读到PostGIS 数据库中。 1.3.2 GeoServer简介 GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。GeoServer 主要特性包括:兼容 WMS 和 WFS 特性;支持 PostGIS 、 Shapefile 、 ArcSDE 、 Oracle 、 VPF 、 MySQL 、 MapInfo ;支持上百种投影;能够将网络地图输出为 jpeg 、 gif 、 png 、 SVG 、 KML 等格式;能够运行在任何基于 J2EE/Servlet 容器之上;嵌入 OpenLayers 支持 AJAX 的地图客端;除此之外还包括许多其他的特性。 图 2 GeoServer功能 图 3 GeoServer界面图 客户端Open layers的使用及开发方法 GeoServer中集成了Openlayers,也可以使用单独下载的OpenLayers软件包。在默认情况下,Openlayers只有基本的缩放(Zoom)、拖动(Pan)功能。如果需要更丰富的服务,可以调用openlayers.layer 的子类完成图层的初始化; 在创建好图层后, 还可以调用Openlayers 提供的openlayers.control类为地图添加一些与用户有互动功能的工具栏或者是“按钮”。GeoServer支持多种客户端,WMS可以返回GeoRSS和KML用来和其他地图服务互通。 GeoServer 服务启动后,在浏览器中输入http://localhost:8080/geoserver/即可以看到操作界面。要完成数据的发布,需要进行四个方面的配置。 Server:设置服务器信息和联系信息,服务信息包括:最大地理要素数限制、是否显示详细异常信息、数字精度、语言编码、日志相关;联系信息包括:单位名称、地址、联系方式等。 WFS:设置WFS 相关信息,包括:是否启用WFS 服务、服务层次(基本服务、事务处理层次、完全服务)以及WFS 服务器描述信息和Test Suites 的使用。 WMS:设置内容包括,是否启用WMS 服务、描述信息、SVG 图形表现形式。 Data:数据配置,有四部分内容:名称空间、数据、要素类、样式。GeoServer 默认可读取的数据有PostGIS、shapefile 等几种格式,对ArcSDE,GML 等格式的支持,可通过插件实现。在本文中,使用PostGIS 加载数据。 1.3.3 OpenLayers简介 OpenLayers是一个用于开发WebGIS客户端的JavaScript包。OpenLayers符合行业标准,比如 OpenGIS的WMS和WFS规范。OpenLayers采用面向对象方式开发,并使用来自Prototype.js和Rico中的一些组件。OpenLayers 支持的地图来源包括Google Maps、Yahoo! Map、微软Virtual Earth 等。用户还可以用简单的图片地图作为背景图,与其他的图层在OpenLayers 中进行叠加。OpenLayers 支持Open GIS 协会制定的WMS和WFS等网络服务规范,可以通过远程服务的方式,将以OGC 服务形式发布的地图数据加载到基于浏览器的OpenLayers 客户端中进行显示。OpenLayers 可以在浏览器中实现地图浏览的基本效果,比如放大、缩小、平移等常用操作之外,还可以进行选取面、选取线、要素选择、图层叠加等不同的操作。可以对已有的OpenLayers 操作和数据支持类型进行扩充,为其赋予更多的功能。可以为OpenLayers 添加网络处理服务WPS 的操作接口,从而利用已有的空间分析处理服务来对加载的地理空间数据进行计算。 OpenLayers安装和使用: 首先下载(http://openlayers.org/)压缩包,通过Web服务器发布。Builder文件夹用来打包压缩所有的js文件,doc文件夹存放API文档,examples文件夹存放所有的例子(重要的学习途径),lib是源文件库,test文件夹是一个测试例子,tools存放用来打包的工具(python)。在浏览器输入发布地址+/examples/xx.html进入需要了解的例子查看即可。 1.4 体系结构布署 1.4.1 基于J2EE 的WebGIS 体系结构 将WebGIS与J2EE相结合,利用J2EE的平台无关性与分布式结构,以EJB(Enterprise JavaBean)封装WebGIS 的应用功能,实现WebGIS 应用层的可移植性。对应于J2EE 从业务逻辑上的划分,将WebGIS 分为3 层:客户层、中间层、数据层。 1)客户层:可以是应用程序、浏览器,本文采用浏览器与OpenLayers 相结合,为用户提供栅格或者矢量地理信息。 2)中间层:包括Web 层、Web 应用服务层。Web 层采用Tomcat 作为Web 容器,在此容器中提供了JSP(JavaServer Pages)以及Servlet 组件,负责客户端与应用服务器的通讯和客户端的请求。 Web 应用服务层是系统的核心,它运行在WebGIS 应用服务器上,由运行在EJB 容器中的实体EJB组件与会话EJB 组件组成。本系统的GIS 服务器采用GeoServer1.6.0,由它来处理各种来自于浏览器或者其他应用程序的WMS 与WFS 请求,完成WebGIS 空间数据访问和复杂的空间任务,并可以通过多种数据源接口直接访问空间数据,将处理的结果以栅格、矢量或者GML 的形式传输到客户端。 3)数据层:空间数据源可以有多种,可以是单独的文件或者是数据库。本文采用了PostGIS 空间数据库存放数据源,数据源可由应用服务器内的EJB 通过JDBC 访问。图 4是系统结构图。 图 4系统结构图 1.4.2 WMS 规范和WFS 规范 OGC 的宗旨是让用户能从任何一个网络、应用程序或计算机平台中,方便地获取地理信息和服务;通过共同的接口规范,让数据、服务提供者、应用系统开发者和信息整合者,能在短时间内花最少的费用,让使用者容易获取、使用数据及服务[5]。在OGC 完成的正式规范中,用于网络客户端与服务器端之间通信的共同接口规范Web 地图服务接口规范(WMS)和Web 要素服务实现规范(WFS)等在不同程度上解决了地理空间数据和服务的互操作问题。 WMS 规范 WMS 是OGC 提出的Open Web Services 规范之一。它利用具有空间地理位置信息的数据制作地图。在WMS 规范中,将地图定义为地理数据可视化表现,通过请求WMS 返回的是地图图像,而不是地理数据。 此规范定义了三个基础性操作协议:GetCapabilities、GetMap、GetFeatureInfo。这些协议共同构成了利用WMS 创建和叠加显示不同来源的远程异构地图服务的基础[6]。 1)GetCapabilities 用来请求获得WMS 的服务级元数据,服务器端返回包括版本信息、服务类型、请求内容等元数据使用XML 形式来表示。 2)GepMap 根据请求内容的不同,返回不同格式的数据。可以返回常用图片格式的栅格地图片段,也可以通过安装第三方插件返回矢量地图供用户浏览。地图的渲染是通过一个样式文件SLD(Styled Layer Descriptor)生成的,此文件用XML 编写。 3) GetFeatureInfo 操作是可选操作,可提供给用户地理要素信息,如用户在客户端点击地图上的某一元素,GetFeatureInfo 操作即可返回该元素的相关属性信息。 WFS 规范 WFS 也是由OGC 提出的Open Web Services 规范。WFS 更透明更开放的提供了网络地图应用。它不像WMS 一样只提供图片给用户,而是以GML 格式把源地理信息数据表现出来,GML 是一种基于XML 的数据格式,它可以完整的再现数据,使得服务器端和客户端能够在要素层面进行“通讯”。这些GML 数据可以下载并可以与其他数据结合做分析,也可以与其他的网络服务相结合,给网络提供更丰富的应用[8]。WFS 可以分为两种服务类型:Basic WFS 与Transaction WFS 服务。BasicWFS 提供了三种操作: 2 基于PostgreSQL和PostGIS的地图呈现 1986年,加州大学伯克利分校的Michael Stonebraker教授领导了Postgres的项目,它是PostgreSQL的前身。随后出现了PostGIS,PostGIS是对象-关系型数据库系统PostgreSQL的一个扩展,它的出现让人们开始重视基于数据库管理系统的空间扩展方式,而且使PostGIS有望成为今后管理空间数据的主流技术。 由于空间数据具有空间位置、非结构化、空间关系、分类编码、海量数据等特征,一般的商用数据库管理系统难以满足要求。 为了提高数据库管理系统(DBMS)对空间数据的管理能力,国内外先后出现过:文件与关系数据库混合管理系统、全关系型空间数据库管理系统、关系型数据库+空间数据引擎、扩展对象关系型数据库管理系统,以及面向对象空间数据库管理系统等多种解决方案。目前,国内外较为流行的主要集中在“关系型数据库+空间数据引擎”、“扩展对象关系型数据库”两方面。 缘起PostgrSQL 1986年,加州大学伯克利分校的Michael Stonebraker教授领导了Postgres的项目,它是PostgreSQL的前身。这个项目的成果非常显著,在现代数据库的许多方面都作出了大量的贡献,如在面向对象的数据库、部分索引技术、规则、过程和数据库扩展方面都取得了显著的成果。同时,Stonebraker将PostgreSQL纳入到BSD版权体系中,使得PostgreSQL在各种科研机构和一些公共服务组织得到了广泛的应用。 在PostgreSQL中已经定义了一些基本的集合实体类型,这些类型包括:点(POINT)、线(LINE)、线段(LSEG)、方形(BOX)、多边形(POLYGON)和圆(CIRCLE)等;另外,PostgreSQL定义了一系列的函数和操作符来实现几何类型的操作和运算;同时,PostgreSQL引入空间数据索引R-tree。 尽管在PostgreSQL提供了上述几项支持空间数据的特性,但其提供的空间特性很难达到GIS的要求,主要表现在:缺乏复杂的空间类型;没有提供空间分析;没有提供投影变换功能。为了使得PostgreSQL更好的提供空间信息服务,PostGIS应运而生。 PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符。同时,PostGIS遵循OpenGIS的规范。 PostGIS的版权被纳入到GNU的GPL中,也就是说任何人可以自由得到PostGIS的源码并对其做研究和改进。正是由于这一点,PostGIS得到了迅速的发展,越来越多的爱好者和研究机构参与到PostGIS的应用开发和完善当中。 PostGIS特性 PostGIS支持所有的空间数据类型,这些类型包括:点(POINT)、线(LINESTRING)、多边形(POLYGON)、多点(MULTIPOINT)、多线(MULTILINESTRING)、多多边形(MULTIPOLYGON)和集合对象集(GEOMETRYCOLLECTION)等。PostGIS支持所有的对象表达方法,比如WKT和WKB。 PostGIS支持所有的数据存取和构造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。 PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。 PostGIS提供了对于元数据的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS,同时,PostGIS也提供了相应的支持函数,如AddGeometryColumn和DropGeometryColumn。 PostGIS提供了一系列的二元谓词(如Contains、Within、Overlaps和Touches)用于检测空间对象之间的空间关系,同时返回布尔值来表征对象之间符合这个关系。 PostGIS提供了空间操作符(如Union和Difference)用于空间数据操作。比如,Union操作符融合多边形之间的边界。两个交迭的多边形通过Union运算就会形成一个新的多边形,这个新的多边形的边界为两个多边形中最大边界。 PostGIS还提供以下功能: ·数据库坐标变换 数据库中的几何类型可以通过Transform函数从一种投影系变换到另一种投影系中。在OpenGIS中的几何类型都将SRID作为自身结构的一部分,但不知什么原因,在OpenGIS的SFSQL规范中,并没有引入Transform。 ·球体长度运算 存储在普通地理坐标系中的集合类型如果不进行坐标变换是无法进行程度运算的,OpenGIS所提供的坐标变换使得积累类型的程度计算变成可能。 ·三维的几何类型 SFSQL规范只是针对二维集合类型。OpenGIS提供了对三维集合类型的支持,具体是利用输入的集合类型维数来决定输出的表现方式。例如,即便所有几何对象内部都以三维形式存储,纯粹的二维交叉点通常还是以二维的形式返回。此外,还提供几何对象在不同维度间转换的功能。 ·空间聚集函数 在数据库中,聚集函数是一个执行某一属性列所有数据操作的函数。比如Sum和Average,Sum是求某一关系属性列的数据总和,Average则是求取某一关系属性列的数据平均值。与此对应,空间聚集函数也是执行相同的操作,不过操作的对象是空间数据。例如聚集函数Extent返回一系列要素中的最大的包裹矩形框,如“SELECT EXTENT(GEOM) FROM ROADS”这条SQL语句的执行结果是返回ROADS这个数据表中所有的包裹矩形框。 ·栅格数据类型 PostGIS通过一种新的数据类型片,提供对于大的栅格数据对象的存储。片由以下几个部分组成:包裹矩形框、SRID、类型和一个字节序列。通过将片的大小控制在数据库页值(32×32)以下,使得快速的随即访问变成可能。一般大的图片也是通过将其切成32×32像素的片然后再存储在数据库中的。 2.1 PostgreSQL和PostGIS的安装 PostgreSQL是基于加州大学伯克利分校计算机系写的 POSTGRES(Version 4.2 )软件包开发的对象关系型数据库管理系统(ORDBMS),是开源的,发布在 BSD许可下 。经过二十几年的发展(起始与1986年), PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统, 它提供了多版本并行控制,支持几乎所有 SQL 构件(包括子查询,事务和用户定 义类型和函数), 并且可以获得非常广阔范围的(开发)语言绑定 (包括 C,C++,Java,perl,tcl,和 python),目前最新的版本是 PostgreSQL8.3.x。 PostgreSQL 使用一种客户端/服务器的模式,即一次 PostgreSQL 会话在,需要执行数据库操作的用户的客户端(前端)应用和数据库服务器程序(postmaster)之间完成。这跟典型的客户端/服务器应用(C/S应用)一样,这些客户端和服务器可以在不同的主机上,它们通过 TCP/IP 网络联接通讯。 两个图形界面工具: pgAdmin III : 图形界面形式的管理工具 PhpPgAdmin :Web-based PostgreSQL 管理工具 PostSQL+PostGIS的安装(windows环境下) 下载 PostgreSQL安装程序,这里8.3.0版或其他。 解压postgresql-8.3.0-1.zip文件后,双击postgresql-8.3.msi安装程序即可。 安装过程大概会遇到: Secongdary Logon服务没有运行 的问题。 在系统服务里,找到 Secongdary Logon服务,启动之,即可。 这样,完成之后, pgAdmin III 同时也会被安装。 对于不使用命令进行操作的朋友来说,图形用户界面是直观方便、容易上手的,其主窗口如下图: 新版本的PostgreSQL在其安装程序中集成了PostGIS,只需要在安装过程中选中PostGIS和pgsql项就可以了。 2.2 PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ、3DM、4D坐标的支持。 1. OGC的WKB和WKT格式 OGC定义了两种描述几何对象的格式,分别是WKB(Well-Known Binary)和WKT(Well-Known Text)。 在SQL语句中,用以下的方式可以使用WKT格式定义几何对象: POINT(0 0) ——点 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)) ——面 MULTIPOINT(0 0,1 2) ——多点 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))) ——几何集合 以下语句可以使用WKT格式插入一个点要素到一个表中,其中用到的GeomFromText等函数在后面会有详细介绍: INSERT INTO table ( SHAPE, NAME ) VALUES ( GeomFromText('POINT(116.39 39.9)', 4326), '北京'); 2. EWKT、EWKB和Canonical格式 EWKT和EWKB相比OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考支持。 以下以EWKT语句定义了一些几何对象: POINT(0 0 0) ——3D点 SRID=32632;POINT(0 0) ——内嵌空间参考的点 POINTM(0 0 0) ——带M值的点 POINT(0 0 0 0) ——带M值的3D点 SRID=4326;MULTIPOINTM(0 0 0,1 2 1) ——内嵌空间参考的带M值的多点 以下语句可以使用EWKT格式插入一个点要素到一个表中: INSERT INTO table ( SHAPE, NAME ) VALUES ( GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京' ) Canonical格式是16进制编码的几何对象,直接用SQL语句查询出来的就是这种格式。 3. SQL-MM格式 SQL-MM格式定义了一些插值曲线,这些插值曲线和EWKT有点类似,也支持3DZ、3DM、4D坐标,但是不支持嵌入空间参考。 以下以SQL-MM语句定义了一些插值几何对象: CIRCULARSTRING(0 0, 1 1, 1 0) ——插值圆弧 COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) ——插值复合曲线 CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)) ——曲线多边形 MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4)) ——多曲线 MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11))) ——多曲面 2.3 PostGIS中空间信息处理的实现 1. spatial_ref_sys表 在基于PostGIS模板创建的数据库的public模式下,有一个spatial_ref_sys表,它存放的是OGC规范的空间参考。我们取我们最熟悉的4326参考看一下: 它的srid存放的就是空间参考的Well-Known ID,对这个空间参考的定义主要包括两个字段,srtext存放的是以字符串描述的空间参考,proj4text存放的则是以字符串描述的PROJ.4 投影定义(PostGIS使用PROJ.4实现投影)。 4326空间参考的srtext内容: GEOGCS["WGS 84",DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]], UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] 4326空间参考的proj4text内容: +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs 2. geometry_columns表 geometry_columns表存放了当前数据库中所有几何字段的信息,比如我当前的库里面有两个空间表,在geometry_columns表中就可以找到这两个空间表中几何字段的定义: 其中f_table_schema字段表示的是空间表所在的模式,f_table_name字段表示的是空间表的表名,f_geometry_column字段表示的是该空间表中几何字段的名称,srid字段表示的是该空间表的空间参考。 3. 在PostGIS中创建一个空间表 在PostGIS中创建一个包含几何字段的空间表分为2步:第一步创建一个一般表,第二步给这个表添加几何字段。 以下先在test模式下创建一个名为cities的一般表: create table test.cities (id int4, name varchar(20)) 再给cities添加一个名为shape的几何字段(二维点): select AddGeometryColumn('test', 'cities', 'shape', 4326, 'POINT', 2) 4. PostGIS对几何信息的检查 PostGIS可以检查几何信息的正确性,这主要是通过IsValid函数实现的。 以下语句分辨检查了2个几何对象的正确性,显然,(0, 0)点和(1,1)点可以构成一条线,但是(0, 0)点和(0, 0)点则不能构成,这个语句执行以后的得出的结果是TRUE,FALSE。 select IsValid('LINESTRING(0 0, 1 1)'), IsValid('LINESTRING(0 0,0 0)') 默认PostGIS并不会使用IsValid函数检查用户插入的新数据,因为这会消耗较多的CPU资源(特别是复杂的几何对象)。当你需要使用这个功能的时候,你可以使用以下语句为表新建一个约束: ALTER TABLE cities ADD CONSTRAINT geometry_valid CHECK (IsValid(shape)) 这时当我们往这个表试图插入一个错误的空间对象的时候,会得到一个错误: INSERT INTO test.cities ( shape, name ) VALUES ( GeomFromText('LINESTRING(0 0,0 0)', 4326), '北京'); ERROR: new row for relation "cities" violates check constraint "geometry_valid" SQL 状态: 23514 5. PostGIS中的空间索引 数据库对多维数据的存取有两种索引方案,R-Tree和GiST(Generalized Search Tree),在PostgreSQL中的GiST比R-Tree的健壮性更好,因此PostGIS对空间数据的索引一般采用Gi
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服