首先我需要说这是我的第一个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