客户端提交点位信息
{ "point_name":"民爆公司监测点", "geojson":"{"type": "Point", "coordinates": [117.410671499, 40.1549142015]}"} }
插入SQL
insert into meteorological_point(point_name, point_geom) values("民爆公司监测点", ST_GeomFromGeoJSON("{\"type\": \"Point\", \"coordinates\": [117.410671499, 40.1549142015]}"))
空间数据格式化小结
mysql geometry
数据存储需要对geometry
文本或geojson
进行函数处理后才能进行存储,否则会报错,查询时候使用格式化函数转成geojson
方便服务端传输和客户端框架解析
二、空间分析
在上一部分介绍了空间函数存储,查询格式化处理相关的操作,了解空间数据结构及geojson,这一部分介绍空间数据处理函数的应用
1、根据点位及半径,生成缓冲区
在地图功能中,缓冲区是非常常见的功能,一来可以查看点线面一定范围类的覆盖区域,二来在一些分析场景中,已知一个位子坐标信息及缓冲半径,生成缓冲区作为查询条件进行地理搜索
SELECT ST_ASGEOJSON(ST_BUFFER(ST_GeomFromGeoJSON('${geojsonStr}'),${radius}))
SQL解读
调用方传来一个geojson字符串及半径(米),使用
ST_GeomFromGeoJSON
将geojson
字符串处理成数据库中的geometry
,再使用ST_BUFFER(geometry
, 半径)s生成缓冲区空间数据,函数返回的格式也是geometry,所以在外面包一层ST_ASGEOJSON
函数将返回结果处理成geojson,便于客户端读取及渲染
示例:
- 有一个点位的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...
三、判断点位所在城市
- 判断用户点位所在城市-客户端提交用户的定位信息,判断用户所在城市(使用ST_INTERSECTS()判断两个几何是否相交即可,返回0或1)
SELECT ST_INTERSECTS(ST_GeomFromGeoJSON('${geoJsonStrA}'), ST_GeomFromGeoJSON('${geoJsonStrB}'))
SQL解读:
使用格式化函数将geojson
处理成函数支持的geomtry格式,使用ST_INTERSECTS
进行判断即可
四、常用的空间函数
总结:
MySQL
为空间数据的存储及分析提供了丰富的数据类型及函数,我们学习此类函数能够帮助我们更好的处理地理信息,使用前需要对坐标系、geojson
相关知识进行了解,避免踩坑,如果有相关问题也可以在评论区交流,如有误区请指正。
到此这篇关于MySQL空间数据存储及函数的文章就介绍到这了,更多相关MySQL空间数据存储及函数内容请搜索
更多Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
mysql插入sql语句后在phpmyadmin中注释乱码怎么办?
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。