2016-06-16 10 views
0

私のアプリケーションでは、ユーザが指定したポイントに最も近いポイントをデータベース内で見つける必要があります。これは私のモデルである:ユーザが指定した場所に最も近いポイントを見つける

class WaysVerticesPgr(models.Model): 
    id = models.BigIntegerField(primary_key=True) 
    osm_id = models.BigIntegerField(unique=True, blank=True, null=True) 
    cnt = models.IntegerField(blank=True, null=True) 
    chk = models.IntegerField(blank=True, null=True) 
    ein = models.IntegerField(blank=True, null=True) 
    eout = models.IntegerField(blank=True, null=True) 
    lon = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) 
    lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True) 
    the_geom = models.PointField(blank=True, null=True) 

そして、私は彼らのそれぞれと、入力点間の距離に注釈を付ける、小さな半径内のすべての点(この場合はo.oo5度)を見つけるために、このコードをしようとしています、それらを並べ替えます

from django.contrib.gis.db.models.functions import * 
from .models import * 
from django.contrib.gis.geos import * 
from django.contrib.gis.measure import * 

def get_closest_point(input): 
    input_point_geometry=GEOSGeometry('POINT('+input+')') 
    closest = WaysVerticesPgr.objects.filter(the_geom__dwithin=(input_point_geometry,0.005)).annotate(distance_between=input_point_geometry.distance('the_geom')).order_by(distance_between)[:1] 
    return closest 

しかし、 'distance()は他のGEOSジオメトリでのみ動作します'というエラーが表示されます。私はGEOSGeometry形式にthe_geom変換しようとすると:

closest = WaysVerticesPgr.objects.filter(the_geom__dwithin=(input_point_geometry,0.005)).annotate(distance_between=input_point_geometry.distance(GEOSGeometry('the_geom'))).order_by(distance_between)[:1] 

私はエラーを取得する:

'String or unicode input unrecognized as WKT EWKT, and HEXEWKB'. Which is kind of strange because the_geom field has the format 0101000020E6100000E7525C55F65DA1BF8FF5793139C34940 that seems to be HEX.

私はループと長い道のりでそれを行うために管理が、これは見栄えしないと性能があります良くない。しかし、興味深いことに、GEOSGeometryへの変換は、この場合に動作します:

def get_closest_point(input): 
    input_point_geometry=GEOSGeometry('POINT('+input+')') 
    closest = WaysVerticesPgr.objects.filter(the_geom__dwithin=(input_point_geometry,0.005)) 

    dict_closest = {} 
    list_closest = [] 
    for i in closest: 
     i = GEOSGeometry(i.the_geom) 
     distance_between=input_point_geometry.distance(i) 
     i = str(i.wkt) 
     dict_closest = {'Point':i,'Distance':distance_between} 
     list_closest.append(dict_closest) 
     sortlist=sorted(list_closest, key=itemgetter('Distance'), reverse=False) 
    return sortlist[0] 

誰がどのようにそれが短いように動作させるためのアイデアを持っていますか?私はDjango 1.9、Python 3.5、Postgres 9.5とで作業しています。私は他のスレッドの人々がdistance = Distance(point1、point2)のような別の距離関数を使用することを提案しましたが、3つの引数が与えられている間に1つまたは2つしか受け入れられないというエラーが表示されます(入力はGEOSGeometry形式)。

ご協力いただきますようお願い申し上げます。

答えて

1

@ e4c5はい、確認しました。 GeoQuerySet.distance関数はDjango 1.9以降で廃止されました。代わりに、これは私の仕事:

def get_closest_point(input): 
    input_point=GEOSGeometry('POINT('+input+')') 
    closest = WaysVerticesPgr.objects.filter(the_geom__dwithin=(input_point_geometry,0.005)).annotate(distance=Distance('the_geom', input_point)).order_by('distance').values('lon','lat')[0] 

(あなたの答えに投票したが、それが原因で私の低い評判では表示されません)とにかくありがとうございます。

関連する問題