数据库-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)) <= #{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}),
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2019-03-29 用SQL语句查找包含有某个关键字的存储过程、触发器、函数等等
2019-03-29 查看SQLServer最耗资源时间的SQL语句
2017-03-29 c#里BindingFlags 筛选标志
2017-03-29 C#语法中一个问号(?)和两个问号(??)的运算符
2017-03-29 C# MD5位加密
2017-03-29 subversion与TortoiseSVN的使用
2017-03-29 VS2015和SVN合作