明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

MySQL geometry类型的使用

Posted on 2023-03-29 09:31  且行且思  阅读(1098)  评论(0编辑  收藏  举报

数据库-MySQL的geometry类型的使用

是什么

​ MySQL数据库的geometry字段类型类型可以存储坐标点信息并进行一系列的关系计算(包含/相交),可以满足某个坐标点是否在某个区域内的条件筛选需求。

怎么做

​ 1.建表

CREATE TABLE temp(

   id INT PRIMARY KEY AUTO_INCREMENT,

   name VARCHAR(20) COMMENT '名称' NOT NULL,

   coordinate_center_geometry GEOMETRY COMMENT '边界-使用GEOMETRY存储' NOT NULL

) COMMENT '用于测试空间数据字段的临时表';

 

2、插入sql

insert into temp (id,coordinate_center_geometry)values (1,geomfromtext('point(116.555555 39.555555)'));

 

3、常用方法

-- 构建用于测试的一个矩形和两个点,一个点在矩形内部,一个点在矩形边界上。
SET @geo1 = ST_GeomFromText('MULTIPOLYGON(((116.111111 39.111111,116.999999 39.111111,116.999999 39.999999,116.111111 39.999999,116.111111 39.111111)))');
SET @geo2 = ST_GeomFromText('POINT(116.555555 39.555555)');
SET @geo3 = ST_GeomFromText('POINT(116.111111 39.111111)');

-- @geo2上的点都在@geo1的内部或边界,并且@geo2至少有一个点在@geo1的内部,所以结果是1
SELECT ST_Contains(@geo1,@geo2); -- 1
SELECT ST_Within(@geo2,@geo1); -- 1

-- @geo2上的点都在@geo1的内部或边界,但是不满足@geo2至少有一个点在@geo1的内部,所以结果是0
SELECT ST_Contains(@geo1,@geo3); -- 0
SELECT ST_Within(@geo3,@geo1); -- 0

 

4、Mybatis 写法:注意sql中以$做为占位符,不进行类型匹配;

1.#{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为jdbc的类型。

2.${变量名}不进行数据类型匹配,直接替换。

<insert id="insert">
        INSERT INTO cms_site(
            id,
            copyright
        ) VALUES (
            #{id},

geometry = geomfromtext('${copyright}')
) </insert>
<!--我的坐标范围-->
<if test="bo.geometryString!=null and bo.geometryString!=''">
    and                 ST_Contains(ST_GeomFromText('MULTIPOLYGON(((${bo.geometryString})))'),a.coordinate_center_geometry);
</if>

 

需要注意的地方

    坐标(注意经纬度别搞反了,不然接口报错lng经度,lat维度)

    注意4326问题。报错:Binary geometry function st_contains given two geometries of different srids: 0 and 4326, which should have been identical.

    sird改为4326还是报错,加参数4326.

<if test="bo.scopeSearchBoList!=null and bo.scopeSearchBoList.size()!=0">
            and
    <foreach open="(" close=")" separator="or" collection="bo.scopeSearchBoList" item="scopeSearchBo">
        <!--区域-->
        <if test="scopeSearchBo.fscope!=null and scopeSearchBo.fscope!=''">         ST_Contains(ST_GeomFromText('MULTIPOLYGON(((${scopeSearchBo.fscope})))',4326),a.coordinate_center_geometry)
        </if>
        <!--中心点-->
        <if test="scopeSearchBo.lat!=null and scopeSearchBo.lat!='' and scopeSearchBo.lng!=null and scopeSearchBo.lng!='' and scopeSearchBo.radius!=null and scopeSearchBo.radius!=''">
            st_distance_sphere(a.coordinate_center_geometry,
                    GeometryFromText(concat('POINT(',#{scopeSearchBo.lng},' ',#{scopeSearchBo.lat},')'),4326)) &lt;= #{scopeSearchBo.radius}
        </if>
    </foreach>
</if>

 

mybatis插入geometry类型的数据:

java应用:

String geometry = bo.getMap_map_gd_coord();
bo.setMap_map_gd_coord("POLYGON(("+geometry+"))");

 

mybatis:

geomfromtext(#{bo.map_map_gd_coord}),