在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言: 不久前开发了一个地图相关的后端项目,需要提供一些点线面相关的存储、查询、分析相关的操作,于是对MySQL空间函数进行充分调研并应用在项目中;MySQL为空间数据存储及处理提供了专用的类型geometry(支持所有的空间结构),还有有细分类型 一、数据类型1.什么是MySQL空间数据
|
2.什么是geojson
3.格式化空间数据类型(geometry相互转换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]}")) 空间数据格式化小结
二、空间分析
1、根据点位及半径,生成缓冲区
SELECT ST_ASGEOJSON(ST_BUFFER(ST_GeomFromGeoJSON('${geojsonStr}'),${radius})) SQL解读
示例:
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; } } 转换后的
小结: 上面介绍如何使用 三、判断点位所在城市
SELECT ST_INTERSECTS(ST_GeomFromGeoJSON('${geoJsonStrA}'), ST_GeomFromGeoJSON('${geoJsonStrB}')) SQL解读: 使用格式化函数将 四、常用的空间函数总结:
到此这篇关于MySQL空间数据存储及函数的文章就介绍到这了,更多相关MySQL空间数据存储及函数内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论