2

这个问题是针对 Mysql 地理空间扩展专家的。

以下查询不是我期望的结果:

create database test_db;

use test_db;

create table test_table (g polygon not null);

insert into test_table (g) values (geomfromtext('Polygon((0 5,5 10,7 8,2 3,0 5))'));
insert into test_table (g) values (geomfromtext('Polygon((2 3,7  8,9 6,4 1,2 3))'));

select

X(PointN(ExteriorRing(g),1)), Y(PointN(ExteriorRing(g),1)),
X(PointN(ExteriorRing(g),2)), Y(PointN(ExteriorRing(g),2)),
X(PointN(ExteriorRing(g),3)), Y(PointN(ExteriorRing(g),3)),
X(PointN(ExteriorRing(g),4)), Y(PointN(ExteriorRing(g),4))

from test_table where MBRContains(g,GeomFromText('Point(3 6)'));

基本上我们正在创建 2 个多边形,并且我们正在尝试使用 MBRContains 来确定一个点是否在两个多边形中的任何一个内。

令人惊讶的是,它返回了两个多边形!点 3,6 应该只存在于第一个插入的多边形中。

请注意,两个多边形都是倾斜的(一旦您在一张纸上绘制多边形,您就会看到)

MySql 怎么会返回两个多边形?我正在使用 MySql 社区版 5.1。

4

1 回答 1

2

更新:希望这个答案已被 MySQL 淘汰:http: //forge.mysql.com/wiki/GIS_Functions!将作为旧 MBRContains 实现的参考留下,但欢迎提供解释更改的新答案,并且应该在此答案之上“接受”。

开始过时的答案

您正在使用(必要时)最小边界矩形,而不是多边形。出于查询的目的,正在比较的形状等效于:

'POLYGON(0 2,0 10,7 10,7 2,0 2)'

对于第一个形状和:

'POLYGON(2 1,9 1,9 9,2 9,2 1)'

第二个。(3,6) 两者都有。

MBR 是一种粗略的估计方法,将矩形想象成在 min(x) 和 max(x) 处有垂直线,在 max(y) 和 min(y) 处有水平线。这些形状对数据库来说更容易计算,MySQL 并不支持所有的多边形函数。(区域是的,线串通常是的,contains还没有。更多细节在这里。)。如果您目前想要更精确的地理空间几何图形,那么开源方面的最佳选择是PostGIS

于 2009-07-16T01:25:05.253 回答