2012-09-20 10 views
5

In Django, ho cercato di ottenere un campo di ricerca per geocodificare una posizione e sputare un elenco dal mio db in ordine di distanza. Finora tutto funziona, tranne quando cerco una posizione in cui Google restituisce più risultati come "ann arbor, MI". Ho l'ValueError "Non hai trovato esattamente un segnaposto! (Trovato 2)" Ecco il mio views.pyGeopy ValueError "Non ho trovato esattamente una corrispondenza" durante il geocoding

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 soluzione comune che ho trovato on-line è stato quello di cambiare

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


a


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

Tuttavia, questo ha prodotto il nuovo valore "String o input Unicode non riconosciuto come WKT EWKT e HEXEWKB".

Questo è il mio primo progetto di django che sto facendo al di fuori dei tutorial, quindi grazie per essere gentile.

risposta

5

In Python, l'interprete è il tuo migliore amico.

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

Se si tenta lo snippet di codice, vi renderete conto che quando viene utilizzato con exactly_one = False, il metodo restituisce una lista di tuple, non un solo tuple - così il vostro codice di bisogno di essere riscritta di conseguenza.

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

Quanto sopra non è stato verificato, ma il dopo il ciclo si dovrebbe finire con un elenco di risultati. Poi si dovrebbe decidere cosa fare:

  • spettacolo solo il primo (geocodes[0], results[0])
  • chiedere all'utente di scegliere dalla lista
  • TUTTI I RISULTATI (iterare zip(geocodes, results) nel modello)
Problemi correlati