2012-09-20 16 views
5

在Django中,我一直试图获取一个搜索字段来对地理位置进行地理编码,并从我的db中按距离排序列出一个列表。到目前为止,除了当我搜索Google返回多个结果表单(如“ann arbor,MI”)之外的所有内容。我得到的ValueError异常“没有准确地找到一个地标!(找到2)”这是我的views.pyGeopy ValueError在地理编码中“找不到一个匹配项”

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“字符串或unicode输入无法识别为WKT EWKT和HEXEWKB。”

这是我在教程之外做的第一个django项目,所以谢谢你是异教徒。

回答

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))] 

如果试图您的代码段,你会发现,与exactly_one使用时=假,该方法返回的元组,而不是一个元组的列表 - 所以你的代码需要相应地重构。

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)
相关问题