MySQL的地理位置类型

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 数据类型,并能完整保存其类型.
      具有下面的属性
属性描述
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))
    
    

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)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL支持地理空间信息的存储和查询。你可以使用MySQL的地理空间展来处理地理空间数据类型,点、线、多边形等。 要使用理空间功能,你需要确保你的版本支持地理空间扩展。在装MySQL时,需要选择启用地理空间支持,或者在已安装的MySQL上启用地理空间插件。 一旦你的MySQL服务器支持地理空间扩展,你可以创建具有地理空间属性的表,并将地理空间数据存储在其中。下面是一个创建包含地理空间列的表的示例: ```sql CREATE TABLE locations ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), location GEOMETRY ); ``` 在这个例子中,`location`列被定义为`GEOMETRY`类型,用于存储地理空间数据。 要查询地理空间数据,你可以使用一些MySQL提供的函数和操作符。例如,你可以使用 `ST_DISTANCE()` 函数计算两个点之间的距离,使用 `ST_CONTAINS()` 函数判断一个点是否在一个多边形内等等。 以下是一个简单的查询示例,找出距离给定坐标最近的位置: ```sql SELECT id, name, ST_DISTANCE(location, POINT(40.7128, -74.0060)) AS distance FROM locations ORDER BY distance LIMIT 1; ``` 这个查询将返回距离给定坐标(纬度40.7128,经度-74.0060)最近的位置的id、名称和距离。 这只是地理空间功能的简单介绍,MySQL提供了更多的函数和操作符来处理地理空间数据。你可以查阅MySQL官方文档以获得更详细的信息和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值