明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

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

Posted on 2023-04-10 11:27  且行且思  阅读(137)  评论(0编辑  收藏  举报

在 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))