MySQL函数MBRContains不准确。

12
我有以下的多边形(你可以在图片中看到它所覆盖的区域)。

多边形区域

POLYGON((-74.05100448502202 4.7239278424321,-74.05092938316898 4.7241416902206,-74.04830618275201 4.7237460717602,-74.04643668306903 4.7234306460692,-74.04635688735101 4.7234105978214,-74.04636526925401 4.7233310730989,-74.046191260944 4.72327293317,-74.04579027069599 4.7232007594583,-74.04141290558402 4.7214258184083,-74.03746201170497 4.7197791822891,-74.03565688503801 4.7189879401666,-74.033484295736 4.7180897723398,-74.03098447693401 4.7170526009038,-74.028731840457 4.7161167561787,-74.02852820211899 4.7150714370973,-74.026398371001 4.6877232674918,-74.02558060109601 4.6874859863574,-74.02454587610401 4.686797564651,-74.024665108676 4.6863189291555,-74.025470986757 4.6857975214267,-74.02585246812498 4.6846813784365,-74.02580479605103 4.6834369175226,-74.01962984798399 4.684922743491,-74.028472839649 4.6765444849623,-74.032273278366 4.6775012677607,-74.03825980124901 4.6799297676049,-74.048215993474 4.6850422042295,-74.05718496514402 4.6867981911917,-74.05100448502202 4.7239278424321))
当我执行 MBRIntersectMBRContainsWithin 函数时,它们返回绿色标记在多边形内部,但实际上并不是(如您所见的图像)。我正在执行以下语句以获得结果:
SET @g1 = ST_GeomFromText('POLYGON((-74.05100448502202 4.7239278424321,-74.05092938316898 4.7241416902206,-74.04830618275201 4.7237460717602,-74.04643668306903 4.7234306460692,-74.04635688735101 4.7234105978214,-74.04636526925401 4.7233310730989,-74.046191260944 4.72327293317,-74.04579027069599 4.7232007594583,-74.04141290558402 4.7214258184083,-74.03746201170497 4.7197791822891,-74.03565688503801 4.7189879401666,-74.033484295736 4.7180897723398,-74.03098447693401 4.7170526009038,-74.028731840457 4.7161167561787,-74.02852820211899 4.7150714370973,-74.026398371001 4.6877232674918,-74.02558060109601 4.6874859863574,-74.02454587610401 4.686797564651,-74.024665108676 4.6863189291555,-74.025470986757 4.6857975214267,-74.02585246812498 4.6846813784365,-74.02580479605103 4.6834369175226,-74.01962984798399 4.684922743491,-74.028472839649 4.6765444849623,-74.032273278366 4.6775012677607,-74.03825980124901 4.6799297676049,-74.048215993474 4.6850422042295,-74.05718496514402 4.6867981911917,-74.05100448502202 4.7239278424321))', 4326);
SELECT MBRContains(@g1, ST_PointFromText('POINT(-74.051585 4.680108)', 4326)) g1, 
st_distance(ST_PointFromText('POINT(-74.051585 4.680108)', 4326), @g1) distance

我感到越来越...

g1      distance
1   |   0.005489581062607619

但是我有所期待

g1      distance
0   |   0.005489581062607619

我尝试了以下几种情况:

  • 保存几何信息并分配4326 SRID。
  • 使用其他函数,获得相同的响应。

我正在使用5.7.14 MySQL版本。

我做错了什么?

我只是通过验证没有距离来解决了这个问题。但是,为什么我从那些函数中得到了这个结果呢?

1个回答

7

目前我没有MySQL可以进行实验。因此,我首先尝试在SQL Server Spatial中复制您的查询。

DECLARE @g1 geometry
DECLARE @h1 geometry
SET @g1= geometry::STGeomFromText('POLYGON((-74.05100448502202 4.7239278424321,-74.05092938316898 4.7241416902206,-74.04830618275201 4.7237460717602,-74.04643668306903 4.7234306460692,-74.04635688735101 4.7234105978214,-74.04636526925401 4.7233310730989,-74.046191260944 4.72327293317,-74.04579027069599 4.7232007594583,-74.04141290558402 4.7214258184083,-74.03746201170497 4.7197791822891,-74.03565688503801 4.7189879401666,-74.033484295736 4.7180897723398,-74.03098447693401 4.7170526009038,-74.028731840457 4.7161167561787,-74.02852820211899 4.7150714370973,-74.026398371001 4.6877232674918,-74.02558060109601 4.6874859863574,-74.02454587610401 4.686797564651,-74.024665108676 4.6863189291555,-74.025470986757 4.6857975214267,-74.02585246812498 4.6846813784365,-74.02580479605103 4.6834369175226,-74.01962984798399 4.684922743491,-74.028472839649 4.6765444849623,-74.032273278366 4.6775012677607,-74.03825980124901 4.6799297676049,-74.048215993474 4.6850422042295,-74.05718496514402 4.6867981911917,-74.05100448502202 4.7239278424321))', 4326);
SET @h1 = geometry::STGeomFromText('POINT(-74.051585 4.680108)', 4326)
SELECT @g1.STContains(@h1) contain, @g1.STDistance(@h1) distance

结果正如您所预期的那样:

contain      distance
0   |   0.005489581062607675

这是原因:
根据您的描述,我使用的是 STContains 而不是 MBRContains 。MBRContains函数首先在多边形上创建一个最小边界矩形,然后使用该新的多边形特征进行包含判断。在您的示例中,点确实落入多边形的MBR中,因此您的MySQL结果不是您期望的结果。而STContains是您要找的正确函数。
官方参考:Mysql空间链接

很好,但为什么会有这种差异?我在哪里可以找到相关的文档资料? - Oscar Gallardo
1
针对哪一部分?如果您不确定 MBR 的定义,可以在这里查看 https://en.wikipedia.org/wiki/Minimum_bounding_box - Teng Ma
谢谢,我是指关于何时更合适使用每个函数的文档。 - Oscar Gallardo
查看MySQL官方的白皮书关于空间操作总是一个不错的选择。https://dev.mysql.com/doc/refman/5.6/en/spatial-analysis-functions.html - Teng Ma
1
关于为什么两者都要...我认为MBR比ST更容易和更快速地使用。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接