MySQL Geometry的使用 —— 地理空间类型Geometry

注意:在投影坐标系中不同的投影标准有不同的单位,如常用到的投影标准:3857以米为单位,4326以度为单位

一、Geometry数据类型有哪些?

1.Geometry介绍
  • MySQL中支持的几何数据类型包括Geometry(几何)、Point(点)、LineString(线)、Polygon(面)
    以及集合类型的MultiPoint(多点)、MultiLineString(多线)、MultiPolygon(多面)、GeometryCollection(混合数据类型)
  • 其中,Geometry可以表示其他任意类型的值,剩下的只能表示单个类型的值
2.Geometry类型

注意:数据中间不能有多余的空格

名称类型例如
Point点坐标POINT(103 35)
LineString线坐标LINESTRING(103 35,103 36,104 36,105 37)
Polygon面坐标POLYGON(103 35,104 35,104 36,103 36,103 35)
MultiPoint多点MULTIPOINT(103 35, 104 34,105 35)
MultiLineString多线MULTILINESTRING((103 35, 104 35), (105 36, 105 37))
MultiPolygon多面MULTIPOLYGON(((103 35,104 35,104 36,103 36,103 35)),((103 36,104 36,104 37,103 36)))
GeometryCollection混合类型GEOMETRYCOLLECTION(POINT(103 35), LINESTRING(103 35, 103 37))

二、Geometry数据格式

  • WKT(文本格式:在代码中的格式)
  • WKB(二进制格式:存储在Geometry类型的表字段中)

三、Geometry的常用函数

1.构造函数

构造函数会获取一种几何类型或几何的文本说明,然后创建一个几何

  • ST_Point:文本格式转Point格式(例如存表的时候)
  • ST_PointFromText:Point格式转文本格式(例如查询的时候)
  • ST_Polygon:文本格式转Polygon格式
  • ST_PolygonFromText:Polygon格式转文本格式
  • ST_PointFromWKB:以熟知二进制 (WKB) 表示和空间参考 ID 作为输入参数返回 ST_Point 类型的对象
2.存取器函数

函数都采用一个或多个几何作为输入,并返回关于几何的特定信息

  • 获取线/面对象四至:st_xmin(geometry)、st_ymin(geometry)、st_xmax(geometry)、st_ymax(geometry)
  • ST_AsText:获取一个几何类型,然后返回其可识别的文本表示
  • ST_AsGeoJSON:将Geometry格式转为JSON格式
  • ST_Centroid:以面或多面为参数输入,然后返回位于几何的包络矩形中心的点
  • ST_Length:用于返回线串或多线串的长度
  • ST_MaxX:以几何为参数,返回最大的 X 坐标
  • ST_SRID:以几何对象作为输入参数,并返回其空间参考 ID
  • ST_X:返回点坐标的 X 坐标
  • ST_Y:返回点坐标的 Y 坐标
3.关系函数

关系函数将几何作为输入并确定各几何之间是否存在特定关系

  • ST_Contains:判断第一个几何对象是否完全包含第二个几何对象
  • ST_Disjoint:判断两个几何对象无交集
  • ST_Equals:判断两个几何对象是否完全相同
4.几何函数

函数利用空间数据并对其执行分析,然后返回新的空间数据

  • ST_Buffer:获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象(例如可以使用线坐标,构造一个线坐标50米之内的面)
  • ST_Distance:用于返回两个几何之间的距离。这一距离是两个几何的最近折点之间的距离
  • ST_Difference:获取两个几何对象,然后返回表示两个源对象之差的几何对象(例如,计算两个面积差)

更多相关函数可参考:ArcMap

四、使用实例

1.从Geometry字段获得信息
  • 通过点坐标 wzxx 字段、线坐标 sydwfw 字段,获得不同类型的数据
select ST_AsText(wzxx) as geometry, ST_X(wzxx) as x, ST_Y(wzxx) as y,
	ST_AsGeoJSON(wzxx) as wzxx, ST_AsText(sydwfw) as sydwfw
from tb_sydw
2.搜索指定范围之内的数据
  • 获得点坐标(103,36)2000米之内的数据
select * from tb_sydw
where st_distance_sphere(ST_POINTFROMTEXT('POINT(103,36)'), wzxx) < 2000
3.搜索指定范围之内的数据(Geohash算法提速)
  • 通过Geohash算法,可先将范围缩小,在进行精确查找,提高效率(注意边缘问题和曲线突变问题)

GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串,然后通过编码前多少位,直接进行匹配,从而快速的锁定一个较小范围

select * from tb_sydw
where st_geohash(wzxx,5) like concat(st_geohash(ST_POINTFROMTEXT('POINT(103,36)'),5),'%')
4.获得路径多大范围内的面坐标
  • 通过路径坐标数据,获得路径多边形(如需要查找路径多少范围内的数据时),需要注意单位是度还是米,其中ST_Buffer_Strategy为线构造面时,起始点及拐弯处,精度策略

具体可参考:ST_Buffer

SELECT ST_AsText(
		 ST_Buffer(
			ST_GeomFromText('LINESTRING(103 35,103 36,104 36)'), 0.04,
					ST_Buffer_Strategy('end_round',4),ST_Buffer_Strategy('join_round',4)
         )
       )

函数后两个参数,影响箭头处圆滑程度,精度越高,构造出来的面越圆滑,消耗也更大

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MySQLGeometry类型通常存储在数据库中的二进制格式为WKB(Well-Known Binary)格式。要在Java中解析MySQL中的Geometry类型,可以使用JDBC和Java自带的ByteBuffer类来读取WKB格式的二进制数据,然后使用JTS库来解析Geometry类型。以下是解析MySQL中的Geometry类型的示例代码: ```java import java.nio.ByteBuffer; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.WKBReader; public class GeometryParser { private final Connection conn; public GeometryParser(String url, String user, String password) throws SQLException { Properties props = new Properties(); props.setProperty("user", user); props.setProperty("password", password); this.conn = DriverManager.getConnection(url, props); } public Geometry parseGeometry(String tableName, String columnName, int id) throws SQLException { String sql = String.format("SELECT %s FROM %s WHERE id=?", columnName, tableName); try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setInt(1, id); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { byte[] wkb = rs.getBytes(1); return parseWkb(wkb); } else { throw new SQLException("No data found"); } } } } private Geometry parseWkb(byte[] wkb) throws SQLException { WKBReader reader = new WKBReader(); ByteBuffer buffer = ByteBuffer.wrap(wkb); // 设置字节顺序为大端模式 buffer.order(ByteOrder.BIG_ENDIAN); try { return reader.read(buffer); } catch (com.vividsolutions.jts.io.ParseException e) { throw new SQLException("Failed to parse geometry", e); } } } ``` 在上面的示例代码中,首先使用JDBC连接到MySQL数据库,然后使用PreparedStatement执行SQL语句,读取指定表格、列名和ID的Geometry数据。接着,使用Java自带的ByteBuffer类读取WKB格式的二进制数据,并使用JTS库提供的WKBReader类解析Geometry类型。最后,返回解析得到的Geometry对象。 在使用上述代码时,需要通过以下步骤来准备开发环境: 1. 下载并添加JTS库的依赖。可以通过Maven等工具来管理依赖,或者手动下载jar包并添加到项目中。 2. 添加MySQL的JDBC驱动依赖。可以通过Maven等工具来管理依赖,或者手动下载jar包并添加到项目中。 3. 确保MySQL数据库中已经创建了包含Geometry类型的表格,并插入了相应的数据。在创建表格时,需要指定Geometry类型的列的数据类型GEOMETRY,并在插入数据时将Geometry类型的数据转换为WKB格式的二进制数据。例如: ```sql CREATE TABLE mytable ( id INT PRIMARY KEY, geom GEOMETRY NOT NULL ); INSERT INTO mytable (id, geom) VALUES (1, ST_GeomFromText('POINT(1 2)')); ``` 通过以上步骤,就可以在Java中解析MySQL中的Geometry类型了。需要注意的是,JTS库支持的Geometry类型MySQLGeometry类型更加丰富,如果需要解析MySQL中不支持的Geometry类型,可能需要进行额外的转换或处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值