MySQL geometry类型的使用

发布时间 2023-03-29 09:39:39作者: 且行且思

数据库-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 写法:

    <insert id="insert">
        INSERT INTO cms_site(
            id,
            copyright
        ) VALUES (
            #{id},
            ST_GeomFromText('MULTIPOLYGON(((116.111111 39.111111,116.999999 39.111111,116.999999 39.999999,116.111111 39.999999,116.111111 39.111111)))')
        )
    </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}),