Vector Tile Specification 2.1

Vector Tile Specification 2.1,第1张

原文链接 https://github.com/mapbox/vector-tile-spec/tree/master/2.1/

在此文档中, 关于关键词【必须】、【禁止】、【必要的】、【应当】、【不应】、【推荐的】、【可以】与【可选的】的解释, 见 RFC 2119 中的描述。

此文档为矢量瓦片地理数据指定了一种节省空间的编码格式。 它被设计用于浏览器或服务器端应用程序,用于快速呈现或查找特征数据。

矢量瓦片格式使用 Google Protocol Buffers 编码格式. Protocol Buffers是一种与语言无关、与平台无关的可扩展序列化机制。

矢量瓦片文件的扩展名 应该 为 mvt . 例如 vector.mvt .

When serving Vector Tiles the MIME type SHOULD be application/vnd.mapbox-vector-tile .

矢量瓦片表示一个整正方形范围内投影的数据。矢量瓦片 不应 包含关于边界和投影的信息。这个文件格式假定解码器在解码之前就已经知道投影和边界信息。

Web Mercator 是一个投影的参考, the Google tile scheme 是一个常见的范围参考. 它们一起提供了特定地理区域、特定细节级别和路径之间的一对一关系 ,例如https://example.com/17/65535/43602.mvt .

矢量瓦片可以用任何投影和瓦片范围方案来表示数据。

这个规范描述了矢量瓦片的数据结构。 读者应该了解 矢量瓦片的protobuf的数据文档 及其定义的结构。

矢量瓦片由一组命名的层组成。每一层包含地理特征和它的元数据。层格式的设计使一层所需的数据在内存中是连续的,因此层可以添加到矢量瓦片中而不需要修改现有的数据。

一个实例瓦片 应该 至少包含一层。一层 应该 至少包含一个特征。

必须 包含 version 字段,此字段为图层所依赖矢量瓦片规范版本号的主版本号。例如,一个符合2.1版本规范的图层包含一个整数值为' 2 '的 version 字段。 version 字段 应该 是层中的第一个字段。 解码器 应该 首先解析 version ,以确保他们能够解码每一层。 当矢量瓦片用户遇到一个矢量瓦片层的未知版本时,它 可能 会尽最大努力尝试解释该层,或者跳过该层。 无论哪种情况,它都 应该 继续处理矢量瓦片中的后续图层 。

一个图层必须包含一个 name 字段. 一个实例瓦片 禁止 有两个或两个以上名字完全一样的图层.。在添加一个图层到现有的矢量瓦片之前,编码器 必须 检查现有的 name 字段,以防止重复。

层中的每个特征(见下文)都可以有一个或多个键值对作为元数据。 键和值是两个列表 keys 和 values 的索引,这两个列表是跨层特征共享的。

图层中 keys 字段中的每个元素为字符串。 keys 包含图层所用到的特征,每个键都可以通过它在这个集合中的位置来索引,索引从0开始。 keys 不应 包含两个完全一样的值。

图层中 values 字段中的每个元素为以下几种类型. values 表示图层中用到的所有特征的值,每个值都可以通过它在这个集合中的位置的来索引,索引从0开始。 values 不应 包含两个完全一样的值。

为了支持不同的string, boolean, integer, 和浮点型类型, value 字段的protobuf编码由一组 optional 字段组成。一个值必须包含这些可选字段中的一个。

一个图层必须包含一个 extent , extent 通过整数坐标描述贴图的宽度和高度。通过定义 extent 瓦片内的几何图形 可以 延展出瓦片的范围,这样做通常是为了渲染一个跨越多个相邻瓦片的特征。

举例说明,如果一个瓦片的 extent 为 4096,这个瓦片的坐标单位为瓦片尺寸的1/4096。包含0的坐标在瓦片左侧或上侧的边缘。包含4096的坐标在瓦片右侧或下方的边缘。 1-4095的坐标完全在瓦片范围内,小于0或者大于4096的坐标完全在瓦片之外。 (1,10) 或 (4095,10) 完全在瓦片内,(0,10) 或 (4096,10) 在瓦片范围的边缘, (-1,10) 或 (4097,10)` 则完全在瓦片之外.

feature 必须 包含一个 geometry 字段。

feature 必须 包含一个 type 字段,如果几何类型(Geometry Types)部分所属

feature 必须 包含一个 tags 字段,如果存在Feature-level metadata,他们 应该 存储在 tags 字段。

feature 必须 包含一个id 字段。 如果feature包含 id 字段, id 的值 应该 在其所在的图层内保证唯一。

矢量瓦片的几何数据定义在一个屏幕坐标系中。瓦片的左上角为坐标系的原点(默认显示)。X轴正方向朝右,Y轴正方向朝下。几何 坐标 必须为整数。

每个几何图形被编码为32位无符号整数序列并存储在feature的 geometry 字段中。每个整数要么是 命令整数 CommandInteger 要么是参数整数 ParameterInteger . 解释器把它们解析为一系列有序 *** 作,来生成模型。

命令中的位置是相对"cursor"的,"cursor"是一个可以重定义的点。 feature执行第一个命令时 cursor 在 坐标系的 (0,0) 位置。其他命令有可能移动cursor,去影响后续命令。

CommandInteger 中command ID,用来表示要执行的命令,command count 表示命令要执行的次数。

command ID 存储在 CommandInteger 的最低3位,取值范围为[0,7],command count 存储在 CommandInteger 中剩下的29位, 取值范围[ 0 , pow(2, 29) - 1 ].

command ID, command count, CommandInteger 三者关系可由以下位 *** 作表示:

command ID用来表示以下命令:

命令用到的参数在 ParameterInteger 后面。 ParameterIntegers 的数量等于命令的参数个数乘以 CommandInteger 的command count。 比如, CommandInteger 有一个 MoveTo 命令,command count 为 3,那么在后面根6个 ParameterIntegers 。

ParameterInteger 采用 zigzag 编码,所以小的正数或者负数都会被编码成小整数。 parameter value转 ParameterInteger 公式为:

Parameter values不支持 大于 pow(2,31) - 1 或者小于 -1 * (pow(2,31) - 1) 的值。

解码 ParameterInteger 的公式:

对所有命令的描述中,初始坐标记作 (cX, cY) ,即 cursor 的坐标。

MoveTo 命令的 command count 为 n , 那么它后边必须跟随 n 对 ParameterInteger 。每对为 (dX, dY) :

LineTo 命令的 command count 为 n , 那么它后边必须跟随 n 对 ParameterInteger 。每对为 (dX, dY) :

任何 (dX, dY) 中 dX 和 dY 禁止 同时为 0 .

ClosePath 命令command count 必须为 1 且不带 ParameterInteger 。此命令创建一个从cursor (cX, cY) 开始到起始点结束的线段,来完成POLYGON 几何图形中当前的线性环的绘制。

此命令不改变 cursor位置。

在feature中 type 字段来描述 geometry 的类型 ,其值为取自枚举 GeomType 。以下几何类型被支持:

不支持几何图形集合。

该规范有意留下一个未知的几何类型作为选项。 这种几何类型对编码器可以选择实现的实验几何类型进行编码。 这种几何类型可以作为实验性的类型被某些编码器所执行。解码器可能会忽略这种几何类型的任何特征。

POINT 类型,表示一个或多个点的几何图形。此类型的命令序列 必须 是一个command count大于0的 MoveTo 的命令。

如果 POINT 类型的 MoveTo 命令的command count 等于 1,那么该几何图形 一定 是一个单点,否则,几何图形必须被解释为多点几何图形,其中每一对 ParameterInteger 为一个单点。

LINESTRING 类型表示 单个线条的 linestring 或多线条组合的 multilinestring 几何图形。此类型的命令序列必须由以下一个或者多个重复的序列组成 :

如果 LINESTRING 的命令序列只包含一个 MoveTo 命令,那么该图形一定被解释为单条线段的几何图形 ;否则,该几何图形一定被解释为多条线段组合的图形,每一个 MoveTo 命令表示新线条的起始点。

POLYGON 类型用来表示 单个多边形或这个组合多边形的几何图形, 每个多边形仅由一个外环组成,而外环又包含零个或多个内环。 此类型的命令序列必须由以下一个或者多个重复的序列组成 :

每一个 ExteriorRing 和 InteriorRing 必须由以下序列组成:

exterior ring 被定义为线性环,通过 计算公式 计算其面积为正数,在瓦片坐标系中(Y 轴正向朝下, X 轴正向朝右) 外环为顺时针顺序。

interior ring 被定义为线性环,通过 计算公式 计算其面积为负数,在瓦片坐标系中(Y 轴正向朝下, X 轴正向朝右) 外环为逆时针顺序。

如果一个 POLYGON 类型的命令序列中只有一个外环那么它一定被解释为一个多边形,否则它 一定 是一个多边形组合的图形,其每一个内环标示着一个新多边形的起点。如果一个多边形有内环,它们 必须 跟在它们所属的多边形的外环之后。

线性环 必须 是没有异常几何点的几何物体,如自交或自切。 在调用线性环的 ClosePath 命令之前,cursor的位置 不应 与线性环的第一个点重复,因为这会创建一个长度为0的线段。 线性环的面积 不应 为零,因为这意味着环上有异常的几何点。

多边形几何形状 不应 有任何内环相交,内环 必须 由外环包围。

表示一个点:

仅需要一条命令:

表示两个点分别位于:

这需要两条命令:

表示由以下点组成的Linestring:

这需要三条命令:

表示两个Linestring:

需要以下命令:

表示由以下点组成的多边形:

需要以下命令:

下边的示例 由两个多边形组成 ,其中一个有一个洞。多边形的顶点如下所示。多边形的顺序在这个例子中是 非常 重要的,因为它表示内环和新多边形之间的区别。

此多边形需要以下命令:

特征属性位于feature的 tag 字段,为成对的整数。每一对中的第一个整数为 layer 中 keys 的索引(从0开始),用来表示它属于此特征, 每一对中的第二个整数为 layer 中 values 的索引(从0开始),用来表示它属于此特征。每个键索引在该特性中 必须 是唯一的,这样该特性中的其他属性对就不会有相同的键索引。 一个特性必须有偶数个 tag 字段。特性 tag 自动中的键和值分别不能大于等于 keysvalues 集合元素的数量。

例如, 一个 GeoJSON 特征:

可以被构造为这样:

记住,几何形状的精确值会根据贴图的投影和范围而不同。

探索和学习MySQL中GIS相关功能和特性

这里记录了学习和了解MySQL中GIS特性相关内容的过程。

MySQL官方论坛中GIS的举例

测试数据已经导入成功,下面开始对GIS相关函数和GEOHASH进行了解和体验;

mysql中geometry类型的简单使用

MySQL空间数据类型

经纬度信息存储在geometry格式的字段中,该字段必须非空。

MySQL8.0前按照longitude-latitude的顺序存储位置

MySQL8.0前按照longitude-latitude的顺序存储位置

MySQL8.0前按照longitude-latitude的顺序存储位置

插入数据时候可使用如下语句:

MySQL存储geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐标系表示,组成部分如下:

WTF字符串格式说明

select ST_GeomFromText(WTF格式字符串)

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。通过WTF字符串生成geometry的方法:

点: POINT(x y)

线: LINESTRING(x1 y1, x2 y2, x3 y3...)

多边形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))

多点集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))

多线集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))

多多边形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))

例如两点一线组成的几何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:

Collections are not empty (except GeometryCollection)

更多内容参见

ST_PointFromText('POINT(X Y)')

ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)')

ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))')

ST_GeomCollFromText()

更多内容参见

参见

Point(x,y)

LineString((x1,y1),(x2,y2)...)

Polygon(LineString(),LineString()....)

参见

ST_AsText()

ST_AsBinary()

ST_AsWKT()

参见

ST_Dimension(geom) :返回geom的维度(-1,0,1,2)

ST_Envelope(geom) :返回geom的最小外接矩形(MBR)

ST_GeometryType(geom) :返回geom的类型

ST_IsEmpty(geom) :该函数并不能真实的判空,当geom为任何有效的几何值时返回0,无效的几何值返回1;

ST_IsSimple(geom) :当geom无任何异常几何点返回1(如自相交和自切线等),否则返回0

ST_SRID(geom) :返回geom的坐标系ID

参见

ST_X(Point) :获取Point的X值

ST_Y(Point) :获取Point的Y值

参见

ST_StartPoint(linestrng) : 线的起点

ST_EndPoint(linestring) :返回线的最后一个点

ST_IsClosed(linestring或multilinestring) :线是否闭合(若为线,则判断起点与终点是否一致;若为线组,则判断组内每个元素是否符合闭合线)

ST_Length(linestring) :返回线的长度,若入参为线集,则返回集合内所有长度的和

ST_NumPoiints(linestring) :返回点的数量;

ST_PointN(linestring,N) :返回第N个点(从1开始)

参见

具体不在一一列举,主要有计算多边形面积、中心点、最小外接圆,最大内接圆等函数,列举几个可能会用到的:

ST_Area(Poly|mPoly) :返回双精度的面积或面积的和

'ST_Centroid(Poly|mPoly)':返回数学上的中心点

ST_ExteriorRing(Poly) :返回外接圆

参见

ST_Buffer说明

不再列举,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比较差异,ST_Intersecton(g1,g2)交叉点,ST_SymDifference(g1,g2)对称差分,ST_Union(g1,g2)连接、合并等。

检查geometry Objects之间的空间关系的方法。

参见

计算两个Object之间的空间关系的函数,有两个间距离、相交、不相交,包含、相等、相切、重叠、接触、在内等等空间关系。下面列举几个可能会常用的方法:

ST_Contains(g1,g2) :g1是否完全包含g2

ST_Within(g1,g2) :g1是否包含于g2中

ST_Distance(g1,g2) :返回g1和g2之间的距离,已坐标单位计算的

ST_Equals(g1,g2) :返回g1和g2是否相等

参见

MBRContains(g1,g2) :g1的mbr是否包含g2的mbr

MBRWithin(g1,g2) :g1的mbr是否在g2的mbr内

MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆盖

MBRCovers(g1,g2) :g1的mbr是否覆盖g2的mbr

MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交

MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交

MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等

MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等

MBROverlaps(g1,g2) :g1mbr、g2mbr

其他函数请参看原文

GeoHash介绍

GeoHash Wiki百科

MySQL中自带函数 st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一点的geohash值。

返回一个geohash字符串中的latitude或longitude

返回一个geohash解析出的point数据

官方文档

通过geometry生成一个GeoJSON Object, select st_asgeojson(geometry,max_length,options)

通过GeoJSON生成GeoMetry对象。

ST_GeomFromGeoJSON(jsonstring, [options [, srid]])

具体使用方法参见官方文档

官方文档

MySQL中提供的方便空间运算的函数们

select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius])

此方法用于计算两点或多个点之间的地球上的距离(是地球球面距离而不是直线距离),返回单位为米,

select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))

判断入参是否是符合地理位置描述的格式。返回1(符合)或者0(不符);

例如:

返回0:

select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')

返回1:

select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')

select st_astext(st_makeenvelope(pt1, pt2))

返回两点构成的包络。(此计算是基于笛卡尔坐标系而非球面)

例如:

SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) )

返回结果:

POLYGON((0 0,1 0,1 1,0 1,0 0))

效果说明

JS抽稀算法

select st_simplify(geometry, max_distance)

用道格拉斯-普克算法(抽稀函数)简化geometry,并返回与原格式相同格式的结果。

例如,以下点集拟合为直线,步长0.5:

SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )

返回结果:

LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)

再如,步长1.0:

SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )

返回结果:

LINESTRING(0 0, 3 3)

SELECT ST_Validate(geometry)

验证geometry是符合正确的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的

了解了上述MySQL中关于集合对象的功能,下面来实践一下

由上面geohash长度-精度对应表可知,前6位表示±610米左右的误差,这里先查询前六位范围之后再用上述方法精确筛选一次即可:

可将上述查询方法封装为MySQL函数方便和简化程序调用.

该方法是运用了内置的几何关系运算函数 ST_Contains 和 ST_MakeEnvelop 来实现的,0.5对应大概500米左右的范围,具体如下;

链接: https://pan.baidu.com/s/1cW-kv6DIgtYMw5I3bNFzKA

提取码: jagn

DATETIME : 混合日期和时间值

TIMESTAMP : 混合日期和时间值,时间戳

TIME :时间值或持续时间

YEAR :年份值

CHAR :定长字符串

VARCHAR: 变长字符串

TINYBLOB : 不超过255个字符的二进制字符串

BLOB :二进制形式的长文本数据

MEDIUMBLOB : 0 - 16777215字节 二进制形式的中等长度文本数据

LONGBLOB : 0 - 4294967295字节 二进制形式的极大文本数据

TINYTEXT : 0 - 255字节 短文本字符串

TEXT :0 - 65535字节 长文本数据文本

MEDIUMTEXT : 0 - 16777215字节 中等长度文本数据

LONGTEXT : 0 - 4294967295字节 极大文本数据

ENUM : 枚举;列可赋予某个枚举成员

SET:集合;列可赋予多个集合成员

BINARY :类似Char的二进制存储,特点是插入定长不足补0

VARBINARY : 类似VarChar的变长二进制存储,特点是定长不补0

BIT :无符号[0,255],有符号[-128,127]

BOOLEAN : 布尔型,功能等同于微整型TINYTINT

GEOMETRY :层次结构的根类

POINT :点。指的是代表坐标空间中单个位置的几何类

LINESTRING :具有点之间线性内插特性的Curve

POLYGON:代表多边几何对象的平面Surface

MULTIPOINT :一种由Point元素构成的几何对象集合

MULTILINESTRING : 是一种由 LineString元素构成的MultiCurve几何对象集合

MULTIPOLYGON:是一种由Polygon元素构成的几何对象集合

参考资料:mysql 官方文档(网站)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11393748.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存