5

Django では、検索フィールドを取得して場所をジオコーディングし、距離でソートされたデータベースからリストを吐き出そうとしています。これまでのところ、Google が「アナーバー、MI」などの複数の結果フォームを返す場所を検索する場合を除いて、すべてが機能します。ValueError「正確に1つの目印が見つかりませんでした!(見つかった2.)」ここに私のviews.pyがあります

from django.shortcuts import render_to_response
from models import CampSite
from geopy import geocoders
from django.contrib.gis.geos import *
from django.contrib.gis.measure import D
from campsites.forms import SearchForm
from django.http import HttpResponseRedirect


def results(request):
    query = request.GET['q']
    g = geocoders.Google(resource='maps')
    location, (lat, lon) = g.geocode(query) 
    pnt = fromstr("POINT(%s %s)" % (lon, lat))
    distance_from_point = {'mi':'2000'}
    results = CampSite.objects.filter(lonlat__distance_lte=(pnt,D(**distance_from_point))).distance(pnt).order_by('distance')
    return render_to_response('results.html',{'location': location, 'lat': lat, 'lon': lon, 'results':results})

私がオンラインで見つけた一般的な解決策は、変更することでした

location, (lat, lon) = g.geocode(query)



location, (lat, lon) = g.geocode(query, exactly_one=False)

ただし、これにより、新しい ValueError「WKT EWKT および HEXEWKB として認識されない文字列または Unicode 入力」が生成されました。

これは、チュートリアル以外で行っている最初の django プロジェクトです。

4

1 に答える 1

5

Python では、インタープリターが親友です。

>>> g.geocode('ann arbor, MI', exactly_one=False)
[(u'Ann Arbor, MI, USA', (42.2808256, -83.743037799999996)),
 (u'Ann Arbor, MI, USA', (42.307649300000001, -83.8473015))]

コード スニペットを試してみると、actact_one=False で使用すると、メソッドが 1 つのタプルではなくタプルのリストを返すことがわかります。そのため、それに応じてコードをリファクタリングする必要があります。

results = []
geocodes = g.geocode(query, exactly_one=False)
for geocode in geocodes:
    location, (lat, lon) = geocode
    pnt = fromstr("POINT(%s %s)" % (lon, lat))
    distance_from_point = {'mi':'2000'}
    results.append(
        CampSite.objects.filter(
             lonlat__distance_lte=(
                  pnt,
                  D(**distance_from_point)
             )
        ).distance(pnt).order_by('distance')
    )

上記はテストされていませんが、ループの後に結果のリストが表示されるはずです。次に、何をすべきかを決定する必要があります。

  • 最初の ( geocodes[0], results[0])だけを表示
  • ユーザーにリストから選択するよう求める
  • すべての結果を表示する (zip(geocodes, results)テンプレートで反復)
于 2012-09-21T00:46:15.333 に答える