geodjango admin map不显示坐标点,但显然保存点正确

时间:2014-06-30 09:45:41

标签: python django gis geodjango

所以我正在构建一个程序,要求我对用户地址进行地理编码,然后将其存储在geodjango pointfield中。所以我有一切设置,这是我的代码。在我的模型文件中,我的坐标字段是一个Pointfield。但是,在管理页面上,地图会显示坐标字段,但不会显示任何点。这是否意味着存在问题,距离查询等问题无法正常工作?它显示的是一张没有点缩放到无中间位置的地图。

我将地址转换为坐标的方法是使用名为geopy的东西。保存我的餐厅表单时,您可以在我的视图中看到,我使用geo函数隐藏地址字段:

a, c = geo.geocode(profile_address)

例如:

a, c = geo.geocode('408 Lonsdale street')
print c
(-31.812547, 149.960394)
pnt = Point(c)
print pnt
POINT (-31.8125470000000021 149.9603940000000080)

我尝试了其他方法将地址转换为坐标并将其保存到点域但是它仍然返回错误,说我无法保存该类型的数据。所以我现在假设它保存得很好,这意味着它应该工作正常。

在我的观点中,如果我这样做

return HttpResponse(Restaurant.coordinates)

我得到了

-31.8125470000000021 149.960394

models.py

class Restaurant(models.Model):
    name = models.CharField(max_length=25, blank=False)
    user = models.ForeignKey(User)
    cuisine = models.ManyToManyField(Cuisine, blank=True)
    address = models.CharField(max_length=50, blank=False)
    coordinates = models.PointField(null=False, blank=False)
    approved = models.BooleanField(default=False)
    objects = models.GeoManager()

    def __str__(self):
        return self.name

views.py

def user_register(request):
if request.user.is_authenticated():
    return redirect('swings:profile')
if request.method == 'POST':
    user_form = UserSignUpForm(request.POST)
    restaurant_form = RestaurantForm(request.POST, request.FILES)
    if user_form.is_valid() and restaurant_form.is_valid():
        user = user_form.save(commit=False)
        user.set_password(user.password)
        user.save()
        profile = restaurant_form.save(commit=False)
        profile.user = user
        profile_address = restaurant_form.cleaned_data['address']
        a, c = geo.geocode(profile_address)
        profile_coordinates = Point(c)
        profile.coordinates = profile_coordinates
        profile.save()
        restaurant_form.save_m2m()
        #cuisines = request.POST['cuisine']
        #profile.cuisine.add(cuisine)
        return redirect('swings:login')
    else:
        return render(request, 'swings/register.html',
                      {'user_form.errors': user_form.errors, 'restaurant_form.errors': restaurant_form.errors})
else:
    user_form = UserSignUpForm()
    restaurant_form = RestaurantForm()
return render(request, 'swings/register.html', {'restaurant_form': restaurant_form, 'user_form': user_form})

forms.py

class RestaurantForm(forms.ModelForm):
class Meta:
    model = Restaurant
    exclude = ['user', 'coordinates']

admin.py和urls.py

from django.contrib.gis import admin
from swings.models import Restaurant

admin.site.register(Restaurant)

from django.contrib.gis import admin

urlpatterns = patterns('',

    url(r'^admin/', include(admin.site.urls)),

希望我能正确地回答我的问题。提前谢谢:)

1 个答案:

答案 0 :(得分:0)

地理编码方法返回列表:(纬度,经度),但Point构造函数以相反的顺序获取这些参数:Point(经度,纬度)

Restaurant.coordinates 的调用正在返回Point,就像你输入它一样,lat / long反转,这就是为什么它看起来正确,但正在绘制一个随机点在中间在地图上无处可去。

这样可以解决问题:

a, c = geo.geocode('408 Lonsdale street')
print c
(-31.812547, 149.960394)
pnt = Point(c[1], c[0])
print pnt
POINT (149.9603940000000080, -31.8125470000000021)