Geodjango距离BTW分两个模型



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

我有两个Django模型:

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

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)

主要任务是将监理模型中的Facility name与Facility模型中的Facility name作为另一个静态方法进行匹配和更新。

这应该是在code1, code2和距离设施点和监督点较小的点上查找。

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

谢谢,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()的结果取最小的距离,这是浮动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

最新更新