Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从django PolygoField获取随机点_Python_Django_Postgis_Geodjango - Fatal编程技术网

Python 从django PolygoField获取随机点

Python 从django PolygoField获取随机点,python,django,postgis,geodjango,Python,Django,Postgis,Geodjango,TL,DR;我想使用从多边形(可能)中获取一个随机点 背景 我正在制作一个GeoDjango web服务,并收集了英国邮政编码,其各自的边界如下: from django.db import models as dj_models from django.contrib.gis.db import models as gis_models class Postcode(gis_models.Model): pretty_postcode = dj_models.CharField

TL,DR;我想使用从多边形(可能)中获取一个随机点


背景

我正在制作一个GeoDjango web服务,并收集了英国邮政编码,其各自的边界如下:

from django.db import models as dj_models
from django.contrib.gis.db import models as gis_models

class Postcode(gis_models.Model):
      pretty_postcode = dj_models.CharField( max_length=8 )
      coords = gis_models.PolygonField( default='POLYGON EMPTY' )
我发现了一个令人愉快的小PostGIS函数,它可以在我的
坐标
区域中找到随机点

问题

我如何在我的python django应用程序中使用这个函数(或者你能推荐一个更好的方法吗?)。理想情况下,以这样的函数结束:

from django.contrib.gis import geos
# ... other imports ...

class Postcode(gis_models.Model):
     # ... fields ...

     def get_random_point(self):
         rand_point = # code that executes ST_GeneratePoints
                      # and returns a geos.Point instance
         return rand_point

我在这里回答了一个类似的问题:

由于您本质上希望调用数据库函数,因此无法完全按照您的想象进行操作。
您可以改为将
ST_GeneratePoints
包装为
GeoFunc

from django.contrib.gis.db.models.functions import GeoFunc

class GeneratePoints(GeoFunc):
    function='ST_GeneratePoints'
并将其用于:

做同样事情的另一种方法是:

from django.contrib.gis.db.models.functions import GeoFunc
from django.db.models import F, Value

Postcode.objects.annotate(
    rand_point=GeoFunc(
        F('coords'),
        Value(1),
        function='ST_GeneratePoints',
    )
)

我在这里回答了一个类似的问题:

由于您本质上希望调用数据库函数,因此无法完全按照您的想象进行操作。
您可以改为将
ST_GeneratePoints
包装为
GeoFunc

from django.contrib.gis.db.models.functions import GeoFunc

class GeneratePoints(GeoFunc):
    function='ST_GeneratePoints'
并将其用于:

做同样事情的另一种方法是:

from django.contrib.gis.db.models.functions import GeoFunc
from django.db.models import F, Value

Postcode.objects.annotate(
    rand_point=GeoFunc(
        F('coords'),
        Value(1),
        function='ST_GeneratePoints',
    )
)