• MySQL 空间数据 简单操作


    在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库。

    现在用的就是 MySQL ,就继续用 MySQL 来存储、管理空间数据。下面就做一些简单的记录。

    创建空间数据

    CREATE TABLE `t_pot` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `pot` point DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

    上面是建的一个包含点数据的表

    CREATE TABLE `t_polygon` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `pgn` polygon DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

    上面是建的一个包含面数据的表

    MySQL 中的空间数据类型:point、linestring、polygon、geometry、multipoint、multilinestring、multipolygon、geometrycollection

    空间数据操作

    下面是对数据的一些查询、分析等操作语句

    先插入一些示例数据

    INSERT INTO `t_polygon` VALUES ('1', 'ABCD', GeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))'));
    INSERT INTO `t_polygon` VALUES ('2', 'AEGF', GeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))'));
    INSERT INTO `t_polygon` VALUES ('3', 'CEGFBD', GeomFromText('POLYGON((0 2, 0 4, 4 4, 4 0, 2 0, 2 2, 0 2))'));
    INSERT INTO `t_polygon` VALUES ('4', 'AHJIK', GeomFromText('POLYGON((0 0, 0 6, 6 6, 6 0, 0 0), (2 2, 4 4, 4 2, 2 2))'));
    INSERT INTO `t_polygon` VALUES ('5', 'DGK', GeomFromText('POLYGON((2 2, 4 4, 4 2, 2 2))'));
    INSERT INTO `t_polygon` VALUES ('6', 'GKJ', GeomFromText('POLYGON((4 4, 4 2, 6 6, 4 4))'));
    INSERT INTO `t_polygon` VALUES ('7', 'ADF', GeomFromText('POLYGON((0 0, 2 2, 4 0, 0 0))'));
    INSERT INTO `t_polygon` VALUES ('8', 'LDK', GeomFromText('POLYGON((1 1, 2 2, 4 2, 1 1))'));
    
    INSERT INTO `t_pot` VALUES ('1', 'A', GeomFromText('POINT(0 0)'));
    INSERT INTO `t_pot` VALUES ('2', 'B', GeomFromText('POINT(0 2)'));
    INSERT INTO `t_pot` VALUES ('3', 'C', GeomFromText('POINT(2 0)'));
    INSERT INTO `t_pot` VALUES ('4', 'D', GeomFromText('POINT(2 2)'));

    --多面的更新
    UPDATE street s SET s.spatial_data = GEOMETRYFROMTEXT('MULTIPOLYGON(((0 0, 2 0, 2 2, 0 2, 0 0)),((0 0, 4 0, 4 4, 0 4, 0 0)))') WHERE s.id = 4;
    --根据字段更新
    UPDATE street s SET s.coord_point = GeomFromText(CONCAT('POINT(',s.longitude,' ',s.latitude,')')) WHERE s.id = 1
    --根据空间数据查询
    SELECT * FROM street s WHERE s.coord_point = GeomFromText('POINT(116.7551422 27.9147577)')

    一些空间对象方法


    --
    包含,MBRCONTAINS,第一个参数是包含的要素,第二个是被包含的要素,第一个包含第二个返回1,否则返回0 SELECT py.`name`,p.`name`,MBRCONTAINS(py.pgn,p.pot) FROM t_polygon py,t_pot p; -- 被包含,MBRWITHIN,和上面一个参数相反,返回结果一样 SELECT py.`name`,p.`name`,MBRWITHIN(p.pot,py.pgn) FROM t_polygon py,t_pot p; -- 不相交,MBRDISJOINT,参数没有先后分,不相交返回1,否则返回1 SELECT py.`name`,p.`name`,MBRDISJOINT(p.pot,py.pgn) FROM t_polygon py,t_pot p; -- 相等,MBREQUAL,两个要素是否相等,相等返回1,否则返回0 SELECT py.`name`,p.`name`,MBREQUAL(p.pot,py.pgn) FROM t_polygon py,t_pot p; -- 相交,MBREQUAL,两个要素是否相交,相交返回1,否则返回0 SELECT py.`name`,p.`name`,MBRINTERSECTS(p.pot,py.pgn) FROM t_polygon py,t_pot p; -- 重叠,MBROVERLAPS,两个要素是否重叠,重叠返回1,否则返回0 SELECT py.`name`,p.`name`,MBROVERLAPS(p.pot,py.pgn) FROM t_polygon py,t_pot p; -- 相切,MBREQUAL,两个要素是否相切,相切返回1,否则返回0 SELECT py.`name`,p.`name`,MBREQUAL(p.pot,py.pgn) FROM t_polygon py,t_pot p;

     对于上面的几个方法,其空间关系是用的:最小边界矩形做的分析。

    所以需要进行的时候比较准确的时候,用的应该是:对象形状做分析。

    上面的几个函数的 “MBR” 替换为 “ST_” 就可以了

  • 相关阅读:
    使用Distinct()内置方法对List集合的去重 问题
    TCP连接与HTTP请求
    ASP.NET MVC 使用 Authorize 属性过滤器验证用户是否已登录
    C#进阶系列——WebApi 跨域问题解决方案:CORS
    关于设计模式的六大原则
    C# WebApi 接口传参详解
    数据库数据流量太大-问题诊断
    docker的build生成镜像和启动container
    docker生成dotnet core镜像
    NET Core 源码浏览站点工具
  • 原文地址:https://www.cnblogs.com/zhurong/p/9450930.html
Copyright © 2020-2023  润新知