15

私は次の(簡略化された)モデルを持っています:

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

与えられた点と半径に基づいて、円を表すポリゴンを作成して保存したいと思います。

これを実現する方法を理解する唯一の方法は、生のSQLを使用してpostgisST_Buffer関数を呼び出すことです。私は本当に別の方法があることを望んでいます。

GEOSバッファメソッドにアクセスすることは可能ですか?

4

2 に答える 2

28

はい、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の方が効率的であると記載されています。

于 2011-02-15T04:37:03.667 に答える
1

私はこれを機能させるためにとんでもない時間を費やしました。これが一番のグーグル検索結果なので、これが私のために働いたものです:

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
于 2020-12-17T22:29:02.623 に答える