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

数据库-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 '用于测试空间数据字段的临时表';
  1. 插入sql

    insert into temp (id,coordinate_center_geometry)values (1,geomfromtext('point(116.555555 39.555555)'));
    
  2. 常用方法

    -- 构建用于测试的一个矩形和两个点,一个点在矩形内部,一个点在矩形边界上。
    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
    
  3. myBatis语法拼接示例

<!--我的坐标范围-->
<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}),
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值