2016-09-19 18 views
2

我有以下POLYGON(图中你可以看到它占地面积)的MySQL函数MBRContains是不准确的

Polygon area

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

我在做什么错?

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

回答

2

我现在没有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函数首先在您的多边形上创建一个最小边界矩形,并使用该新的多边形特征包含judegement。在你的例子中,这个点确实落入你的多边形的MBR中,这就是为什么你的MySQL结果不符合你的期望。 STContains是您正在寻找的正确功能。

官方参考:Mysql spatial Link

+0

优秀,但为什么这种差异?我在哪里可以找到关于这方面的文档? –

+0

哪一部分?如果你不确定MBR的定义,你可以看看这里https://en.wikipedia.org/wiki/Minimum_bounding_box –

+0

谢谢,我的意思是什么时候更好地使用每个函数的文档。 –