2012-09-20 6 views
5

En Django, he intentado obtener un campo de búsqueda para geocodificar una ubicación y escupir una lista de mi base de datos ordenada por distancia. Hasta ahora todo funciona, excepto cuando busco una ubicación en la que Google devuelve resultados múltiples como "ann arbor, MI". Me da la ValueError "¿No ha encontrado exactamente una marca de posición! (Encontrado 2.)" Aquí está mi views.pyGeopy ValueError "No encontré exactamente una coincidencia" al geocodificar

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

La solución común que encontré en línea fue cambiar

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


a


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

Sin embargo, esto produjo la nueva entrada ValueError "String o unicode no reconocida como WKT EWKT y HEXEWKB".

Este es mi primer proyecto django que estoy haciendo fuera de los tutoriales, así que gracias por ser gentil.

Respuesta

5

En Python, el intérprete es tu mejor amigo.

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

Si intenta el fragmento de código, se dará cuenta de que cuando se utiliza con exactly_one = False, el método devuelve una lista de tuplas, ni una sola tupla - lo que el código tiene que ser reprogramado en consecuencia.

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

Lo anterior no se ha probado, pero después del ciclo debe terminar con una lista de resultados. Entonces usted debe decidir qué hacer:

  • espectáculo sólo la primera (geocodes[0], results[0])
  • preguntar al usuario a elegir de la lista
  • Mostrar todos los resultados (iterar sobre zip(geocodes, results) en la plantilla)
Cuestiones relacionadas