mysql replace函数_mysql中geometry类型的简单使用

4e1755b5d61a0aab653c6d934e31370c.png

尊重出处和别人的劳动成果

mysql中geometry类型的简单使用 - 青春阳光 - 博客园​www.cnblogs.com
03b4413edf1d766811fafa7cc25dada1.png

建立表语句

CREATE 

这里我创建了一张位置信息表,每个人对应的经纬度都会以geometry类型存在表中,geohash字段是把坐标系分成很多小方格,然后将经纬度转化成字符串,其原理可自行百度,在这里就不多说了。

哦,对了,geometry类型好像不能为null,所以建表时必须为not null。

插入表数据

insert 

名字是我随便起的,不要喷我哦,经纬度是我在地图上随便取的点,geomfromtext()函数是将字符串格式的点坐标,转化成geometry类型,还有个字段geohash是根据gis字段的值自动生成的,可以仔细看看建表脚本。

如果数据库的版本是8.0以上的,用下面的语句

insert 

参考地址

MySQL空间数据操作:GeomFromText()函数报错解决_sinat_34326100的博客-CSDN博客​blog.csdn.net
46006fe6f79831989742307ef249e3ec.png

接下来是几个简单的查询例子

1. 查询张三的经纬度信息

mysql 8以上用第二条

select 

astext()函数是将geometry类型转化为字符串

sql执行结果 

c1770ed98f08cf17c520da8370664f11.png

2. 修改张三的位置信息

update 

我用的Mysql Workbench工具,修改时报错如下:

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

好像是除了用id修改,其他修改都会报这个错,下面这样设置一下就OK了 。

set sql_safe_updates = 0;

3. 查询张三和李四之间的距离

SELECT
	

本来想格式化sql语句的,但是发现格式化之后的sql 基本全变成大写的了,我觉得辨识度更低了,所有大家就这样将就看吧,st_distance_sphere()函数是计算两点之间距离的,所以传两个参数,都是geometry类型的,floor()函数是把计算出的距离取整。

sql执行结果 

f461be9b412dfe3621ade581c5a5bece.png

4. 查询距离张三500米内的所有人

SELECT 

sql执行结果

2239cec52ba65563c20daac143442a55.png

如果表中数据非常多时,这样查效率会非常低,这时就会用到geohash字段查询

sql语句如下:

SELECT 

前面说过geohash是把经纬度转成字符串,建表的时候我定义让它转成8位字符,当两个点离得越近时,它生成的geohash字符串前面相同的位数越多,所以我在这里先用left()截取前6位字符,前6位相同的误差在±600米左右,然后模糊查询,查出大概符合条件的数据,最后再精确比较,下面是geohash官方文档对geohash长度和距离误差的说明:

3c7d0e6df6ac185883e3f44c26d2b2f0.png

注意:用geohash 查询会有边界问题,所以查询出来的结果又可能不准确,可以用程序(例如java代码)先查出当前点周围8个范围的geohash值,然后再匹配这9个范围的所有数据,这样就解决了geohash 的边界问题。

geohash官方文档地址:https://en.wikipedia.org/wiki/Geohash

实际应用

首先是对经纬做限制

0e716a58d109f6a9d5a6703de28db856.png
@NotNull @Min(-180) @Max(180) @RequestHeader(BaseConstants.RequestHeaderKey.YC_LNG) BigDecimal lng,
@NotNull @Min(-90) @Max(90) @RequestHeader(BaseConstants.RequestHeaderKey.YC_LAT) BigDecimal lat

其次 校验格式需要这样玩

@RequestBody @Valid Param param, 
@NotNull @Min(-180) @Max(180) @RequestHeader(BaseConstants.RequestHeaderKey.YC_LNG) BigDecimal lng,
@NotNull @Min(-90) @Max(90) @RequestHeader(BaseConstants.RequestHeaderKey.YC_LAT) BigDecimal lat) {
		
if (lng != null && lat != null && lng.doubleValue() != 0 && lat.doubleValue() != 0) {
	param.setUserGeopoint(new GeoPoint(lng, lat));
} else {
	// 没有定位时 显示福州市政府附近商家 119.296411, 26.074286 福州市政府
	param.setUserGeopoint(new GeoPoint(new BigDecimal(119.296411), new BigDecimal(26.074286)));
}

最后

经纬对应java的属性

e97ff676f75cb3297b5bd1337528bd45.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLGeometry类型通常存储在数据库的二进制格式为WKB(Well-Known Binary)格式。要在Java解析MySQLGeometry类型,可以使用JDBC和Java自带的ByteBuffer类来读取WKB格式的二进制数据,然后使用JTS库来解析Geometry类型。以下是解析MySQLGeometry类型的示例代码: ```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解析MySQLGeometry类型了。需要注意的是,JTS库支持的Geometry类型MySQLGeometry类型更加丰富,如果需要解析MySQL不支持的Geometry类型,可能需要进行额外的换或处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值