我有以下(简化)模型:
class Zone(gismodels.Model):
name = gismodels.CharField()
poly = gismodels.PolygonField()
我想根据给定的点和半径创建并保存一个表示圆的多边形。
我能弄清楚如何实现这一点的唯一方法是使用原始 SQL 调用 postgis ST_Buffer 函数。我真的希望有另一种方法。
是否可以访问 GEOS 缓冲区方法?
是的,可以使用geos 缓冲区方法:
>>> from django.contrib.gis import geos
>>> center = geos.Point(5, 5)
>>> radius = 2
>>> circle = center.buffer(radius)
>>> circle
<Polygon object at 0x1029d8370>
这里的半径与点的坐标单位相同。这适用于一些坐标系,如 UTM,但不适用于其他坐标系。
此外,虽然这适用于构造圆形几何,但PostGIS 文档指出,对于进行半径搜索 ST_DWithin 更有效。
我花了可笑的时间试图让这个工作。由于这是排名第一的谷歌搜索结果,这对我有用:
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
奖励:如果你这样做,你可以在谷歌静态地图上得到一个圆圈,抓住折线:
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