地图的数据采集处理、服务搭建发布、前端交互构建,要全讲下来其实挺复杂,这里仅仅简单介绍一下,并罗列一些资料,如果有兴趣,可以按图索骥,深入了解。
OGC即为Open Geospatial Consortium,开放地理信息联盟,由530多家企业、政府机构、研究组织、大学组成的国际性协会,致力于提供地理信息行业软件和数据及服务的标准化工作,推动地理空间位置信息和服务的公平性、可查性、访问性、交互性、复用性。
简而言之,就是GIS行业,从数据采集制作,到地图位置服务发布,都要遵循OGC定义或公布的规范。
地理信息数据供应商,国外的如TomTom、HERE,国内的如四维图新、高德,数据规格书,一整就大几百页,数据格式也千奇百怪,但其实数据分区与编码规范都是类似的,都遵循OCG对地理空间数据的定义,核心是,几何数据与属性数据分开存储,以唯一ID做关联,数据分比例尺层级与图幅存储。
地图与位置服务提供商,谷歌、OSM(开源)、高德、腾讯、百度、天地图等,地图页面打开,有细微差别,但长得都挺像。WEB API服务,入参与出参,也没有太大差异。原因不外乎,对于规范的遵守。
OGC的规范非常多,但很多规范都是现实中没什么用的水规范,用的最多应该是WMS。
官方网址:https://www.opengeospatial.org/
web map service,网络地图服务。
OGC最重要也最常用的规范就是WMS规范。WMS事无巨细的为网络地图的数据格式、图例样式、地图发布、交互设计等等方面定义了一系列的规范细则。原则上,所有地图数据生产与地图服务提供企业,都要遵循它。
落在地图发布与交互上,WMS=WMTS+WFS。
WMTS就是,web map tile service,网络地图瓦片服务,地图数据量很大,无法直接传到前端显示,会先在后端渲染生成栅格图片,将图片传到前端,用以显示。
瓦片的意思是,后端渲染生成的图片,是一块一块传到前端的,就跟盖房子的瓦片一块一块垒到房顶一样。WMTS服务发布的是栅格图片,栅格内容无法修改。
WFS就是web feature service,网络要素服务,这个服务是矢量的。地图要素即为feature,feature是一个可被操作的对象。通过WFS服务,可以对数据(几何+属性)进行增删改查等操作。
简而言之,WMS服务,其中WMTS,是用来看的,没有办法对数据进行操作,数据操作要通过WFS服务。
规范下载地址:http://www.opengeospatial.org/standards/wms
推动滚轮,修改比例尺,可以将地图放大缩小。因为电脑屏幕大小是一定的,所以比例尺越大,显示的地理范围就越小,而地图内容就越详细,比例尺越小,显示的地理范围就越大,而地图内容就越概要。
瓦片地图就像金字塔一样,每层由一个个小方块平铺而成,以一个小方块为例,当地图被放大的时候,这个小方块所占的实际地理空间被分成2×2的4个小方块,新生成的小方块像素宽度和长度跟原来的小方块一样,原来一个小方块的内容由4个小方块来展示,展示空间大了,就变得详实了,但是电脑屏幕是一定的,之前加载多少小方块,现在还加载多少。
这就是瓦片地图的核心,数据传输量是不变的,随着比例尺的放大缩小,展示的实际地理空间和地图内容会发生变化。
下面两张图,一个是3级比例尺下的内容,一个是13级比例尺下的内容,小方块的像素大小是一样的,但后者地图内容要比前者详细得多,而实际地理空间要小得多。
更多瓦片地图的介绍,可参见两篇写的很清晰的博客:
https://segmentfault.com/a/1190000011276788?utm_source=tag-newest
https://blog.csdn.net/qq_35732147/article/details/81476542
我们用(x,y)表示二维平面上的一个点,用(x,y,z)表示三维空间中的一个点,这就是数学坐标系。
同样为了抽象表示地球上某个点,还有点与点之间的关系,我们也需要为地球找一个坐标系,这就是大地坐标系。
世界上大概有几千个坐标系,因为地球不是圆的,每个地方最拟合地球表面的椭球肯定也不是同一个,所以各地的坐标系也不一样。
中国最早采用的是苏联的克拉索夫斯基椭球,原点在苏联的普尔科沃的北京54坐标系(1954年规定的)。后来依然采用克拉索夫斯基椭球,但将原点设在了陕西省泾阳县永乐镇,因为这套坐标系在西安确定,1980年颁布,所以叫做西安80坐标系。再后来国家为了发展空间技术,启用了国家大地2000坐标系,这也是北斗系统的坐标系。
世界范围比较常用的坐标系是WGS84坐标系,不搞高精定位的话,WGS84坐标系和CGCS2000坐标系差不了多少,一个地球参考极指向历元1984年,一个指向历元2000年,它俩的差别主要是地壳运动产生的,地壳运动每年2厘米偏移的话,16年也就三米多。
谷歌地图和OSM地图,都是WGS84坐标系。
天地图是CGCS2000坐标系。
高德、腾讯是GCJ02坐标系,GCJ02坐标系是在WGS84基础上加密而成的。
百度是BD09坐标系,是在GCJ02上再次加密而成的。
更多坐标系相关的内容,可参见:http://epsg.io/
EPSG是欧洲石油调查组的缩写,经济推进科技进步,收纳世界全部坐标系的组织是开采石油的。
WGS84(CGCS2000)、GCJ02、BD09之间的转换参见:
https://github.com/wandergis/coordtransform
地球是个球,电脑屏幕和手机屏幕都是一个面,如何在平面上显示一个球?
把球拍平了,这就是投影,webGIS最常用的地图投影就是墨卡托投影,墨卡托投影认为地球是一个圆球,把它投影到一个方形上,其投影算法简单高效,适用于平面显示。
更多地图投影的信息可参看:
https://desktop.arcgis.com/zh-cn/arcmap/10.3/guide-books/map-projections/about-map-projections.htm
WKT(Well-known text),是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known binary)则在传输和数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。
简而言之,WKT和WKB,就是要素的几何信息的文本表示。
最常见的要素几何就是点、线、面。
以下是点线面的WKT文本。
POINT(6 10),一个点。
LINESTRING(3 4,10 50,20 25),一条线。
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),一个带孔洞的面。
OCG规范与定义下载路径:https://www.opengeospatial.org/docs/is/
GeoJSON是一种用于编码各种地理数据结构的格式。GeoJSON对象可以表示几何图形,要素或要素集合。GeoJSON支持以下几何类型:点,线串,多边形,多点,多线串,多多边形和几何集合。GeoJSON中的要素包含几何对象和其他属性,要素集合表示要素列表。
简而言之,geojson就是表示地理数据的json,经常用于webGIS工程的前后端数据传递上。
一个简单的geojson串如下,它能表达一个要素集合。
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
geojson介绍官网:https://geojson.org/,geojson定义在2016年有过大更新。
geotool是OGC提供的一套用于GIS数据处理与服务的JAVA开源库,GDAL是它的python版。
geotool功能强大,涵盖了GIS领域所有底层算法和服务框架,它能进行空间运算、图像处理、地图发布等。最常用的geotool套件是jts,jts主要运用DE-9IM模型,进行矢量数据的空间运算。
因为geotool涵盖太多,jts涉及很多GIS算法,此处就不展开赘述了,有需要的可以去官网瞻仰学习。
geotool的官网是:https://www.geotools.org/
GDAL的官网是:https://gdal.org/
因为geotool发布WMS服务难度高(地图渲染、瓦片裁切等都要从最底层开始写,还会遇到JVM、JAI性能问题),故geoserver应运而生。
geoserver底层用的也是java+geotool,它构建了一个jetty的web工程。
有了geoserver,我们不用写代码,启动一个页面工具,就能发布地图了。
geoserver官网是:http://geoserver.org/
openlayer是一个专为webGIS开发提供的JavaScript库包,用以实现标准格式发布的地图数据访问。openlayer是完全依照WMS标准来的,与geoserver有很好的兼容性。
除了openlayer外,各图商也提供基于自身地图的前端脚本,如果仅仅是简单的地图展示与操作,可以使用谷歌、高德、腾讯、百度等地图的JavaScript API。
除了openlayer外,还有比较火的开源JavaScript库包,就是leaflet了,相对来说,leaflet更轻量,使用群体更广,且官方网站提供全部的交互源码的下载,它的开发文档更易读,对非专业人士更友好,上手更快。
但leaflet并没有完全依照WMS规范,不支持单瓦片加载(多瓦片,面注记会冗余),坐标系转换等功能,且绘制功能较弱。
不过实话实说,openlayer比leaflet复杂,且使用人群没有leaflet多,参考资料较少,故如果对GIS和OGC规范,包括坐标系定义、投影定义、GML(带地理空间信息的XML语言)数据格式定义、地图瓦片原理、图层概念、制图风格等,不太了解的话,建议使用leaflet,因为openlayer的交互都是基于wms服务来的。
且leaflet维护的人多,各种插件也很多,做热力图和轨迹图等展示用的demo更多更炫。
openlayer官方网站:https://openlayers.org
leaflet官方网站:https://leafletjs.com
常用的开源数据库非常多,但对于webGIS来说,postgresql应该是最好的选择。
首先,geoserver与postgresql兼容,其次postgresql有很多很有用的插件,例如空间计算插件postgis、基于postgis的拓扑套件postgis_topology、路径规划插件pgrouting、文本模糊匹配fuzzystrmatch、tiger英文地址编码postgis_tiger_geocoder、地址标准化插件address_standardizer、时空检索插件pg-trajectory等。
依托于这么丰富的扩展性,除了webGIS,postgresql还可以应用在时空数据处理、路径规划、地理编码上,有可能数据库插件自带的成熟算法,要比自己写的好很多。
postgresql官方网站:https://www.postgresql.org/
postgis官方网站:http://www.postgis.org/
背景知识讲了很多,但其实还是很少,都是稍稍提了一些,没有详细展开。
我们需要知道有OGC,OGC的WMS规范,地图发布都是依据这个规范来的,遵循地图瓦片的原理。不过各图商在发布的时候,瓦片尺寸、起始坐标、地图风格,会有细微不同。
为什么要发布瓦片地图?就是因为内容多、数据量大,不发布成栅格瓦片,根本没有办法传到前端并渲染。
因为要发布地图,所以我们需要了解geotool和geoserver、发布完成后,要有展示,所以需要知道openlayer前端脚本库,数据是要交互的,所以要了解WKT和WKB、geojson。
数据存在哪里?postgresql。
这是一个全流程,且是需要进行知识扩展的全流程。
要想对一个专业、一项技术,有深入了解,单单看简介是不够的。
买一本书,张康聪老师的《地理信息系统导论》,从头到尾看一遍,看懂50%即可,把原理了解一下。
webGIS没什么太好的书,这个主要靠实践,遇到问题,不断的去查找资料就行,总有一天会达到闭环。
在互联网行业,GIS是很小众的一个方向,主要用于行业交叉应用,它有一定的专业性,但在实践中,更多的是交叉学科的融合。多学点总归没坏处,但是否接触,或者是深耕,还要看个人的职业规划。