There is PointField
in Django which is easy to store longitude and latitude in Django but what if I wanted to store Multiple lat, lng in the same record. Well, the answer is PolygonField
. There is also another fields like multipoint and Geometry collection fields but for the bounding box PolygonField is the best.
Create the models like this in your Django project.
from django.contrib.gis.models import PointField
class Zone(models.Model):
geo = PolygonField(verbose_name="bounding box)
Now that we created the table and column it’s time to look into how we can use this to store the bounding box. Let’s say I wanted to store US state Alabama into the bounding box. First we need to get those coordinates, the best way we can do that using the geopy python package. It will come in handy and easily extendable to other providers. For sake of this blog I’m going to use Nominatim
from django.contrib.gis.geos import Point, GeometryCollection
geolocator = Nominatim(user_agent="demo")
location = geolocator.geocode({"state": "Alabama"})
You can take a look at the http://geopy.readthedocs.io to read all of the providers and the method they offer. Here the location
will provide the raw data and we can grab the boundingbox
value from it.
boundingbox = location.raw.get("boundingbox")
lon1 = boundingbox[1]
lat1 = boundingbox[2]
lon2 = boundingbox[0]
lat2 = boundingbox[3]
southwest = Point(float(lon1), float(lat1))
norteast = Point(float(lon2), float(lat2))
rect = GeometryCollection(southwest, norteast).envelope
And then you can directly assign rect into the geo PolygonField.
Zone.object.create(geo=rect)