MySQL的坐标系类型
MySQL 具有保存地理位置信息的功能,该功能符合OpenGIS的规范数据类型.该规范下有下面的数据类型.
-
保存单个地理位置类型
- POINT(坐标)
代表的是一个坐标,有X,Y坐标 X坐标可以当成是纬度Longitude,Y坐标可以当作为经度Latitude.
X和Y都是 Double (8byte) 浮点类型数值
-- point 类型 mysql>select Point(123,132) from dual; +----------------+ | Point(123,132) | +----------------+ | POINT(123 132) | +----------------+ 1 row in set mysql> select ST_GeomFromText('POINT(15 20)') from dual ; +---------------------------------+ | ST_GeomFromText('POINT(15 20)') | +---------------------------------+ | POINT(15 20) | +---------------------------------+ 1 row in set -- 获取X坐标 mysql> SELECT ST_X(Point(15, 20)); +---------------------+ | ST_X(POINT(15, 20)) | +---------------------+ | 15 | +---------------------+ mysql> SELECT ST_Y(Point(15, 20)); +---------------------+ | ST_Y(POINT(15, 20)) | +---------------------+ | 20| +---------------------+
- LineString
表示一系列坐标连接的线
-- 字符串转成lineString mysql> select LINESTRING(point(1,1), point(2,1) ) from dual; +-------------------------------------+ | LINESTRING(point(1,1), point(2,1) ) | +-------------------------------------+ | LINESTRING(1 1, 2 1) | +-------------------------------------+ 1 row in set mysql> select ST_MPointFromText('LINESTRING(0 0, 10 10, 20 25, 50 60)') from dual; +-----------------------------------------------------------+ | ST_MPointFromText('LINESTRING(0 0, 10 10, 20 25, 50 60)') | +-----------------------------------------------------------+ | LINESTRING(0 0, 10 10, 20 25, 50 60) | +-----------------------------------------------------------+ 1 row in set
- Polygon
表示一些列线连接封闭的多边形
mysql> select ST_MPointFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))') from dual; +--------------------------------------------------------------------------------+ | ST_MPointFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))') | +--------------------------------------------------------------------------------+ | POLYGON((0 0, 10 0, 10 10, 0 10, 0 0), (5 5, 7 5, 7 7, 5 7, 5 5)) | +--------------------------------------------------------------------------------+ 1 row in set -- 非字符串转换 没有,太麻烦
- Geometry
能够保存 Point, LineString , Polygon 数据类型,并能完整保存其类型.
具有下面的属性
- POINT(坐标)
属性 | 描述 |
---|---|
type | 可实例化的基础地理数据类型 |
SRID | 空间参考标识符(spatial reference identifier),描述该对象的坐标空间的 ID,是根据MySQL的空间引用参考系统做唯一的标识 最大值位2^32 -1 ,0 代表无限空间 |
coordinates | 空间坐标,至少一对Point(X,Y) ,它与SRID 有关联,但不能完全代表地球地理位置坐标体系,它有可能是显示器的planar 坐标体系. |
MBR | 最小边界矩形,或者包络线, 这是由最小和最大的坐标构成 ((左下角坐标,右下角坐标,左上角坐标,右上角坐标))((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY)) |
empty /nonempty | 空或者不空,空或者NULL 维度为0 |
- 保存多地理位置集合数据的类型
- MultiPoint
多个点
两种生产方式
select ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') from dual; select MULTIPOINT(point(1,1), point(2,1) ) from dual;
- MultiLineString
多条线
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
- MultiPolygon
多个多边形MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
- GeoMetryCollection
能通用保存多地理位置集合类型(MultiPoint , MultiLineString , MultiPolygon)
``
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
- MultiPoint
MySQL 的索引
mysql> CREATE SPATIAL INDEX spIndex ON TableName(column) COMMENT '经纬度R-tree 索引';
-- 使用 SPATIAL INDEX
mysql> EXPLAIN SELECT * FROM TableName WHERE
-> MBRContains(POINT(x,y),column)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: TableName
type: range
possible_keys: spIndex
key: spIndex
key_len: 32
ref: NULL
rows: 50
Extra: Using where
1 row in set (0.00 sec)
--- 当不使用 索引时的结果
mysql> EXPLAIN SELECT * FROM TableName WHERE
-> MBRContains(POINT(x,y),column)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: TableName
type: range
possible_keys: NULL
key:NULL
key_len: 32
ref: NULL
rows: 50
Extra: Using where
1 row in set (0.00 sec)