尽管从物理的角度,只有独立数据文件(shp、geojson、tif等)或者数据库(esri geodatabase的gdb、geopackage等)这两种 但是,从学科角度,即从GIS的视角看,地理数据并没有那么简单。 为解释简便,使用shapefile、geojson、tif栅格和gdb、postgis,辅助ArcMap/QGIS 3.10做解说。 1. 术语及概念定义① 地理数据地理数据=空间数据+非空间数据;也叫地理信息。例如:一座医院;一所学校;一条道路;一条河流 ② 空间数据即几何数据,描述坐标、形状的数据;也叫空间信息。例如:形状、坐标 ③ 非空间数据即属性数据,描述与空间位置无关的一类数据。例如:成绩单、医院名称列表 这类数据的特点是,如果脱离了地理位置也有它本身自己的含义。 2. 矢量数据的四个分层不妨这样想:每一层均为子一层的容器。大鱼吃小鱼,小鱼吃虾米。 2.1. 几何/属性层这是矢量数据的最底层,有两个类别:几何层或者属性层。 前阵子写了一系列坐标系有关的博客,我们假定在某个坐标系下,存在某个点P(x0,y0),这个点在这个确定的坐标系下,就是独一无二的。 那么,如果这个点代表的是一个咖啡店,仅仅知道这个点的坐标(x0,y0)是不够的。 不同的用户关心不同的信息,有人关心这个店的电话号码,有的人关心它所在的城市和行政区,有的人关心它的地址,有的人关心它的人均消费。 这个时候,信息就可以分化成两个种属:几何的,属性的。
上大学的时候,系主任说:地理数据区别于其他行业的数据,最大的区别是它具有空间数据! 我们刚明确了几何数据是什么,属性数据是什么,那么多出来的一系列名词又是什么? 做以下规定:
这样就不乱了。默认使用“地理数据=几何数据+属性数据”这个表达。 2.1.1. 案例讲解--geojson现在讲概念其实很枯燥,那么一个具体的矢量数据文件,比如geojson或者shp,如何判断哪些是几何数据,哪些是属性数据呢? 我们取一个geojson文件,只有一个点,没有属性数据。它在QGIS里长得像这样: 它数据长这样: 是WGS84下的一个点,在广州城区。 我们可以很快聚焦到"geometry"这个键上,它下列有两个子键"type"和"coordinate",这两个子键的值就是这个geojson矢量数据的几何信息。 读者可以想象得到,如果type是“LineString(即多折线)”,那么coordinate将是一堆折线段的集合。 如果是Polygon: geometry的值的的确确就是上面提及的“表征位置信息的坐标数据”。 我编辑了一下只有一个点的geojson,使其拥有三个属性数据:所在城市是"Guangzhou",编辑者是"秋意正寒",邮政编码是"510000". 属性表长这样: 文本变成了这样: 我们不难看到,和geometry键并列的多了一个键:"properties"。 它翻译过来就是属性的意思(别的数据格式可能叫“attributes”) 我们看到了在geojson中,“几何层”、“属性层”是如何组织的。 2.1.2. 案例讲解--shapefileshp文件至少要有3个文件构成,*.shp、*.shx、*.dbf 因为这些是二进制文件,不能用文本格式查看,所以直接给出结论: *.shp文件记录的是几何数据 *.dbf文件记录的是属性数据 *.shx链接二者是索引数据 我们将2.1.1中的geojson文件在QGIS中导出shp并在ArcMap里打开其属性表: 发现多了两列属性,其中Shape属性无论给这个shp文件加多少个点,它的值在ArcMap属性表里的都是一个汉字“点”。 而且,FID和Shape属性是无法在属性表里编辑的。 实际上,这个Shape属性列,就是几何数据,ArcMap把它“写”在了属性表而已。我们编辑它还是得靠编辑工具。 ArcMap的属性表通过“显示”Shape列,告诉用户几何数据和旁边city、editor、adcode三列是并排的。 也即“几何数据”、“属性数据”是同级别的数据,只不过几何数据可能很复杂,在属性表上一个格子写不完,就干脆写个汉字。
2.2. 要素层要素层很简单。 先下定义:一个要素表示一个地理实体,一个要素有其自己的几何数据和属性数据。 我们依旧是上面的点json来讲解。 不难看到,properties和geometry键都是"features"这个数组的某个元素下的子键,这里的某个元素,就是要素。 也即,{"type": “Feature”, ...}就是一个"feature",一个要素。 由于有了几何和属性的分割,一个要素当然可以有n个属性,一个要素的几何也可以是n个点/线/面构成的复杂几何图形。 n个属性好理解,n个点/线/面构成的复杂几何图形又是什么意思呢? 这里不再展开描述,有兴趣的朋友可以去参考ogc的Geometry标准,它规定了几何体的复杂构成。以后有机会一定会写一篇ogc标准下的geometry标准。 我们注意到了,"features"下的每个要素的properties的子键都是一样的(名称、类型)。 2.3. 数据层还是以上文的geojson为例。 我们说,
这个矢量数据已经上升到磁盘文件级别了,我们为了复用,不可能一个一个要素分别存在独立的文件里的,因为属性的数量、类型一致,所以要素可以存在一个文件(或者容器)里。 我们把这个容器所在的级别,叫做“数据层”。 我为什么不说一个矢量数据文件(例如一个json文件,一份shp文件)就是一个“数据层”的实现呢? 因为,一个矢量数据固然可以是一个geojson文件,一个shp文件(由多个同名子文件组成),一个gml文件,一个csv文件...当然一个矢量数据也可以是数据库里的一个表,或者一个要素类(ArcGIS里的gdb)。 我们讨论的是“分层”,而不是物理文件构成。 通常来说,我们传递的数据大多数处于数据层。比如,我们传递一个“中国省级行政区划”的shp文件,或者传递一个“广州市医疗机构点位”的geojson文件。 我们很少传递一个“要素”,传递一个“几何面”——代码层面除外。 plus 数据层(Data)为什么不叫图层(Layer)我们把一个矢量数据(geojson/shp/数据库里某张地理数据表等)拖到任何一个GIS客户端软件中,一定能看到它的样子,软件会给我们画出来,它这个时候,叫做“图层”。 因为数据和图层分担着各自不同的任务,图层负责渲染、显示数据,数据被图层引用。一个数据是可以被多个图层引用的。 这就好比,账本专心管理财务流水,报表ppt专心负责回报财务流水的各种趋势比例。 我们GIS软件依靠图层将数据符号化,比如给某个点数据设定了符号是一个尺寸是15的红色五角星,给某个线数据设定了标注是它的“name”字段,通过图层查看一个数据的元数据等... 2.4. 地图层什么是地图层? 我们有了数据层,就可以进行地理数据的分析、展示、交互了。 我们为了组织起地理数据,需要将数据排列顺序,符号化,设计出一张地图。 地图这一层包括了n个数据(也即n个图层,每个图层引用一份数据)。 当然,我们还可以为数据做分组。 我们知道ArcMap中,有个“数据框”的概念,其实一个数据框就是一个地图,数据框就是地图层这一级别的容器。 大家可能看中国地图会观察到右下方通常会有一个“南海诸岛图”,其实中国大陆主体地区和右下方的“南海诸岛图”用两个数据框就可以表示了。 事实上,QGIS也有一样的概念,在布局窗口中,我们可以插入一个地图: 同样能做到“南海诸岛图”和大陆图在同一个布局里显示的效果。这里插入的“地图”就是“地图层”的一个活生生的案例。 plus:GIS客户端软件会使用“工程文件”的手段,把n个“地图”包裹在一起。QGIS使用*.qgz文件,ArcMap使用mxd文档,ArcGISPro使用arpx文件。 3. 栅格数据的四个分层栅格数据和矢量数据当然是有区别的,但是,在概念上可以归一。 3.1. 位置/属性在栅格中,几何图形所代表的空间数据被像元的中心坐标值代替了,该像元的像元值即属性值。 我们知道,栅格数据可以是单波段也可以是多波段,可以是浮点数栅格也可以是整数栅格。 栅格数据可以代表的地理数据种类比较多,以单波段数据为例,整数栅格有属性表,可以添加多列属性(即给不同的像元值赋予不同的意义),浮点栅格则不行。 多波段则能实现“同一个像元坐标”“n个像元值”,并且每个像元值独立,不受整数或者浮点数影响。 3.2. 像元层像元,包括像元分辨率、像元中心坐标和像元值三大主要数据。 像元层并不像矢量中的要素层表意那么直接,因为单像元表达的地理实体不如一个要素强。但是,多个像元是可以做到一个要素的表达效果的。 比如,在DEM栅格数据中,一个像元可以概括表达这个像元面积这么大的地方的海拔高度。多个连片的像元可以构成一块地区的地形。 但是,和要素层的核心要义是一样的,像元层和要素层都能表达地理实体,把像元的三大主要数据孤立讨论,是不能表达地理实体的。 3.3. 数据层数据层和矢量数据的数据层类似,为n个呈矩阵排列的像元构成的图像。 这个图像可以是一层,也可以是多层叠加,只要保证像元中心坐标一致、像元分辨率一致即可。 数据层的物理形式比较简单,除了一些元数据外(坐标系什么的),就是一个体积比较大的数据文件,或者在数据库里的一张表或者一个栅格数据集(Esri gdb)。 若为一个单文件,常见的GIS数据格式为tif,尽管jpg/png/bmp等传统图片格式也可以称作栅格数据,但是它们设计的初衷并不是GIS应用。 在GIS数据服务中,栅格数据切片可以是jpg/png,因为便于网络传输和显示。 3.4. 地图层地图层与矢量数据的地图层一致,都为n个栅格数据按一定顺序、符号化构成。 4. GIS数据服务是什么4.1. GIS服务器GIS服务,与普通网络服务是一样的。
我们常见的Web服务器软件,有IIS、Apache、Nginx、tomcat等,也可以用Java/nodejs等工具语言编写自己的服务器后台软件。 GIS服务器软件基于HTTP等协议(做webgis的,如果连http协议都不知道,建议先补补课),也有一些受欢迎的:开源的GeoServer、MapServer,商用的Esri的ArcGIS Enterprise套件等。 GIS服务器可以是独立的软件,也可以是某个Web服务器的一个插件。例如,ArcGIS Enterprise套件就是自成一家,GeoServer就是Tomcat的一个war包插件。
4.2. GIS数据服务扯了半天,那什么是GIS服务呢? 通常来说,我们说的GIS服务就是GIS数据服务。但是,其实GIS服务还可以提供计算服务,也即GIS处理服务,作为4.3的内容讲解。 OGC中数据服务有很多,只挑一些常见的带过,具体怎么用还是得靠读者进一步阅读更多的资料,本文的重点仍旧是上面的四层概念。 GIS服务扮演的角色,更像是WebGIS中对GIS数据和用户交互之间的一个桥梁,它规范并限制了请求端的操作。 GIS数据服务应该属于“地图层”这一层级,因为它可以包括多个数据(图层)。 4.2.1. 提供访问地理数据的网络地图服务——WMSWMS,Web Map Service,网络地图服务。 一个WMS是一个“地图层”的实现,只不过限制了网络请求的功能。 它允许将n个数据发布成一个“GIS服务”,1个数据被叫做1个图层,因为要对web提供访问,所以用图层这种带符号化的形式来描述“数据层”比较合适。 它提供了以下几大功能,有兴趣的朋友可以参考博客园李晓晖的博客,或者直接查阅OGC官方文档(列在参考文档中了):
第一个没什么好说的。 第二个获取的是给定参数(比如范围、返回图像的格式等)的地图图像,和截图差不多。 第三个功能,说大白话就是“点击地图,根据点位获取指定图层上的要素”。
4.2.2. 提供增删改查矢量数据的网络要素服务——WFSWFS,Web Features Service,网络要素服务。 WFS强化了WMS中关于矢量数据的访问,提供了增加、修改、删除、查询矢量要素的功能。 WMS对矢量数据的查询,局限在了“识别”这一功能上。 我们从功能上就能看出,WMS有一个功能是“getFeaturesInfo”,而WFS直接给出了"getFeature"、“Transaction”等功能。 WFS的主要功能如下:
GetCapabitities和DescribeFeatureType的区别在于,前者描述整个服务,后者聚焦于矢量数据的元数据。 GetFeature既可以使用get请求,也可以使用post请求。无论get请求还是post请求,都可以使用过滤条件,过滤一些不满足给定条件的矢量数据。 Transaction使用post请求,将指定格式的xml请求到gis服务器上。 WFS要求服务的接口必须由XML描述,另外数据交互必须由GML(一个OGC矢量数据格式规范)迚行,数据过滤采用CQL语言。 4.2.3. 网络覆盖服务——WCSWCS标准定义了一些操作,这些操作允许用户访问“Coverage”数据,如卫星影像、数字高程数据等,也就是栅格数据。 有矢量就有栅格,与WFS形成对比,WCS的C,就是栅格数据的意思。 WCS也有几个功能:
4.2.4. WMS的变种:网络地图切片服务——WMTSWMS能给前端返回一张位图,和我们在GIS软件里对一个地图直接截个图(不经过制图)类似。 如果这张位图体积过大或者网络传输不好,那么极有可能前端是拿不到的,就渲染不出来。 分治思想刺激WMS演进,即WMTS,原理很简单,即把这张位图实现按网格切好,在不同的分辨率下,把这些切好的图(都缓存在地理服务器上)按前端指定的范围,挨个传递。 这样,一张小图可能体积并不大,保证了前端的体验。 4.2.5. 三维场景服务迄今为止并未有三维地理数据服务标准,只有三大地理三维数据格式标准:
其中,前两个被ogc承认,且主推i3s。 i3s由Esri(就arcgis家)主推,以slpk文件为交互文件,在自家的ArcGIS Enterprise服务器生态中,已经研发出“SceneService”这种GIS商业数据服务了。 3dtiles是ogc的一个标准,是i3s的主要竞争对手。 gltf,号称是三维数据界的jpg,目前(发文时间2020年初)开源的商业的gis服务器尚未支持三维服务,cesium自己是直接前端调用gltf文件创建视图。 s3m是国内北京超图主推的一个标准。 i3s、gltf、s3m三者共同的特点是用树结构来组织数据,用json文件描述数据,用二进制文件来存储具体数据。 4.3. GIS处理服务遵循一种规范,可以将繁重的处理任务交由服务器运行,然后根据规范,将处理结果返回给前端。这在普通的web服务中是理所当然的事情,只不过加上GIS数据这个壳儿,事情就变得有点复杂了起来。 其实OGC组织是有这么一个规范的,叫WPS——Web Process Service。 Web 处理服务 (WPS) 是用于发布地理空间过程、算法和计算的 OGC 服务。 WPS 服务可作为GIS服务器的扩展,为数据处理和地理空间分析提供执行操作。 默认情况下,WPS 不是 GeoServer 的一部分,但可作为扩展提供。 Esri ArcGIS Enterprise中的Server和Portal都原生支持了WPS,并且有比WPS更强大的GP服务。 有关WPS在GeoServer上的资料,参考各大博客和文末的参考文档。
==============分割线============== GIS服务器有商业也有开源,对OGC的多个服务支持也各有千秋,本文仅作简略介绍,而且有标准文档、各路案例博客资料,想必可以不再发文描述。 读者更应该关注的是本文提出的“四层概念”,多思考多比对。 在本篇中的四层概念合适套用在二维数据或者三维数据上,至于i3s标准下的slpk和3dtiles、gltf数据并不太适用,那些更合适网络分发,毕竟官方提及,slpk不适合再进行编辑。
参考文档[1] GeoServer中WMS、WFS的请求规范 . 李晓晖. https://www.cnblogs.com/naaoveGIS/p/5508882.html [2] OGC标准介绍. 吴泳锋 [M] warrenwyf@gmail.com [3] GeoServer WPS文档 https://docs./latest/en/user/services/wps/index.html [4] OGC标准介绍 5 . https://blog.csdn.net/warrenwyf/article/details/5717612 [5] OGC标准介绍. https://blog.csdn.net/lavanana/article/details/93975949 |
|