MySQL空间数据存储及函数
⽬录
⼀、数据类型
1.什么是MySQL空间数据
2.什么是geojson
3.格式化空间数据类型(geometry相互转换geojson)
⼆、空间分析
1、根据点位及半径,⽣成缓冲区
三、判断点位所在城市
四、常⽤的空间函数
前⾔:
不久前开发了⼀个地图相关的后端项⽬,需要提供⼀些点线⾯相关的存储、查询、分析相关的操作,于是对MySQL空间函数进⾏充分调研并应⽤在项⽬中;MySQL为空间数据存储及处理提供了专⽤的类型geometry(⽀持所有的空间结构),还有有细分类型Point, LineString,
Polygon,MultiPoint,MultiLineString,MultiPolygon等等,我们了解了空间函数,在涉及到经纬度存储,路线存储⽅⾯的业务就能够使⽤此类型进⾏存储,使⽤相关空间函数进⾏分析业务实现,以下所有数据库操作基于MySQL5.7.20。
⼀、数据类型
mysql 字符串转数组1.什么是MySQL空间数据
MySQL提供了数据类型geometry⽤来存储坐标信息,geometry类型⽀持以下三种数据存储
还有多点MULTIPOINT(多点)、MULTILINESTRING(多线)、MULTIPOLYGON(多⾯)、GEOMETRYCOLLECTION(集合,可放⼊点线⾯)等类型
2.什么是geojson
GeoJSON是⼀种对各种地理数据结构进⾏编码的格式。GeoJSON对象可以表⽰⼏何、特征或者特征集
合。GeoJSON⽀持下⾯⼏何类型:点、线、⾯、多点、多线、多⾯和⼏何集合。GeoJSON⾥的特征包含⼀个⼏何对象和其他属性,特征集合表⽰⼀系列特征。⼀个完整的
GeoJSON数据结构总是⼀个(JSON术语⾥的)对象。在GeoJSON⾥,对象由名/值对--也称作成员的集合组成。对每个成员来说,名字总是字符串。成员的值要么是字符串、数字、对象、数组,要么是下⾯⽂本常量中的⼀个:"true","false"和"null"。数组是由值是上⾯所说的元素组成
除了简单的点、线、⾯,为了满⾜复杂的地理环境及地图业务,还会有多点(MultiPoint),多线(MultiLineString),多⾯(MultiPolygon),⼏何集合
(GeometryCollection)等,熟悉json就可以快速的熟悉并应⽤geojson
3.格式化空间数据类型(geometry相互转换geojson)
数据库存储的空间数据通过可视化⼯具展⽰的明⽂结构为上⾯⽰例中所见,结构并不易于客户端解析,所以MySQL提供了⼏个空间函数⽤来解析及格式化空间数据,geojson是gis空间数据展⽰的标准格式,前端地图框架及后端空间分析相关框架都会⽀持geojson格式
⽰例:
准备⽰例数据
函数应⽤⽰例
1.查询绿藤⽓象监测点信息将geometry处理成geojson格式
执⾏sql:
select id,point_name,ST_ASGEOJSON(point_geom) as geojson from meteorological_point where id = 1
查询结果:
2.新增⼀个点位信息,客户端提交的点位geometry字符串需要使⽤ST_GEOMFROMTEXT函数处理才能插⼊,否则会报错
客户端提交点位信息
{
"point_name":"新帅集团监测点",
"geotext":"POINT(117.420671499 40.194914201)"}
}
错误⽰例:
insert into meteorological_point(point_name, point_geom) values("新帅集团监测点", "POINT(117.420671499 40.194914201)")
报错 1416 - Cannot get geometry object from data you send to the GEOMETRY field
正确插⼊sql:
insert into meteorological_point(point_name, point_geom) values("新帅集团监测点", ST_GEOMFROMTEXT("POINT(117.420671499 40.194914201)"))
3.新增点位,客户端提交点位格式为geojson格式,需要使⽤ST_GeomFromGeoJSON函数处理后进⾏插⼊
客户端提交点位信息
{
"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 = JSONArray(COORDINATES);
JSONArray mercator = Double(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 = JSONArray(COORDINATES);
JSONArray xy = JSONArray(0);
JSONArray ms = new JSONArray();
for (int i = 0; i < xy.size(); i++) {
JSONArray p = xy.getJSONArray(i);
JSONArray m = Double(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函数⽣成缓冲区,实际操作起来经过我在研发中的应⽤是可⾏的,实际开发中还可以使⽤⼀些⼯具包来实现缓冲区⽣成,如
三、判断点位所在城市
判断⽤户点位所在城市-客户端提交⽤户的定位信息,判断⽤户所在城市(使⽤ST_INTERSECTS()判断两个⼏何是否相交即可,返回0或1) SELECT ST_INTERSECTS(ST_GeomFromGeoJSON('${geoJsonStrA}'), ST_GeomFromGeoJSON('${geoJsonStrB}'))
SQL解读:
使⽤格式化函数将geojson处理成函数⽀持的geomtry格式,使⽤ST_INTERSECTS进⾏判断即可
四、常⽤的空间函数
总结:
MySQL为空间数据的存储及分析提供了丰富的数据类型及函数,我们学习此类函数能够帮助我们更好的处理地理信息,使⽤前需要对坐标
系、geojson相关知识进⾏了解,避免踩坑,如果有相关问题也可以在评论区交流,如有误区请指正。
到此这篇关于MySQL空间数据存储及函数的⽂章就介绍到这了,更多相关MySQL空间数据存储及函数内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。