geodjango 两个模型中点之间的距离

geodjango distance btw points in two models

首先我要说这是我的第一个 GeoDjango 任务——所以如果有一些“RTF”行请告诉我。

我有两个 Django 模型:

设施模型。对于 code1 和 code2 的组合,可以在不同位置存在几个 facilityNames。

from django.contrib.gis.db.models import PointField, GeoManager, Model

class Facility(models.Model):
    facilityName = models.CharField(max_length=255)
    code1 = models.CharField(max_length=255)
    codeName1 = models.CharField(max_length=255)
    code2 = models.CharField(max_length=255)
    codeName2 = models.CharField(max_length=255)
    point = point = PointField()

监管模式。每个设施可以有很多提交。
使用静态方法,我可以匹配 code1 和 code2 并应用正确的 codeName1 和 codeName2。

class Supervision(models.Model):
    name = models.CharField(max_length=255)
    facilityName = models.CharField(max_length=255)
    code1 = models.CharField(max_length=255)
    codeName1 = models.CharField(max_length=255)
    code2 = models.CharField(max_length=255)
    codeName2 = models.CharField(max_length=255)
    point = models.PointFiled()

    @staticmethod
    def update_codeName1():
        for r in Facility.objects.all():
            Supervision.objects.filter(code1=r.code1).update(codeName1=r.codeName1)

    @staticmethod
    def update_codeName2():
        for r in Facility.objects.all():
            Supervision.objects.filter(code2=r.code2).update(codeName2=r.codeName2)

主要任务是将监督模型中的设施名称与设施模型中的设施名称作为另一种静态方法进行匹配和更新。

这应该是在代码 1、代码 2 和距离较小的点 btw 设施点和监督点上查找。

非常感谢任何提示、指导等。

谢谢,

J

更新 1: 我正在尝试类似的方法,但我还不确定结果:

@staticmethod
for r in Supervision.objects.filter(code1Name='Default'):
    pnt = r.point
    Facility.objects.filter(code1=r.code1, code2=r.code2,point__distance_lte=(pnt,0.2))

更新 2:

有一些进步,但仍然需要与 distance() 的结果保持最小距离,它是 float ghzzz 或尝试切换到米可能...

from app.models import Supervision, Facility
from django.contrib.gis.geos import GEOSGeometry
def distance():
    for r in Supervision.objects.filter(lganame='Defaul'):
        pnt_01 = GEOSGeometry(r.point.wkt, srid=4326)
        print str(pnt_01)+' SS in '+r.hf_name
        rs = Facility.objects.filter(code1=r.code1, code2=r.code2)
        for x in rs:
            pnt_02 = GEOSGeometry(x.point.wkt, srid=4326)
            print str(pnt_02)+' Facility: '+x.name+' : '+str(pnt_01.distance(pnt_02)*100)

然后是回答时间:

def text1():
for r in Supervision.objects.all():
    try:
        x = Facility.objects.filter(code1=r.code1, code2=r.code2).distance(r.point).order_by('distance')[:1].get()

        r.facilityName = x.facilityName
        r.save()
        print x.primary_name
    except ObjectDoesNotExist:
        print 'Does Not Exist!'
        pass