2012-09-20 27 views
5

Trong Django, tôi đã cố gắng tìm trường địa lý để định vị địa điểm và nhổ ra một danh sách từ db của tôi được sắp xếp theo khoảng cách. Cho đến nay mọi thứ đều hoạt động trừ khi tôi tìm kiếm một vị trí mà Google trả về nhiều biểu mẫu kết quả như "ann arbor, MI". Tôi nhận được ValueError "Không tìm thấy chính xác một vị trí! (Tìm thấy 2)" Đây là views.py tôiGiá trị địa lýError "Không tìm thấy chính xác một kết quả" khi mã hóa địa lý

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

Các giải pháp chung tôi tìm thấy trực tuyến đã thay đổi

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


để


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

Tuy nhiên, điều này đã tạo ra ValueError mới "Chuỗi hoặc đầu vào unicode không được công nhận là WKT EWKT và HEXEWKB".

Đây là dự án django đầu tiên của tôi, tôi đang làm bên ngoài hướng dẫn, vì vậy xin cảm ơn vì đã dịu dàng.

Trả lời

5

Trong Python, thông dịch viên là người bạn tốt nhất của bạn.

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

Nếu bạn cố gắng đoạn mã của bạn, bạn sẽ nhận ra rằng khi được sử dụng với exactly_one = False, phương thức trả về một danh sách các hàng, không phải là một tuple duy nhất - do đó, mã của bạn cần phải được refactored cho phù hợp.

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

Ở trên chưa được kiểm tra, nhưng sau vòng lặp, bạn sẽ kết thúc với danh sách kết quả. Sau đó, bạn nên quyết định làm gì:

  • chương trình chỉ là người đầu tiên (geocodes[0], results[0])
  • yêu cầu người dùng chọn từ danh sách
  • hiển thị tất cả kết quả (lặp trên zip(geocodes, results) trong mẫu)
Các vấn đề liên quan