GeoDjango:如何根据点和半径创建圆

时间:2011-02-13 16:09:27

标签: django gis geodjango geos

我有以下(简化)模型:

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

我想基于给定的点和半径创建并保存表示圆的多边形。

我能弄清楚如何实现这一目标的唯一方法是使用原始SQL调用postgis ST_Buffer函数。我真的希望还有另一种方式。

是否可以访问GEOS缓冲区方法?

2 个答案:

答案 0 :(得分:22)

是的,可以使用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>

此处的半径与点的坐标的单位相同。这适用于某些坐标系统,如UTM,但不适用于其他坐标系。

此外,虽然这适用于构建圆形几何体,但PostGIS documentation注意到进行半径搜索ST_DWithin更有效。

答案 1 :(得分:0)

我花了很多荒谬的时间来尝试使它工作。由于这是Google搜索结果的第一名,因此这对我有用:

radius_km = radius*1.609 # convert miles to km
point = target.geolocation # a django PointField using SRID 4326
# re-project point to a flat coordinate system 
# so we can use meters instead of degrees below, 
# AND get an actual circle instead of oval    
point.transform(6347) 
poly = point.buffer(radius_km*1000) # get a circular polygon from radius
poly.transform(4326)# re-project the resulting polygon back

奖金:如果要这样做,则可以在Google静态地图上画一个圆,抓住polyline

import polyline
import ast

geo = ast.literal_eval(poly.geojson) # turn the text into a dict
points = geo['coordinates'][0]
pl = polyline.encode(points, geojson=True, precision=5) # make a polyline out of the polygon for google
map_url += '&path=color:0x00000000%7Cfillcolor:0x0000AA33%7Cweight:1%7Cenc:' + pl