当前位置:首页 > 生活百科

mysql解析json字符串数组(mysql json数组查询)

栏目:生活百科日期:2025-04-24浏览:0

前言


不久前开发了一个地图相关的后端项目,需要提供一些点线面相关的存储、查询、分析相关的操作,于是对MySQL空间函数进行充分调研并应用在项目中;MySQL为空间数据存储及处理提供了专用的类型geometry(支持所有的空间结构),还有有细分类型Point, LineString, Polygon,MultiPoint,MultiLineString,MultiPolygon等等,我们了解了空间函数,在涉及到经纬度存储,路线存储方面的业务就能够使用此类型进行存储,使用相关空间函数进行分析业务实现,以下所有数据库操作基于MySQL5.7.20。

数据类型

1.什么是MySQL空间数据

MySQL提供了数据类型geometry用来存储坐标信息,geometry类型支持以下三种数据存储

在地图功能中,缓冲区是非常常见的功能,一来可以查看点线面一定范围类的覆盖区域,二来在一些分析场景中,已知一个位子坐标信息及缓冲半径,生成缓冲区作为查询条件进行地理搜索

SELECT ST_ASGEOJSON(ST_BUFFER(ST_GeomFromGeoJSON('${geojsonStr}'),${radius}))

SQL解读

调用方传来一个geojson字符串及半径(米),使用ST_GeomFromGeoJSON将geojson字符串处理成数据库中的geometry,再使用ST_BUFFER(geometry, 半径)s生成缓冲区空间数据,函数返回的格式也是geometry,所以在外面包一层ST_ASGEOJSON函数将返回结果处理成geojson,便于客户端读取及渲染

示例

1.有一个点位的geojson字符串为 &“{&“type&”: &“Point&”, &“coordinates&”: [117.410671499, 40.1549142015]}&”,缓冲半径50米(注意:ST_BUFFER()的参数地理信息及返回值均使用墨卡托坐标系,如非墨卡托坐标系的geojson,需使用工具类进行转换处理)

public class MercatorUtils {    /**     * 点位geojson转墨卡托     *     * @param point     * @return     */    public static JSONObject point2Mercator(JSONObject point) {        JSONArray xy = point.getJSONArray(COORDINATES);        JSONArray mercator = lngLat2Mercator(xy.getDouble(0), xy.getDouble(1));        point.put(COORDINATES, mercator);        return point;    }    /**     * 经纬度转墨卡托     */    public static JSONArray lngLat2Mercator(double lng, double lat) {        double x = lng * 20037508.342789 / 180;        double y = Math.log(Math.tan((90 + lat) * M_PI / 360)) / (M_PI / 180);        y = y * 20037508.34789 / 180;        JSONArray xy = new JSONArray();        xy.add(x);        xy.add(y);        return xy;    }        /**     * 墨卡托坐标系数据转普通坐标系     */    public static JSONObject mercatorPolygon2Lnglat(JSONObject polygon) {        JSONArray coordinates = polygon.getJSONArray(COORDINATES);        JSONArray xy = coordinates.getJSONArray(0);        JSONArray ms = new JSONArray();        for (int i = 0; i &< xy.size(); i++) {            JSONArray p = xy.getJSONArray(i);            JSONArray m = mercator2lngLat(p.getDouble(0), p.getDouble(1));            ms.add(m);        }        JSONArray newCoordinates = new JSONArray();        newCoordinates.add(ms);        polygon.put(COORDINATES, newCoordinates);        return polygon;    }}

转换后的geojson就可以作为上面缓冲区的sql生成缓冲区空间数据了,生成的缓冲区数据也是墨卡托坐标系,需使用mercatorPolygon2Lnglat进行处理后返回给客户端,调用流程如下:

客户端提交点位geojson及半径使用墨卡托工具类将点位geojson转换成墨卡托坐标系的geojson调用sql进行缓冲区生成返回值使用墨卡托工具类转换成mercatorPolygon2Lnglat返回给调用方

小结

上面介绍如何使用mysql st_buffer函数生成缓冲区,实际操作起来经过我在研发中的应用是可行的,实际开发中还可以使用一些工具包来实现缓冲区生成,如geotools&…


判断点位所在城市

2.判断用户点位所在城市-客户端提交用户的定位信息,判断用户所在城市(使用ST_INTERSECTS()判断两个几何是否相交即可,返回0或1)

SELECT ST_INTERSECTS(ST_GeomFromGeoJSON('${geoJsonStrA}'), ST_GeomFromGeoJSON('${geoJsonStrB}'))复制代码

SQL解读

使用格式化函数将geojson处理成函数支持的geomtry格式,使用ST_INTERSECTS进行判断即可

常用的空间函数

名称描述ST_INTERSECTS()判断两个几何是否相交ST_DISTANCE()两个几何的距离ST_CONTAIONS()几何是否包含ST_ISVALID()几何是否有效

总结

MySQL为空间数据的存储及分析提供了丰富的数据类型及函数,我们学习此类函数能够帮助我们更好的处理地理信息,使用前需要对坐标系、geojson相关知识进行了解,避免踩坑,如果有相关问题也可以在评论区交流,如有误区请指正。

“mysql解析json字符串数组(mysql json数组查询)” 的相关文章

坚果g7和极米z6x哪个好,解说两者质量对比差距

假期周末能够和朋友亲人一起出游当然是美滋滋的,但相信也有不少人与我一样喜欢在闲暇时候看看电影,那么一款实用好用的家用投影就是必备了。说干就干,选购商品是件很枯燥...

2020暴利网赚项目排行(很多人都辞职在做)

最近看到朋友圈一张很火图片,瞬间被戳中了泪点:临近过年,银行卡上的钱除了0还是0,已经有很多人在策划着过年去哪哪上香或者找先生算算命了。以期待来年能够一帆风顺/...

免费物流软件有哪些(免费仓储物流软件推荐)

随着网络技术的发展,越来越多的物流企业通过软件来提高运营效益。找一款便宜又好用的物流系统显得尤为重要。目前市面上的物流软件都不是免费的。而且也不便宜,大都在千元...

可以自己设计logo的软件(logo设计在线生成)

再给大家补充一个LOGO生成器:shapefactory.co,他们家的产品都超好用,我用得最多的就是双色生成器Duotone!??Canvacanva.com...

如何做好网络广告推广(见效最好的5个方法)

从事互联网广告的朋友们都知道,想要把这份工作做好,并没有那么容易!当然任何事情都有他的解决办法和成功秘诀!今天给大家分享5个投放互联网广告的小诀窍,解决令你头痛...

免费在线商标生成器(自动生成商标LOGO)

今天无意中发现一个真实可靠的logo在线设计网站https://www.designevo.com/cn/虽然是国外的网站,可是有中文版本,良心啊良心下面咱们进...

ghost一键备份还原怎么用(详解ghost备份还原教程)

说到ghost备份还原系统的方法,相信大家都一定不会陌生。ghost是系统的镜像文件,在系统出现一些小问题时,可以帮助我们快速恢复系统。如果你也同样的需求,那么...

全球品牌100强有哪些(最具价值的100强品牌)

如今之世界,依然是强者的天下;一个国家实力的强弱,通过其顶尖公司的全球数量,其实完全可以体现出来。近日,世界品牌实验室发布了2020世界品牌500强榜单,我们今...

ipad怎么录音功能(苹果录屏提取音频方法)

在iOS12上,语音备忘录可能是唯一在图标、设计以及功能上全都做了改动的原生App。iOS上的很多原生App都受到忽视,语音备忘录也是其中之一。这次,苹果希望用...

win7鼠标灵敏度怎么调(设置鼠标灵敏度的两种方法)

鼠标刷新率如何设置呢?鼠标刷新率又称回报率,是指鼠标MCU与电脑传输数据频率。鼠标回报率对于游戏玩家而言至关重要,但同时鼠标刷新率与电脑性能息息相关。只有电脑硬...