Opened 8 years ago

Closed 7 years ago

#6715 closed (fixed)

Use `ST_distance_sphere` as default instead of `ST_distance_spheroid` for geodetic distance calculations.

Reported by: jbronn Owned by: jbronn
Component: GIS Version: gis
Severity: Keywords: gis distance geodetic geographic sphere spheroid
Cc: Triage Stage: Design decision needed
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: UI/UX:


As brought up by kmishler in this django-users thread about GeoDjango geodetic distances, ST_distance_sphere performs faster than ST_distance_spheroid. My informal tests suggest that using ST_distance_sphere yields results ~30-40% faster that are a maximum of 0.25% less accurate.

The attached patch changes the default to ST_distance_sphere -- spheroid calculations may be enabled by setting the distance_spheroid keyword to True in the geographic model definition (e.g., point = models.PointField(distance_spheroid=True)). I haven't committed this yet because I wanted to solicit comments on whether there's a better way to do this.

Attachments (1)

distance_sphere.diff (10.0 KB) - added by jbronn 8 years ago.
Patch for using ST_distance_sphere by default.

Download all attachments as: .zip

Change History (4)

comment:1 Changed 8 years ago by jbronn

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Status changed from new to assigned
  • Triage Stage changed from Unreviewed to Design decision needed

comment:2 Changed 8 years ago by jbronn

  • Needs tests set

Changed 8 years ago by jbronn

Patch for using ST_distance_sphere by default.

comment:3 Changed 7 years ago by jbronn

  • Resolution set to fixed
  • Status changed from assigned to closed

Fixed in r7641. ST_distance_sphere is used by default. However, the mechanism to use ST_distance_spheroid is more dynamic than the original solution in the patch attached to this ticket.

For the distance lookup types the following syntax will enable spheroid calculations:

qs = City.objects.filter(point__distance_lte=(pnt, D(km=5), 'spheroid'))

When using GeoQuerySet distance method, the spheroid keyword just needs to be set:

qs = City.objects.distance(pnt, spheroid=True)
Note: See TracTickets for help on using tickets.
Back to Top