2011-02-13 19 views
12

tengo el siguiente (simplificado) Modelo:GeoDjango: Cómo crear un círculo basado en punto y el radio

class Zone(gismodels.Model): 
    name = gismodels.CharField() 
    poly = gismodels.PolygonField() 

quiero crear y guardar un polígono que representa un círculo, sobre la base de un punto dado y radio.

La única manera en que puedo averiguar cómo lograr esto, es llamar a la función ST_Buffer de Postgis usando SQL sin formato. Realmente espero que haya otra manera.

¿Es posible acceder a los métodos de búfer GEOS?

Respuesta

19

Sí, es posible utilizar el geos buffer method:

>>> from django.contrib.gis import geos 
>>> center = geos.Point(5, 5) 
>>> radius = 2 
>>> circle = center.buffer(radius) 
>>> circle 
<Polygon object at 0x1029d8370> 

El radio aquí está en las mismas unidades que las coordenadas de los puntos. Esto funcionará para algunos sistemas de coordenadas como UTM, pero no tan bien para otros.

Además, si bien esto es apropiado para construir una geometría circular, el PostGIS documentation señala que para hacer búsquedas de radio ST_DWithin es más eficiente.

+2

Gracias por su respuesta. Tengo un radio en kilómetros y mi punto se crea usando un par de longitud/latitud en unidades de grados. ¿Necesito convertir mi radio en grados para obtener un resultado útil, o hay una función incorporada para manejar esto? – MattRowbum

+1

@MattRowbum - Necesitarás convertir a grados del km. Además, esto te dejará con óvalos que se estiran más a medida que te alejas del ecuador. PostGIS ahora permite un tipo de "geografía" que es más de lo que desea, pero no pude encontrar una manera de acceder a él a través de la API de GEOS en GeoDjango. – tcarobruce

+2

Cómo convertir kilómetros a grados: http://stackoverflow.com/questions/5217348/how-do-i-convert-kilometres-to-degrees-in-geodjango-geos –

Cuestiones relacionadas