Si utiliza Tipo de geografía PostGIS para su mesa, puede calcular su área como lo hace en la superficie plana.
El tipo geográfico ofrece soporte nativo para las características espaciales representadas en coordenadas "geográficas" (a veces llamadas coordenadas "geodésicas" geodésicas, o "lat/lon", o "lon/lat"). Las coordenadas geográficas son coordenadas esféricas expresadas en unidades angulares (grados).
crear una tabla de geografía (no de geometría):
CREATE TABLE mypoly (
id SERIAL PRIMARY KEY,
name VARCHAR(64),
the_geom GEOGRAPHY(POINT,4326)
);
a partir de ahora es que el uso de psycopg2 para llegar a la tabla postgis y consultar algún sql con Área_ST .
ST_Area - Devuelve el área de la superficie si es un polígono o multipolígono. Para el tipo "geometría" el área está en unidades SRID. Para "geografía" el área está en metros cuadrados.
en su view.py, escriba este código:
import psycopg2
def getGeodesicArea:
res = []
con = psycopg2.connect("dbname='mydb' user='reid' host='127.0.0.1' password='reid'")
cur = con.cursor()
cur.execute("SELECT ST_Area(the_geom) FROM mypoly")
rows = cur.fetchall()
for row in rows:
respre = row[2] # find your result.
res.append(respre)
con.commit()
cur.close()
con.close()
si estás buscando una forma pitónica de obtener tu resultado como json, mira este SO responder .
ACTUALIZACIÓN
Hay un código javascript en la api de openlayers para calcular áreas geodésicas. creo que se puede convertir a python para la aplicación django.
getGeodesicArea: function(projection) {
var ring = this; // so we can work with a clone if needed
if(projection) {
var gg = new OpenLayers.Projection("EPSG:4326");
if(!gg.equals(projection)) {
ring = this.clone().transform(projection, gg);
}
}
var area = 0.0;
var len = ring.components && ring.components.length;
if(len > 2) {
var p1, p2;
for(var i=0; i<len-1; i++) {
p1 = ring.components[i];
p2 = ring.components[i+1];
area += OpenLayers.Util.rad(p2.x - p1.x) *
(2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
Math.sin(OpenLayers.Util.rad(p2.y)));
}
area = area * 6378137.0 * 6378137.0 / 2.0;
}
return area;
}
Espero que te ayude...