The django.contrib.gis.measure
module contains objects that allow
for convenient representation of distance and area units of measure. 1
Specifically, it implements two objects, Distance
and
Area
– both of which may be accessed via the
D
and A
convenience aliases, respectively.
Distance
objects may be instantiated using a keyword argument indicating the
context of the units. In the example below, two different distance objects are
instantiated in units of kilometers (km
) and miles (mi
):
>>> from django.contrib.gis.measure import D, Distance
>>> d1 = Distance(km=5)
>>> print(d1)
5.0 km
>>> d2 = D(mi=5) # `D` is an alias for `Distance`
>>> print(d2)
5.0 mi
Conversions are easy, just access the preferred unit attribute to get a converted distance quantity:
>>> print(d1.mi) # Converting 5 kilometers to miles
3.10685596119
>>> print(d2.km) # Converting 5 miles to kilometers
8.04672
Moreover, arithmetic operations may be performed between the distance objects:
>>> print(d1 + d2) # Adding 5 miles to 5 kilometers
13.04672 km
>>> print(d2 - d1) # Subtracting 5 kilometers from 5 miles
1.89314403881 mi
Two Distance
objects multiplied together will yield an Area
object, which uses squared units of measure:
>>> a = d1 * d2 # Returns an Area object.
>>> print(a)
40.2336 sq_km
To determine what the attribute abbreviation of a unit is, the unit_attname
class method may be used:
>>> print(Distance.unit_attname('US Survey Foot'))
survey_ft
>>> print(Distance.unit_attname('centimeter'))
cm
Unit Attribute |
Full name or alias(es) |
---|---|
|
Kilometre, Kilometer |
|
Mile |
|
Meter, Metre |
|
Yard |
|
Foot, Foot (International) |
|
U.S. Foot, US survey foot |
|
Inches |
|
Centimeter |
|
Millimetre, Millimeter |
|
Micrometer, Micrometre |
|
British foot (Sears 1922) |
|
British yard (Sears 1922) |
|
British chain (Sears 1922) |
|
Indian yard, Yard (Indian) |
|
Yard (Sears) |
|
Clarke’s Foot |
|
Chain |
|
Chain (Benoit) |
|
Chain (Sears) |
|
British chain (Benoit 1895 B) |
|
British chain (Sears 1922 truncated) |
|
Gold Coast foot |
|
Link |
|
Link (Benoit) |
|
Link (Sears) |
|
Clarke’s link |
|
Fathom |
|
Rod |
|
Nautical Mile |
|
Nautical Mile (UK) |
|
German legal metre |
Distance
¶To initialize a distance object, pass in a keyword corresponding to the desired unit attribute name set with desired value. For example, the following creates a distance object representing 5 miles:
>>> dist = Distance(mi=5)
Returns the distance value in units corresponding to the given unit attribute. For example:
>>> print(dist.km)
8.04672
Returns the distance unit attribute name for the given full unit name. For example:
>>> Distance.unit_attname('Mile')
'mi'
Area
¶To initialize an area object, pass in a keyword corresponding to the desired unit attribute name set with desired value. For example, the following creates an area object representing 5 square miles:
>>> a = Area(sq_mi=5)
Returns the area value in units corresponding to the given unit attribute. For example:
>>> print(a.sq_km)
12.949940551680001
Returns the area unit attribute name for the given full unit name. For example:
>>> Area.unit_attname('Kilometer')
'sq_km'
Footnotes
Robert Coup is the initial author of the measure objects, and was inspired by Brian Beck’s work in geopy and Geoff Biggs’ PhD work on dimensioned units for robotics.
Apr 11, 2022