美文网首页MySQL
MySQL 5.7 GIS特性

MySQL 5.7 GIS特性

作者: darebeat | 来源:发表于2017-03-19 09:39 被阅读3980次

    GIS特性 版本支持情况

    MySQL 5.7版本之前只有MyISAM引擎支持空间数据;
    MySQL 5.7版本之前只有MyISAM支持R树查询;
    MySQL 5.7版本之前地理空间类型性能比较一般;
    MySQL 5.7版本之前地理空间函数支持度有限;
    MySQL 5.7版本之前不支持GeoHash以及GeoJson;
    
    基于此,业界的LBS应用大多基于MongoDB数据库,因为MongoDB内置的geoindex非常好用,外加分片特性非常适合于LBS这样的应用。
    对于事务要求较高的应用场景,也有公司使用PostGIS。
    

    MySQL 5.7 GIS改进

    通过Boost Geometry库重构之前的地理空间数据的代码实现;
    增加很多通用的GIS函数,比如球面举例的计算函数ST_Distance_Sphere等;
    InnoDB存储引擎原生支持地理空间数据类型
    InnoDB存储引擎新增R树索引支持地理空间查询
    

    下载测试数据集 OpenStreeMap

    测试

    导入下载数据集,表结构如下:

    CREATE TABLE nodes (  
        id bigint(20) DEFAULT NULL,  
        geom geometry NOT NULL,
        geohash VARCHAR(128) AS (st_geohash(geom,6)) VIRTUAL,
        user varchar(50) DEFAULT NULL,  
        version int(11) DEFAULT NULL,  
        timestamp varchar(20) DEFAULT NULL,  
        uid int(11) DEFAULT NULL,  
        changeset int(11) DEFAULT NULL,  
        UNIQUE KEY idx_nodes_id (id),
        SPATIAL KEY idx_nodes_geom (geom),
        key idx_nodes_geohash(geohash)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    执行最常见的LBS需求:
    查找某个经纬度周围5公里的节点信息,并根据距离进行排序

    -- R树索引
    SELECT id, 
        ST_Distance_Sphere(Point(120.167673,30.259498), geom) as distance, 
        ST_AsText(geom) geom
    FROM nodes
    WHERE ST_Contains( ST_MakeEnvelope(
        Point((120.167673+(5/111)), (30.259498+(5/111))),
        Point((120.167673-(5/111)), (30.259498-(5/111)))
    ), geom )
    ORDER BY distance LIMIT 10;
    
    -- GeoHash
    -- ST_Geohash
    SELECT id, 
        ST_Distance_Sphere(Point(120.167673,30.259498), geom) as distance, 
        ST_AsText(geom) geom
    FROM nodes 
    WHERE geohash IN ('wtmknk','wtmkn6','wtmkne','wtmkn5','wtmknh','wtmkns','wtmknd','wtmkn4','wtmkn7')
    ORDER BY distance LIMIT 10
    

    相关文章

      网友评论

        本文标题:MySQL 5.7 GIS特性

        本文链接:https://www.haomeiwen.com/subject/lbkmnttx.html