文章目录
- 一、OGC与OpenGIS
- 二、google map
- 三、瓦片坐标系统
- 四、可用地图图源汇总
- 4.1Google Map
- 4.2天地图
- 4.3 必应地图
- 4.4 高德公开地图
- 4.5 星图地球
- 4.6 ArcGIS可用的图源
一、OGC与OpenGIS
OGC(Open Geospatial Consortium)
——开放地理信息联盟,是一个非盈利的志愿的国际标准化组织。
OGC 表示开放地理空间信息联盟 (Open Geospatial Consortium-OGC) ,致力于提供地理信息行业软件和数据及服务的标准化工作。
OGC在1994年到2004年期间机构名为Open GIS Consortium, 后因业务需要更名。
OGC是一个非盈利的志愿的国际标准化组织,引领着空间地理信息标准及定位基本服务的发展。在空间数据互操作领域,基于公共接口访问模式的互操作方法是一种基本的操作方法。通过国际标准化组织(ISO/TC211)或技术联盟(如OGC)制定空间数据互操作的接口规范,GIS软件商开发遵循这一接口规范的空间数据的读写函数,可以实现异构空间数据库的互操作。
OGC制定与推进的标准包括 WMS、WMTS、WFS、WCS、CSW、WPS等Web服务规范,及相关的GML、KML和GeoRSS规范。
OpenGIS(Open Geodata Interoperation Specification)
——开放的地理数据互操作规范。
1、Web 地图服务(WMS—Web Map Service)
- WMS是OGC制定的一种在互联网上制作地图的Web服务规范,WMS生产的地图一般以图像格式呈现
- 用于动态地图服务,
每次接到客户请求时才动态生成
,适用于数据在不断被更新的地图服务。
2、Web 地图瓦块服务(WMTS—Web Map Tile Service)
- WMTS是OGC制定的一种发布瓦块地图的Web服务规范。
WMTS的地图是服务器预先制作好的地图瓦片。
适合于数据相对静态、不再更新或更新频率很低的数据。
参考:
1、OGC的WebGIS相关标准
2、https://docs.ogc.org/is/17-083r2/17-083r2.html
3、https://www.osgeo.cn/gis-booklet/ogc-standard-10.html
4、https://www.ogc.org/standard/wmts/
5、https://docs.ogc.org/is/13-082r2/13-082r2.html
6、https://www.osgeo.cn/gis-booklet/webgis-lxh-3.html
二、google map
google map出现之前,市场上广泛使用OGC的标准WMS服务。客户端将待显示的地理范围作为服务参数请求服务器端,服务器端将地理范围内的空间数据查询出来,并根据预定义的地图样式实时渲染成地图图片,再返回客户端浏览。
基于WMS服务的用法,涉及到地图请求实时性、体量等内容,进而影响服务器性能、网络传输性能、客户端交互性能。
为了解决这些问题,google map提出了 TMS(Tile Map Service)服务,以Pseudo Mercator投影(EPSG:3857)作为基准坐标系,将地图根据不同比例尺分层切片,以切片文件提供服务。随着技术逐渐成熟,TMS 服务成为了 WebGIS 工业标准,在该技术的推动下,OGC(地理信息联盟)也发布了基于 TMS 的 WMTS 服务规范。
关于Pseudo Mercator
投影
本质上,以参考椭球的长半轴作为半径正球化,再以长半轴作为半径的圆形周长作为长度范围投影到正方形区域。
投影原点:赤道面和本初子无线的交点,即(lon=0,lat=0)。东经为+,西经为-。
范围:赤道面方向为
(
−
R
π
,
R
π
)
(-R\pi, R\pi)
(−Rπ,Rπ),子午线方向为
(
−
R
π
,
R
π
)
(-R\pi, R\pi)
(−Rπ,Rπ)
坐标计算公式参考:
1.https://www.iogp.org/wp-content/uploads/2019/09/373-07-02.pdf page44
2.https://epsg.io/1024-method
根据纬度正算投影Y坐标的公式:
Y
=
f
a
l
s
e
_
n
o
r
t
h
+
a
ln
(
tan
(
π
2
+
l
a
t
2
)
)
Y = false\_north + a\ln(\tan(\frac{\pi}{2} + \frac{lat}{2}))
Y=false_north+aln(tan(2π+2lat))
因为
f
a
l
s
e
_
n
o
r
t
h
=
0
false\_north=0
false_north=0
当
Y
=
R
π
Y=R\pi
Y=Rπ时,存在如下关系:
ln
(
tan
(
π
2
+
l
a
t
2
)
)
=
π
\ln(\tan(\frac{\pi}{2} + \frac{lat}{2})) = \pi
ln(tan(2π+2lat))=π
=
>
=>
=>
tan
(
π
2
+
l
a
t
2
)
=
e
π
\tan(\frac{\pi}{2} + \frac{lat}{2}) = e^{\pi}
tan(2π+2lat)=eπ
l
a
t
=
85.0511287798
lat = 85.0511287798
lat=85.0511287798
可知,子午线方向,Pseudo Mercator投影的纬度范围为:
−
85.0511287798
≤
l
a
t
≤
85.0511287798
-85.0511287798 \le lat \le 85.0511287798
−85.0511287798≤lat≤85.0511287798
赤道面方向,投影的是整个圆周,所以Pseudo Mercator投影的经度范围为:
−
180
≤
l
o
n
≤
180
-180 \le lon \le 180
−180≤lon≤180
三、瓦片坐标系统
1、google map 规范
以Pseudo Mercator投影地图的左上角为瓦片坐标系统的起点,赤道面方向为X轴,子午线方向为Y轴,具体如下图所示。
Google Map下的瓦片坐标求解思路
投影平面坐标 --> 经纬度坐标 --> 像素坐标 --> 瓦片坐标
投影平面坐标 --> 经纬度坐标:
参考Pseudo Mercator投影的反算公式
经纬度坐标 --> 像素坐标:
s
c
a
l
e
=
1
<
<
z
o
o
m
scale = 1 << zoom
scale=1<<zoom
s
i
n
y
=
sin
(
l
a
t
)
siny = \sin(lat)
siny=sin(lat)
// The mapping between latitude, longitude and pixels is defined by the web mercator projection.
// Truncating to 0.9999 effectively limits latitude to 89.189:
s
i
n
y
=
m
i
n
(
m
a
x
(
s
i
n
y
,
−
0.9999
)
,
0.9999
)
siny = min(max(siny,-0.9999), 0.9999)
siny=min(max(siny,−0.9999),0.9999)
p
i
x
e
l
X
=
T
I
L
E
_
S
I
Z
E
∗
(
0.5
+
l
n
g
/
360
)
pixelX = TILE\_SIZE * (0.5 + lng / 360)
pixelX=TILE_SIZE∗(0.5+lng/360)
p
i
x
e
l
Y
=
T
I
L
E
_
S
I
Z
E
∗
(
0.5
−
l
o
g
e
(
1
+
s
i
n
y
1
−
s
i
n
y
)
)
4
π
)
pixelY = TILE\_SIZE * (0.5 - \frac{log_e(\frac{1+siny}{1-siny}))}{4\pi})
pixelY=TILE_SIZE∗(0.5−4πloge(1−siny1+siny)))
公式理解:
- 关于pixelX ,-180<=lng<=180,所以0.5 + lng / 360归算到[0,1]的范围
像素坐标 --> 瓦片坐标系:
w
o
r
l
d
X
=
p
i
x
e
l
X
∗
s
c
a
l
e
worldX = pixelX * scale
worldX=pixelX∗scale
w
o
r
l
d
Y
=
p
i
x
e
l
X
∗
s
c
a
l
e
worldY = pixelX * scale
worldY=pixelX∗scale
t
i
l
e
X
=
p
i
x
e
l
X
∗
s
c
a
l
e
T
I
L
E
_
S
I
Z
E
tileX = \frac{pixelX * scale}{TILE\_SIZE}
tileX=TILE_SIZEpixelX∗scale
t
i
l
e
Y
=
p
i
x
e
l
Y
∗
s
c
a
l
e
T
I
L
E
_
S
I
Z
E
tileY = \frac{pixelY * scale}{TILE\_SIZE}
tileY=TILE_SIZEpixelY∗scale
参考:https://code.google.com/apis/maps/documentation/overlays.html#Google_Maps_Coordinates
2、OSM的瓦片服务规范
以Pseudo Mercator投影地图的左上角为瓦片坐标系统的起点,赤道面方向为X轴,子午线方向为Y轴,具体如下图所示。
数学原理:
t
i
l
e
X
=
⌊
l
o
n
+
180
360
∗
2
z
o
o
m
⌋
tileX = \lfloor \frac{lon + 180}{360} * 2^{zoom} \rfloor
tileX=⌊360lon+180∗2zoom⌋
t
i
l
e
Y
=
⌊
(
1
−
ln
(
t
a
n
(
l
a
t
)
+
s
e
c
(
l
a
t
)
)
π
)
∗
2
z
o
o
m
−
1
⌋
tileY = \lfloor (1-\frac{\ln(tan(lat) + sec(lat))}{\pi}) * 2^{zoom-1} \rfloor
tileY=⌊(1−πln(tan(lat)+sec(lat)))∗2zoom−1⌋
参考:https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Derivation_of_tile_names
3、OGC的WMTS服务规范
以Pseudo Mercator投影地图的左上角为瓦片坐标系统的起点,赤道面方向为X轴,子午线方向为Y轴,具体如下图所示。
在一个 WMTS 服务中包括以下 3 个操作:
- GetCapabilities (获取服务的元信息)
- GetTile (获取切片)
- GetFeatureInfo (可选,获取点选的要素信息)
基础概念:
TileMatrixSet:切片矩阵集,用来表示一副地图多个比例尺层级切片组合而成的“金字塔”。
TileMatrix:切片矩阵,用来表示某一比例尺层级下的按照瓦片坐标系统定义好的切片集合。
TopLeftCorner:在某一 TileMatrix 中, 表示该比例尺层级的瓦片地图的左上角坐标,可以是投影坐标系或者经纬度坐标系
MatrixWidth和MatrixHeight:在某一 TileMatrix 中,它们分别表示每个瓦片级别在水平和垂直方向上的瓦片数
TileWidth和TileHeight:在某一 TileMatrix 中,它们表示每个瓦片的像素尺寸。在WMTS中,所有级别的瓦片通常都具有相同的尺寸
ScaleDenominator:在某一 TileMatrix 中,他表示比例尺分母。等于每个像素代表的实地距离 / 每个像素代表的屏幕距离
TileMatrixMinX,TileMatrixMinY,TileMatrixMaxX,TileMatrixMaxY:在某一 TileMatrix 中,表示该比例尺层级的瓦片地图的范围
基本数学原理:
Pseudo Mercator投影平面坐标 => 像素坐标:
// 利用长半轴周长计算地面分辨率:
c
i
r
c
u
m
f
e
r
e
n
c
e
=
π
∗
2
∗
a
circumference = \pi * 2 * a
circumference=π∗2∗a
c
i
r
c
u
m
f
e
r
e
n
c
e
H
a
l
f
=
π
∗
2
∗
a
∗
0.5
circumferenceHalf = \pi * 2 * a * 0.5
circumferenceHalf=π∗2∗a∗0.5
g
r
o
u
n
d
_
r
e
s
o
l
u
t
i
o
n
=
c
i
r
c
u
m
f
e
r
e
n
c
e
T
I
L
E
_
S
I
Z
E
∗
2
z
o
o
m
ground\_resolution = \frac{circumference}{TILE\_SIZE * 2^{zoom}}
ground_resolution=TILE_SIZE∗2zoomcircumference
// 计算像素坐标
p
i
x
e
l
X
=
p
r
o
j
X
+
c
i
r
c
u
m
f
e
r
e
n
c
e
H
a
l
f
g
r
o
u
n
d
_
r
e
s
o
l
u
t
i
o
n
pixelX = \frac{projX + circumferenceHalf}{ground\_resolution}
pixelX=ground_resolutionprojX+circumferenceHalf
p
i
x
e
l
Y
=
p
r
o
j
Y
+
c
i
r
c
u
m
f
e
r
e
n
c
e
H
a
l
f
g
r
o
u
n
d
_
r
e
s
o
l
u
t
i
o
n
pixelY = \frac{projY + circumferenceHalf}{ground\_resolution}
pixelY=ground_resolutionprojY+circumferenceHalf
像素坐标 => 瓦片坐标
t
i
l
e
X
=
⌊
p
i
x
e
l
X
T
I
L
E
_
S
I
Z
E
⌋
tileX = \lfloor \frac{pixelX}{TILE\_SIZE} \rfloor
tileX=⌊TILE_SIZEpixelX⌋
t
i
l
e
Y
=
⌊
p
i
x
e
l
Y
T
I
L
E
_
S
I
Z
E
⌋
tileY = \lfloor \frac{pixelY}{TILE\_SIZE} \rfloor
tileY=⌊TILE_SIZEpixelY⌋
参考:https://zhuanlan.zhihu.com/p/546459841?utm_id=0
具体实例1:WorldWebMercatorQuad
参考:https://docs.ogc.org/is/13-082r2/13-082r2.html
<TileMatrixSet>
<ows:Title>Google Maps Compatible for the World</ows:Title>
<ows:Identifier>WorldWebMercatorQuad</ows:Identifier>
<ows:SupportedCRS>
urn:ogc:def:crs:EPSG::3857
</ows:SupportedCRS>
<WellKnownScaleSet>
urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible
</WellKnownScaleSet>
...
<TileMatrix>
<ows:Identifier>2</ows:Identifier>
<ScaleDenominator>139770566.0071794</ScaleDenominator>
<TopLeftCorner>
-20037508.3427892 20037508.3427892
</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4</MatrixWidth>
<MatrixHeight>4</MatrixHeight>
</TileMatrix>
...
<TileMatrixSet>
具体实例2:
参考:https://docs.ogc.org/is/13-082r2/13-082r2.html
<TileMatrixSet>
<ows:Title>CRS84 for the World</ows:Title>
<ows:Identifier>WorldCRS84Quad</ows:Identifier>
<ows:SupportedCRS>
urn:ogc:def:crs:OGC:1.3:CRS84
</ows:SupportedCRS>
<WellKnownScaleSet>
urn:ogc:def:wkss:OGC:1.0:GoogleCRS84Quad
</WellKnownScaleSet>
<TileMatrix>
<ows:Identifier>-1</ows:Identifier>
<ScaleDenominator>559082264.0287178</ScaleDenominator>
<TopLeftCorner>-180 90</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>1</MatrixWidth>
<MatrixHeight>1</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>0</ows:Identifier>
<ScaleDenominator>279541132.0143589</ScaleDenominator>
<TopLeftCorner>-180 90</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>2</MatrixWidth>
<MatrixHeight>1</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>1</ows:Identifier>
<ScaleDenominator>139770566.0071794</ScaleDenominator>
<TopLeftCorner>-180 90</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4</MatrixWidth>
<MatrixHeight>2</MatrixHeight>
</TileMatrix>
...
</TileMatrixSet>
4、bing地图规范
以Pseudo Mercator投影地图的左上角为瓦片坐标系统的起点,赤道面方向为X轴,子午线方向为Y轴,具体如下图所示。
bing地图的像素坐标系:
m
a
x
P
i
x
e
l
C
o
o
r
d
X
=
T
I
L
E
_
S
I
Z
E
∗
2
z
o
o
m
−
1
maxPixelCoordX = TILE\_SIZE * 2^{zoom}-1
maxPixelCoordX=TILE_SIZE∗2zoom−1
m
a
x
P
i
x
e
l
C
o
o
r
d
Y
=
T
I
L
E
_
S
I
Z
E
∗
2
z
o
o
m
−
1
maxPixelCoordY = TILE\_SIZE * 2^{zoom}-1
maxPixelCoordY=TILE_SIZE∗2zoom−1
bing地图瓦片坐标系:
// 经纬度 => 像素坐标
p
i
x
e
l
X
=
l
o
n
+
180
360
∗
T
I
L
E
_
S
I
Z
E
∗
2
z
o
o
m
pixelX = \frac{lon+180}{360} * TILE\_SIZE * 2^{zoom}
pixelX=360lon+180∗TILE_SIZE∗2zoom
p
i
x
e
l
Y
=
(
0.5
−
ln
1
+
sin
(
l
a
t
)
1
−
sin
(
l
a
t
)
4
∗
π
)
∗
T
I
L
E
_
S
I
Z
E
∗
2
z
o
o
m
pixelY = (0.5 - \frac{\ln{\frac{1+\sin(lat)}{1-\sin(lat)}}}{4*\pi}) * TILE\_SIZE * 2^{zoom}
pixelY=(0.5−4∗πln1−sin(lat)1+sin(lat))∗TILE_SIZE∗2zoom
// 像素坐标 => 瓦片坐标
t
i
l
e
X
=
⌊
p
i
x
e
l
X
/
T
I
L
E
_
S
I
Z
E
⌋
tileX = \lfloor pixelX / TILE\_SIZE \rfloor
tileX=⌊pixelX/TILE_SIZE⌋
t
i
l
e
X
=
⌊
p
i
x
e
l
Y
/
T
I
L
E
_
S
I
Z
E
⌋
tileX = \lfloor pixelY / TILE\_SIZE \rfloor
tileX=⌊pixelY/TILE_SIZE⌋
bing地图编码坐标:
bing地图编码计算规则:
1)基本约束
- 第level级别的编码位数 = level个
- 下一级别的起始数字是上一级瓦片的编码
- 按照四叉树规则组织
2)基本规则
- 转换十进制瓦片坐标为二进制瓦片坐标
- 以y坐标的二进制值为基准,将x坐标的二进制位隔空插入到y坐标中
- 再将插入结果的二进制值转为四进制值
计算例子:
t
i
l
e
X
=
3
10
=
01
1
2
tileX = 3_{10} = 011_2
tileX=310=0112
t
i
l
e
Y
=
5
10
=
10
1
2
tileY = 5_{10} = 101_2
tileY=510=1012
q
u
a
d
k
e
y
=
100111
2
2
=
21
3
4
=
“
213
”
quadkey = 1001112_2= 213_4= “213”
quadkey=10011122=2134=“213”
参考:https://learn.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system?redirectedfrom=MSDN
四、可用地图图源汇总
4.1Google Map
图源:gac-geo.googlecnapps.cn
不过目前不能使用了,需要替换域名:gac-geo.googlecnapps.club
hl参数说明:
指定中文注记是否显示中文或英文
hl=nl (中英双语)
hl=zh-CN(中文)
-
路网注记瓦片:
https://gac-geo.googlecnapps.club/maps/vt?lyrs=h&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
卫星图无注记:
https://gac-geo.googlecnapps.club/maps/vt?lyrs=s&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
卫星图带注记:
https://gac-geo.googlecnapps.club/maps/vt?lyrs=s,h&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
或者
https://gac-geo.googlecnapps.club/maps/vt?lyrs=y&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
普通地图带注记
https://gac-geo.googlecnapps.club/maps/vt?lyrs=m&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
普通地图带注记
https://gac-geo.googlecnapps.club/maps/vt?lyrs=r&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
地形融合地图
https://gac-geo.googlecnapps.club/maps/vt?lyrs=p&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
-
地形眩晕图
https://gac-geo.googlecnapps.club/maps/vt?lyrs=t&x=407&y=211&z=9&hl=zh-CN&gl=CN&src=app&scale=2
参考:
http://bbs.3s001.com/thread-377297-1-1.html
https://blog.csdn.net/GISuuser/article/details/136896612
4.2天地图
经纬度参考框架下的影像url
http://t0.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=您的密钥
其它天地图图源参考:http://lbs.tianditu.gov.cn/server/MapService.html
4.3 必应地图
影像URL
http://ecn.t3.tiles.virtualearth.net/tiles/a{q}.jpeg?g=1
4.4 高德公开地图
影像URL
https://webst01.is.autonavi.com/appmaptile?x=2&y=2&z=2&style=6
4.5 星图地球
影像URL
https://tiles1.geovisearth.com/base/v1/img/{z}/{x}/{y}?format=webp&tmsIds=w&token=<用户的token>
4.6 ArcGIS可用的图源
https://wayback.maptiles.arcgis.com/arcgis/rest/services/world_imagery/wmts/1.0.0/default028mm/mapserver