GeoDjango: How to create a circle based on point and radius

后端 未结 2 1458
清酒与你
清酒与你 2020-12-28 09:07

I have the following (simplified) Model:

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

相关标签:
2条回答
  • 2020-12-28 09:32

    Yes, it is possible to use the 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>
    

    The radius here is in the same units as the coordinates of the points. This will work for some coordinate systems like UTM, but not as well for others.

    Also, while this is appropriate for constructing a circular geometry, the PostGIS documentation notes that for doing radius searches ST_DWithin is more efficient.

    0 讨论(0)
  • 2020-12-28 09:34

    I spent a ridiculous amount of time trying to get this working. Since this is the number one google search result, here's what worked for me:

    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
    

    Bonus: If you're doing this so you can get a circle on a google static map, grab 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
    
    0 讨论(0)
提交回复
热议问题