#25342: Altitude of Point object for equality check -------------------------------------+------------------------------------ Reporter: Bhargav Kowshik | Owner: nobody Type: Bug | Status: new Component: GIS | Version: dev Severity: Normal | Resolution: Keywords: geodjango, equality | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------
Comment (by Olivier Tabone): Prior 3.12.0, GEOS already has [https://github.com/libgeos/geos/pull/810 multiple equality functions]: - `GEOSEquals` (which uses topological equality, returning true for different representations of the same structure) - `GEOSEqualsExact` (which uses pointwise equality, but allows for a distance tolerance and ignores Z/M values) currently, django uses [https://libgeos.org/doxygen/geos__c_8h.html#a23922c100edd72a8d82720213607e7bf GEOSEqualsExact] in the [https://github.com/django/django/blob/95e4d6b81312fdd9f8ebf3385be1c1331168b5cf/django/contrib/gis/geos/geometry.py#L144 __eq__() method] which is not a good fit regarding equality semantics when z is used (thus this ticket). `GEOSEquals()` does not work in 3D [https://libgeos.org/doxygen/geos__c_8h.html#a45499a7d87851015d36e57d285da9d8e as documented] which is not a good fit regarding equality semantics either. GEOS 3.12 introduces `GEOSEqualsIdentical` which is a good fit for python's equality semantic in 2D and 3D. I would suggest: - implementing the `GEOSGeometryBase.equals_identical()` method, available if GEOS >= 3.12.0. That should be an easy call, pure additive. (new ticket ?) - raising a warning if `GEOSGeometryBase.__eq__()` is called with one operand having a third dimension (`geom.hasZ == True`). To fix this warning, one should either use an explicit comparaison method (`GEOSGeometryBase.equals()`, `GEOSGeometryBase.equals_exact()`, `GEOSGeometryBase.equals_identical()`) or use a 2D point. - when GEOS 3.12 becomes the minimum supported version, use GEOSEqualsIdentical to perform `GEOSGeometryBase.__eq__()`. This will give some time for one to adapt their code bases. What do you think ? -- Ticket URL: <https://code.djangoproject.com/ticket/25342#comment:6> 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 django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/0107018988e522c0-dc30aad8-e3b1-46d4-9eb8-0299699c44ec-000000%40eu-central-1.amazonses.com.