首页 > 数据库 >mysql - 在 MySQL 空间数据库中查找相交区域

mysql - 在 MySQL 空间数据库中查找相交区域

时间:2023-04-10 11:34:51浏览次数:48  
标签:center point geometry mysql ST 查找 radius MySQL 半径

在 MySQL 数据库中,如何找到完全或部分落在距另一点一定距离内的圆形区域?有很多例子可以找到某个半径内的点,但没有找到与该半径相交的圆形区域。

我有一份为某些区域(点和半径)提供服务的承包商列表。客户需要能够根据与他们的距离找到这些承包商。

最佳答案

我认为您正在寻找 ST_Buffer,它将几何图形缓冲一定距离。在您的情况下,这会将您的点变成一个圆圈,然后您可以使用 ST_Intersects 找到代表承包商区域的相交圆圈。

就像是:

Select id from contractor c where intersects(c.geom, st_buffer(point, radius));

显然,您需要提供点和半径的值。  

ST_Intersects(g1, g2) 相交关系(任意几何体)

MySql空间扩展文档中已经指明各种几何对象可以使用intersect函数来判断几何对象是否和一个矩形相交。

这样在取得近似范围后我们可以再使用距离估算来过滤出正确的结果。

SET @center = GeomFromText('POINT(10 10)');

SET @radius = 30;

SET @bbox = CONCAT('POLYGON((',

X(@center) - @radius, ' ', Y(@center) - @radius, ',',

X(@center) + @radius, ' ', Y(@center) - @radius, ',',

X(@center) + @radius, ' ', Y(@center) + @radius, ',',

X(@center) - @radius, ' ', Y(@center) + @radius, ',',

X(@center) - @radius, ' ', Y(@center) - @radius, '))'

);

 

[1]

SELECT name, AsText(location)

FROM Points

WHERE Intersects( location, GeomFromText(@bbox) )

AND SQRT(POW( ABS( X(location) - X(@center)), 2) + POW( ABS(Y(location) - Y(@center)), 2 )) < @radius; To Obtain a result ordered by distance from the center of the selection area:

 

ST_Buffer
ST_Buffer
注意:ST_BUFFER()的参数地理信息及返回值均使用墨卡托坐标系,如非墨卡托坐标系的geojson,需使用工具类进行转换处理

获取几何对象和距离,然后返回与源对象的距离小于或等于以输入距离为单位测量半径的所有点。

st_buffer(geometry, 半径)

geometry为点时【例:st_buffer(ST_GeomFromText("POINT(1 2)"), 300)】,点+半径生成圆;
geometry为线时【例:st_buffer(ST_GeomFromText("linestring(1 2,3 4)"), 300)】,线+半径生成圆角矩形;
geometry为面时【例:st_buffer(ST_GeomFromText("POLYGON(1 2,3 4,5 6)"), 300)】,面+半径生成更大的面。

在地图功能中,缓冲区是非常常见的功能,一来可以查看点线面一定范围类的覆盖区域,二来在一些分析场景中,已知一个位子坐标信息及缓冲半径,生成缓冲区作为查询条件进行地理搜索


set @lon = 110.280843;
set @lat = 19.932968;


set @point = point(@lon, @lat);

set @t = 50;  -- 单位为单位
set @radius = @t*0.01;

set @polygon = ST_Buffer(@point, @radius);

select *  from map_store_goods l
 where Intersects(l.point_area_geometry, @polygon)
-- where st_within(l.point_area_geometry, @polygon)


-- where Intersects(l.point_area_geometry, ST_Buffer(ST_GeomFromText("POINT(12250287.21186569 2204561.0470163026)"), 10000000))

 

标签:center,point,geometry,mysql,ST,查找,radius,MySQL,半径
From: https://www.cnblogs.com/Fooo/p/17302375.html

相关文章

  • 力扣1083(MySQL)-销售分析Ⅱ(简单)
    题目:编写一个SQL查询,查询购买了S8手机却没有购买iPhone的买家。注意这里S8和iPhone是Product表中的产品。查询结果格式如下图表示:Producttable:Salestable: Resulttable: id为1的买家购买了一部S8,但是却没有购买iPhone,而id为3的买家却同时购买......
  • mysql锁及锁出现总结
    转载请注明出处:1.按锁粒度分类:行锁:锁某行数据,锁粒度最小,并发度高;;行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;行锁是对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁表......
  • MySQL启用跟踪MDL(元数据锁)功能
     MySQL启用跟踪MDL(元数据锁)功能 MDL锁:全称为metadatalock,中文叫元数据锁,是从MySQL5.5开始引入的锁,是为了解决DDL操作和DML操作之间操作一致性。从锁的作用范围上来说,MDL算是一种表级锁,是一个server层的锁。其实MDL加锁过程是系统自动控制,无法直接干预,也不需要直接干......
  • LeetCode习题——x 的平方根(二分查找)
    ###x的平方根力扣链接:[x的平方根](https://leetcode.cn/problems/sqrtx/)####题目>给你一个非负整数x,计算并返回x的算术平方根。>>由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。>>注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x*......
  • MySQL、Oracle、SQLServer、PostgreSQL、DB2、Sybase、GBase、Informix关系型数据库简
    MySQLMySQL是一种开源的关系型数据库管理系统,它是最流行的数据库之一。MySQL具有高性能、可靠性和易用性的特点,支持多种操作系统和编程语言。MySQL的优点包括:优点:开源免费,可自由使用和修改高性能,支持大规模数据存储和高并发访问易于安装和使用,具有良好的文档和社区支持支......
  • 二分查找
    #include<iostream>usingnamespacestd;intbinaryFind(int*arr,intlen,inttarget){intleft=0;intright=len;#不要用sizeof(arr)/sizeof(arr[0])求数组长度,这样相当于求一个指针所占字节数8/4=2,引入参数lenwhile(left<=right){......
  • mysql的主键超过最大值会发生什么?
    设置主键的情况下在自增主键达到int64最大后,再次插入一行记录,报错如下:Duplicateentry‘4294967295’forkey‘increment_id_test.PRIMARY’唯一键冲突报错:当auto_incement达到上限后,再次申请下一个id时,得到的值保持不变。在建表时,通常都会将主键id设置为8字节的bigintu......
  • SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
    目录数据库元数据查询7.5.1列出模式中所有的表7.5.2列出所有的数据库7.5.3列出给定表的基本信息7.5.4列出给定表的索引信息7.5.5列出给定表的主键、外键约束7.5.6列出给定表的外键引用7.5.7列出给定表的检查约束7.5.8列出给定表的默认约束7.5.9列出给定表的所有约束7.5.10......
  • MySQL Cursor 的定义和使用
    前言最近项目中需要迁移数据,对旧表A的每一行记录处理后插入新表B。Google一下,发现MySQLCursor适合这种场景,上篇文章介绍了handler,那么本篇就一起看下Cursor是什么吧!本文基于MySQL8.0定义我们来看看ChatGPT是怎么理解MySQLCursor的吧:我:MySQLCursor是什么......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......