5 votos

¿Cómo calcular el área geodésica en GeoDjango?

Tengo unos polígonos que pueden estar en cualquier parte del mundo. Me gustaría calcular sus áreas.

La documentación de GeoDjango para GEOSGeometry.area no especifican si es área geométrica o geodésica, pero dado que GEOSGeometry.distance() dice que "GEOS no realiza un cálculo esférico aunque el SRID especifique un sistema de coordenadas geográficas", sospecho que se trata de una simple área geométrica.

Estoy dispuesto a escribir un poco de código, pero cuanto más corto mejor, por supuesto.

Ya tenemos una función de distancia geodésica que funciona.

3voto

texai Puntos 178

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...

3voto

GSree Puntos 161

El problema de calcular el área de un polígono en un elipsoide de revolución donde las aristas del polígono son geodésicas se resuelve en la sección 6 de

C. F. F. Karney, Algoritmos para geodésicas, J. Geodesy (2012); DOI: http://dx.doi.org/10.1007/s00190-012-0578-z ; Addenda: http://geographiclib.sf.net/geod-addenda.html

El código (C++, Python, Javascript y Matlab) que implementa esta solución está disponible como parte de GeographicLib, véase

http://geographiclib.sf.net

2voto

John Fouhy Puntos 759

Otra opción es simplemente transformar a una proyección de igual área y calcular el área geométrica.

1voto

John Fouhy Puntos 759

Una visión algo más elevada de la respuesta de Aragón es la siguiente. En este documento:

Robert Chamberlain & William Duquette, "Some algorithms for polygons on a sphere". Proc. Association of American Geographers, 2007. ( PDF )

existe una fórmula para calcular el área de un polígono en una esfera. Aquí hay dos versiones diferentes copiadas del documento; una u otra podría ser más fácil de implementar en un caso particular.

eqn1

eqn2

$\lambda$ es la latitud y $\phi$ es la longitud. $R$ es el radio de la Tierra, y $A$ es el área que estás tratando de encontrar.

Supongo que un matemático con suficiente talento podría ampliarlo a un elipsoide geográfico estándar, pero para mí es suficiente con que sea esférico.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X