mysql 显示重叠_如何处理MySQL多边形重叠查询?

SQL fiddle

创建具有多边形列的表

请注意,要使用空间索引,您不能使用InnoDB.

您可以使用没有空间索引的几何,但是性能会像往常一样降低.

CREATE TABLE IF NOT EXISTS `spatial` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`poly` geometry NOT NULL,

UNIQUE KEY `id` (`id`),

SPATIAL INDEX `poly` (`poly`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

获取3个正方形和一个三角形插入

INSERT INTO `spatial` (`poly`) VALUES (GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))',0));

INSERT INTO `spatial` (`poly`) VALUES (GeomFromText('POLYGON((10 50,50 50,50 10,10 10,10 50))',0));

INSERT INTO `spatial` (`poly`) VALUES (GeomFromText('POLYGON((1 15,5 15,5 11,1 11,1 15))',0));

INSERT INTO `spatial` (`poly`) VALUES (GeomFromText('POLYGON((11 5,15 5,15 1,11 5))',0));

选择左下角与小方形相交的所有内容

(紫色方形#1)

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Intersects(`poly`,

GEOMFROMTEXT('POLYGON((0 0,2 0,2 2,0 2,0 0))', 0 )

)

;

选择与左下角到右下角三角形相交的所有内容)

(正方形#1和#2以及三角形#4)

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Intersects(`poly`,

GEOMFROMTEXT('POLYGON((0 0,50 50,50 0,0 0))', 0 )

)

;

选择在我们的图像之外的平方的所有东西

(没有)

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Intersects(`poly`,

GEOMFROMTEXT('POLYGON((100 100,200 100,200 200,100 200,100 100))', 0 )

)

;

编辑#1:

我重读了这个问题,我觉得你的空间关系有点困惑.如果你想要的是找到适合在正方形(多边形)内的所有东西,那么你需要使用Contains / ST_Contains.请参阅spatial functions in MySQL documentation查找哪个功能为您工作.

请注意ST / MBR功能之间的区别:

选择完全在正方形内的所有内容(#0从下方)

(正方形#1,#2,三角形#4)

SELECT id,AsText(poly) FROM `spatial`

WHERE

Contains(

GEOMFROMTEXT('POLYGON((0 0,20 0,20 20,0 20,0 0))', 0 ),

`poly`

)

;

选择完全在正方形内的所有内容(#0从下方),并且不共享边

(square#2,triangle#4)

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Contains(

GEOMFROMTEXT('POLYGON((0 0,20 0,20 20,0 20,0 0))', 0 ),

`poly`

)

;

编辑#2:

非常好的添加从@StephanB(SQL fiddle)

To list all intersections join the table onto itself and filter away

the reverse intersection

选择任何重叠对象

SELECT s1.id,AsText(s1.poly), s2.id, AsText(s2.poly)

FROM `spatial` s1, `spatial` s2

WHERE

ST_Intersects(s1.poly, s2.poly)

AND s1.id < s2.id

;

(只需注意,如果使用CONTAINS,则应删除AND s1.id< s2.id,作为CONTAINS(a,b)<> CONTAINS(b,a),而Intersects(a,b)=相交(b,A))

在下图(非详尽的列表)中:

> 2相交#6.

> 6相交#2

> 0相交#1,#2,#3,#4,#5

> 1相交#0,#5

> 0包含#1,#3,#4和#5(#1,#3,#4和#5在#0内)

> 1包含#5(#5在#1之内)

> 0 st_contains#3,#4和#5

> 1 st_contains#5

编辑#3:按距离搜索/在(使用)圈子中工作

MySQL不直接支持圆形作为几何,但您可以使用空间函数缓冲区(几何,距离)来解决它.什么Buffer()做,是创建一个围绕几何的距离的缓冲区.如果从几何点开始,缓冲区确实是一个圆.

您可以通过调用以下方式查看实际执行的缓冲区:

SELECT ASTEXT(BUFFER(GEOMFROMTEXT('POINT(5 5)'),3))

(结果相当长,所以我不会在这里发布)它实际上创建了表示缓冲区的多边形 – 在这种情况下(和我的MariaDB),结果是126点多边形,它近似于一个圆.有了这样一个多边形,你可以像任何其他多边形一样工作.所以应该没有性能损失.

所以如果你想选择所有的多边形,你可以冲洗并重复上一个例子

(这会发现只有Square#3)

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Contains(

Buffer(GEOMFROMTEXT('POINT(6 15)'), 10),

`poly`

)

;

选择与圆相交的所有多边形

SELECT id,AsText(poly) FROM `spatial`

WHERE

ST_Intersects(

Buffer(GEOMFROMTEXT('POINT(6 15)'), 10),

`poly`

)

;

当使用与矩形不同的形状时,应使用ST_ *功能.没有ST_的函数使用边界矩形.所以上一个例子选择三角形#4,即使它不在圆圈.

由于Buffer()创建了相当大的多边形,与使用ST_Distance()方法相比,肯定会有一些性能损失.不幸的是,我无法量化它.你必须做一些基准测试.

通过距离查找对象的另一种方法是使用ST_Distance()函数.

从表中选择所有元素,并计算其距离点的距离(6 15)

SELECT id, AsText(`poly`),

ST_Distance(poly, GeomFromText('POINT(6 15)'))

FROM `spatial`

;

您也可以在WHERE子句中使用ST_Distance.

选择距POINT(0 0)的距离小于或等于10的所有元素(选择#1,#2和#3)

SELECT id, AsText(`poly`),

ST_Distance(poly, GeomFromText('POINT(6 15)'))

FROM `spatial`

WHERE ST_Distance(poly, GeomFromText('POINT(6 15)')) <= 10

;

虽然距离最近点最近的距离是计算的.使其类似于ST_Intersect.所以上面的例子会选择#2,即使它不完全在圆圈内.

是的,GeomFromText(text,srid)的第二个参数(0)不起任何作用,您可以安全地忽略它.我已经从一些样本中拿起它,这在我的答案中被困了.我已经把它留在我后来的编辑中.

顺便说一句. phpMyAdmin对空间扩展的支持是不完美的,但它有助于看到你的数据库中有什么.帮助我附上了我附加的这些图像.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值