Opened 5 years ago
Closed 5 years ago
#30649 closed New feature (wontfix)
Implement MakeValid() for non-column values.
Reported by: | milosu | Owned by: | nobody |
---|---|---|---|
Component: | GIS | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
PostGIS provides function ST_MakeValid, that can be used in Django as a PostGISOperator.
There is however no way how to use ST_MakeValid to simply repair GEOS Geometry.
Note that there is also no comparable function in the GEOS library itself (not counting something simple like buffer(0)).
This missing feature is also subject to Stackoverflow questions, like:
https://stackoverflow.com/questions/45631855/equivalent-of-postgis-st-makevalid-in-django-geos/45633779
Attached patch implements new PostGISOperations method called "make_valid", that can be run from implementation code simply by:
from django.db import connection repaired_geos_geometry = connection.ops.make_valid(some_goes_geometry)
Attachments (1)
Change History (7)
by , 5 years ago
Attachment: | make_valid_patch.diff added |
---|
comment:1 by , 5 years ago
Description: | modified (diff) |
---|
comment:2 by , 5 years ago
Description: | modified (diff) |
---|
comment:3 by , 5 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Summary: | Implement geometry validation in GIS database backend → Implement geometry validation in GIS database backend. |
comment:4 by , 5 years ago
Resolution: | invalid |
---|---|
Status: | closed → new |
St_MakeValid is implemented, but there is no way to call it on GEOS geometry.
See e.g.
https://stackoverflow.com/questions/45631855/equivalent-of-postgis-st-makevalid-in-django-geos/45633779
comment:5 by , 5 years ago
The MakeValid
function also supports Geometry
objects so you could theoretically do
valid_geometry = AModel.objects.annotate( valid_geometry=MakeValid(invalid_geometry), ).values_list('valid_geometry', flat=True).first()
But that assumes AModel
has at least one row.
The ORM doesn't support SELECT
from no tables by it's table <-> model class mapping nature.
If we wanted to add a way to do that it we should do it for all non-column referencing expressions and not only for MakeValid
.
e.g.
Expression.from_db()
->SELECT expression
-> what's returned from the database.MakeValid(invalid_geometry).from_db('other')
->SELECT ST_MakeValid(<Geometry>)
(fromconnections['other']
)-><Valid Geometry>
Unaccent(Lower('ÉtÉ')).from_db()
->SELECT unaccent(lower('ÉtÉ'))
->'ete'
This would have to be discussed on the developer mailing list and I wouldn't be surprised if there was existing tickets tracking this feature request.
comment:6 by , 5 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Summary: | Implement geometry validation in GIS database backend. → Implement MakeValid() for non-column values. |
If you want to propose to add a new API for all non-column expressions (as described by Simon) then please fill a new ticket (I couldn't find an existing ticket) that would have to be discussed on the developer mailing list.
IMO, adding a special behavior only for MakeValid()
is not something that we would like to add into Django.
MakeValid is already implemented.