Opened 8 years ago
Closed 7 years ago
#28738 closed New feature (fixed)
Add support for PostGIS <-> operator
| Reported by: | Matthew Somerville | Owned by: | Francisco Couzo |
|---|---|---|---|
| Component: | GIS | Version: | 1.11 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
https://postgis.net/docs/geometry_distance_knn.html – this function is so much quicker when looking up the nearest neighbour of an index, and it'd be great to be built into Django. For example, on a dataset of c. 1.8 million rows:
postcode = Postcode.objects
.filter(location__distance_gte=(location, D(mi=0)))
.distance(location)
.order_by('distance')[0]
took 5 seconds, whereas:
postcode = Postcode.objects
.annotate(centroid_distance=GeometryCentroidDistance('location', location))
.filter(centroid_distance__gte=0)
.distance(location)
.order_by('centroid_distance')[0]
is pretty instantaneous.
(Where GeometryCentroidDistance is a Func subclass that sets function='', arg_joiner = '<-> ', output_field FloatField.)
(There is also <#> https://postgis.net/docs/geometry_distance_box.html)
Change History (7)
comment:1 by , 8 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 8 years ago
| Summary: | Addition of PostGIS <-> operator → Add support for PostGIS <-> operator |
|---|
comment:3 by , 8 years ago
The operator itself is the same, but the trigram code takes a string (which will be passed to Value() if not already a Value, so passed in strings aren't F() by default), whereas this operator would want to be a GeoFunc (a bit like Distance, I guess? Its return is the same as ST_Distance) taking geometries/expressions, transforming them to the same SRID and so on.
comment:4 by , 8 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:5 by , 7 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
Based on your description, I can't tell whether this is different from the TrigramDistance function?