数据库-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}),