2016-09-19 2 views
2

ich folgende POLYGON haben (in dem Bild, das Sie auf den Bereich sehen sie bedeckt)Mysql Funktion MBRContains ist nicht genau

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

Wenn ich MBRIntersect ausführen, MBRContains und Within Funktionen, die sie zurückgeben, Der grüne Marker ist innerhalb des Polygons, aber nicht (wie Sie auf dem Bild sehen können). Ich bin den nächsten Satz ausführt, dass zu bekommen:

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 

und ich bin immer

g1  distance 
1 | 0.005489581062607619 

Aber ich war

g1  distance 
0 | 0.005489581062607619 

Ich habe erwartet, versuchen Sie die folgenden Fälle:

  • Speichern Sie die Geometrie und weisen Sie 4326 SRID zu.
  • Andere Funktionen verwenden, die gleiche Antwort erhalten.

Ich verwende 5.7.14 MySQL Version

Was mache ich falsch?

Ich arbeitete um dieses Problem herum, nur um zu bestätigen, dass es keine Entfernung gibt. Aber warum bekomme ich dieses Ergebnis von diesen Funktionen?

Antwort

2

Ich habe keine MySQL mit denen ich gerade spiele. Also versuche ich zuerst Ihre Abfrage in einem SQL Server Spatial zu duplizieren.

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 

Und das Ergebnis ist, was Sie erwarten können:

contain  distance 
0 | 0.005489581062607675 

Hier ist der Grund dahinter:

I STContains nicht MBRContains auf der Grundlage Ihrer Beschreibung bin mit was du suchst nach. Die MBRContains-Funktion erstellt zuerst ein minimales Begrenzungsrechteck über Ihrem Polygon und verwendet dieses neue Polygon-Feature, um das Judegement zu enthalten. In Ihrem Beispiel fällt der Punkt in den MBR Ihres Polygons, weshalb Ihr MySQL-Ergebnis nicht Ihren Erwartungen entspricht. Und STContains ist die richtige Funktion, nach der Sie suchen.

Offizielle Referenz: Mysql spatial Link

+0

Ausgezeichnet, aber warum ist dieser Unterschied? Wo finde ich Unterlagen dazu? –

+0

Für welchen Teil? Wenn Sie nicht sicher über die Definition von MBR sind, können Sie sich hier https://en.wikipedia.org/wiki/Minimum_bounding_box ansehen –

+0

Danke, ich meinte Dokumentation darüber, wann es besser ist, jede Funktion zu benutzen. –