#27971: GeoDjango LinearRing and Polygon handle contains/covers differently
-------------------------------------+-------------------------------------
               Reporter:  Geoffrey   |          Owner:  nobody
  Fairchild                          |
                   Type:  Bug        |         Status:  new
              Component:  GIS        |        Version:  1.10
               Severity:  Normal     |       Keywords:  GeoDjango,
                                     |  LinearRing, Polygon, covers,
           Triage Stage:             |  contains
  Unreviewed                         |      Has patch:  0
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 I'm running Python 3.6.0 and Django 1.10.6. I'm seeing a difference in how
 the
 
[[https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/#linearring|LinearRing]]
 and
 
[[https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/#polygon|Polygon]]
 types deal with the
 
[[https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.contains|contains]]
 and
 
[[https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.covers|covers]]
 methods. The gist is that `LinearRing` objects seem ''not'' to properly
 handle `contains`/`covers`, while `Polygon` objects do. See the following
 example:

 {{{
 > python
 Python 3.6.0 (default, Mar  6 2017, 11:41:46)
 [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
 Type "help", "copyright", "credits" or "license" for more information.
 >>> from django.contrib.gis.geos import GEOSGeometry
 >>> aruba = GEOSGeometry('SRID=4326;LINEARRING (-69.89912109375
 12.45200195312499, -69.895703125 12.42299804687499, -69.94218749999999
 12.43852539062499, -70.004150390625 12.50048828125, -70.06611328125
 12.54697265624999, -70.05087890624999 12.59707031249999, -70.035107421875
 12.61411132812499, -69.97314453125 12.567626953125, -69.91181640625
 12.48046875, -69.89912109375 12.45200195312499)')
 >>> print(aruba)
 SRID=4326;LINEARRING (-69.89912109375 12.45200195312499, -69.895703125
 12.42299804687499, -69.94218749999999 12.43852539062499, -70.004150390625
 12.50048828125, -70.06611328125 12.54697265624999, -70.05087890624999
 12.59707031249999, -70.035107421875 12.61411132812499, -69.97314453125
 12.567626953125, -69.91181640625 12.48046875, -69.89912109375
 12.45200195312499)
 >>> point = GEOSGeometry('POINT (-69.95647745161588 12.48564548990554)')
 >>> print(point)
 POINT (-69.95647745161588 12.48564548990554)
 >>> aruba.contains(point)
 False
 >>> aruba.covers(point)
 False
 >>> aruba = GEOSGeometry('SRID=4326;POLYGON ((-69.89912109375
 12.45200195312499, -69.895703125 12.42299804687499, -69.94218749999999
 12.43852539062499, -70.004150390625 12.50048828125, -70.06611328125
 12.54697265624999, -70.05087890624999 12.59707031249999, -70.035107421875
 12.61411132812499, -69.97314453125 12.567626953125, -69.91181640625
 12.48046875, -69.89912109375 12.45200195312499))')
 >>> print(aruba)
 SRID=4326;POLYGON ((-69.89912109375 12.45200195312499, -69.895703125
 12.42299804687499, -69.94218749999999 12.43852539062499, -70.004150390625
 12.50048828125, -70.06611328125 12.54697265624999, -70.05087890624999
 12.59707031249999, -70.035107421875 12.61411132812499, -69.97314453125
 12.567626953125, -69.91181640625 12.48046875, -69.89912109375
 12.45200195312499))
 >>> aruba.contains(point)
 True
 >>> aruba.covers(point)
 True
 }}}

 For what it's worth, while writing this issue, I just discovered that
 Shapely, which also relies on GEOS, displays the same behavior:

 {{{
 > python
 Python 3.6.0 (default, Mar  6 2017, 11:41:46)
 [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
 Type "help", "copyright", "credits" or "license" for more information.
 >>> from shapely.geometry.polygon import LinearRing, Polygon
 >>> from shapely.geometry import Point
 >>> aruba = LinearRing([(-69.89912109375, 12.45200195312499),
 (-69.895703125, 12.42299804687499), (-69.94218749999999,
 12.43852539062499), (-70.004150390625, 12.50048828125), (-70.06611328125,
 12.54697265624999), (-70.05087890624999, 12.59707031249999),
 (-70.035107421875, 12.61411132812499), (-69.97314453125, 12.567626953125),
 (-69.91181640625, 12.48046875), (-69.89912109375, 12.45200195312499)])
 >>> print(aruba)
 LINEARRING (-69.89912109375 12.45200195312499, -69.895703125
 12.42299804687499, -69.94218749999999 12.43852539062499, -70.004150390625
 12.50048828125, -70.06611328125 12.54697265624999, -70.05087890624999
 12.59707031249999, -70.035107421875 12.61411132812499, -69.97314453125
 12.567626953125, -69.91181640625 12.48046875, -69.89912109375
 12.45200195312499)
 >>> point = Point(-69.95647745161588, 12.48564548990554)
 >>> print(point)
 POINT (-69.95647745161588 12.48564548990554)
 >>> aruba.contains(point)
 False
 >>> aruba = Polygon([(-69.89912109375, 12.45200195312499), (-69.895703125,
 12.42299804687499), (-69.94218749999999, 12.43852539062499),
 (-70.004150390625, 12.50048828125), (-70.06611328125, 12.54697265624999),
 (-70.05087890624999, 12.59707031249999), (-70.035107421875,
 12.61411132812499), (-69.97314453125, 12.567626953125), (-69.91181640625,
 12.48046875), (-69.89912109375, 12.45200195312499)])
 >>> print(aruba)
 POLYGON ((-69.89912109375 12.45200195312499, -69.895703125
 12.42299804687499, -69.94218749999999 12.43852539062499, -70.004150390625
 12.50048828125, -70.06611328125 12.54697265624999, -70.05087890624999
 12.59707031249999, -70.035107421875 12.61411132812499, -69.97314453125
 12.567626953125, -69.91181640625 12.48046875, -69.89912109375
 12.45200195312499))
 >>> aruba.contains(point)
 True
 }}}

 Is this a bug (perhaps a GEOS bug since both Shapely and GeoDjango display
 the same behavior), or is this to be expected (i.e., am I misunderstanding
 some fundamental concept about `LinearRing`s)?

--
Ticket URL: <https://code.djangoproject.com/ticket/27971>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/053.73cc3b6161dabb304fd6b05741a9a755%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to