bco*_*713 5 python django google-maps-api-3 geopy geocode
在Django中,我一直在尝试获取一个搜索字段来对一个位置进行地理编码,并按距离排序从我的数据库中列出一个列表.到目前为止,一切都有效,除非我搜索Google返回多个结果表单的位置,例如"ann arbor,MI".我得到ValueError"没找到一个地标!(找到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})
Run Code Online (Sandbox Code Playgroud)
我在网上找到的常见解决方案是改变
location, (lat, lon) = g.geocode(query)
至
location, (lat, lon) = g.geocode(query, exactly_one=False)
但是,这会产生新的ValueError"字符串或unicode输入无法识别为WKT EWKT和HEXEWKB".
这是我在教程之外做的第一个django项目,所以谢天谢地.
在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))]
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用代码片段,您将意识到当与exact_one = False一起使用时,该方法返回一个元组列表,而不是单个元组 - 因此您的代码需要相应地重构.
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')
)
Run Code Online (Sandbox Code Playgroud)
以上是未经测试的,但是在循环之后你应该得到一个结果列表.然后你应该决定做什么:
geocodes[0],results[0])zip(geocodes, results)在模板中迭代)