当前位置: 首页 > 科技观察

mysql空间函数实现位置签到

时间:2023-03-16 13:26:58 科技观察

项目需求是判断用户当前位置是否在给定的地理位置范围内,满足位置限制才签到。位置范围是一个或多个不规则多边形。如下图,判断用户是在清华还是北大。图形化获取区域坐标由于项目前端使用微信小程序的wx.getLocation获取地理位置,为了坐标的一致性,后台选择区域使用了腾讯地图的地理位置服务范围。在applicationtool->Drawgeometry中,提供点、线、多边形和圆可以很方便的选择看这里。选中的位置坐标在官方示例上稍作修改即可得到。坐标位置取下来后,如何存储呢?开放地理空间联盟(OGC)是一个由250多家公司、机构和大学组成的国际联盟,参与开发可用于管理空间数据的各种应用程序的公开空间解决方案。OGC发布了地理信息的OpenGIS?实施标准,可从OGC网站http://www.opengeospatial.org/standards/sfs获取。为了遵循OGC规范,MySQL将空间扩展作为具有几何类型环境的SQL的子集来实现,提供用于生成、存储和分析空间的功能。总之,MySQL可以满足我们的需求。MySQL提供了单一的存储类型POINT、LINESTRING、POLYGON分别对应几何点、线、多边形,GEOMETRY可以存储这三种中的任意一种。同时具有存储多种类型的能力。MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION依次对应单个图的复数。回到项目中,我们使用POLYGON,建表语句如下:CREATETABLE`polygon`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(255)DEFAULTNULL,`polygon`polygonNOTNULL,PRIMARYKEY(`id`),SPATIALKEY`d`(`polygon`))DEFAULTCHARSET=utf8;插入数据MySQL支持将Well-KnownText(WKT)格式和Well-KnownBinary(WKB)格式转换为对象类型进行存储,我们使用更容易理解的WKT格式。IfyouareinterestedinWKB,youcanreadithere.插入语句如下:INSERTINTO`polygon`VALUES('1','清华大学',GeomFromText('POLYGON((40.01169924229143116.31565081888039,39.99304082299905116.31616541796757,39.99343506780591116.33297565023167,40.00237067000859116.33743550702275,40.01340715321479116.33057418815224,40.01169924229143116.31565081888039))'));INSERTINTO`polygon`VALUES('2','北京大学',GeomFromText('POLYGON((39.99711457525893116.30450117461078,39.98673259872773116.30535884106575,39.98673259872773116.31702308311287,39.99963848242885116.31598375134854,39.99711457525893116.30450117461078))'));需要注意的是,腾讯地图返回的多边形的点不是闭合的,多边形函数要求首尾点相同才能判断多边形是否闭合。如果不是闭合多边形,则返回结果为NULL,插入语句失败。如果几何满足(非详尽的)列表中的条件,则它在句法上是良构的:线串至少有两个点多边形至少有一个环至少4个点(最小多边形为三角形,首末点相同)集合不为空(GeometryCollection除外)查询判断SELECT*FROMpolygonWHEREMBRWithin(ST_GeomFromText('POINT(39.991333490218544116.30964748487895)'),polygon);#在北京大学SELECT*FROMpolygonWHEREMBRWithin(ST_GeomFromText('POINT(39.988967560246685116.3286905102832)'),polygon);#不是北大的同学可能会发现这里的查询语句使用了函数。在以前的SQL中,如果在已有的查询字段上使用函数,必然会导致索引失效和全表扫描,但在空间数据上则不会。先看EXPLAIN语句和结果:可见MySQL空间数据也是可以索引的。使用的关键字是SPATIAL,用法如下:CREATETABLEgeom(gGEOMETRYNOTNULL);创建空间索引gONgeom(g);常用的空间计算函数1、确定两点之间的距离ST_Distance(g1,g2),返回g1和g2之间的距离。如果任一参数为NULL或空几何,则返回值为NULL。2.图1是否完全包含图2ST_Contains(g1,g2),返回1或0表示g1是否完全包含g2。您也可以使用ST_Within(g2,g1)来达到相同的效果。3.DisjointST_Disjoint(g1,g2),返回1或0表示g1是否与(disjoint)g2在空间上不相交。4.图形交集比较复杂,包括重叠、外交等,具体可以看这里总结一个地理位置签到的需求,使用MySQL自带的Polygon数据类型实现空间数据的存储。使用ST_Contains(g1,g2)函数将后台预设的地理区域与前端获取的用户地理位置进行代入,判断用户是否在签到范围内。还涉及到MySQL在使用函数作为查询字段时仍然可以使用索引,最后扩展了一些其他的空间处理功能。

最新推荐
猜你喜欢