2013-02-04 55 views
1

快速背景下,我试图创建一个django应用程序,它可以按照距离某个点的距离对一堆位置进行排序。该应用程序将在EC2服务器上运行,并且我想使用RDS作为数据库。由于PostgreSQL在RDS上不可用,我选择使用MySQL。按照Django在Amazon RDS上的距离对点进行排序

问题:

当我尝试运行来看,我得到的错误:

NotImplementedError: distance stored procedure not available on the mysql backend.

这里是视图:

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 django.template import RequestContext 

def results(request): 
    query = request.GET['q'] 
    g = geocoders.Google(resource='maps') 
    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') 
     ) 
     return render_to_response('results.html',{'location': location, 
      'lat': lat, 'lon': lon, 'results':results[0]}, 
      context_instance=RequestContext(request)) 

从我阅读,我认为问题是MySQL不符合OGC标准,使用GDAL获取信息可能会奏效,但我不知道如何实现。

有谁知道我该如何让应用程序使用RDS优先使用MySQL? (我想避免Heroku)

p.s.我正在使用geopy向Google发出请求。

+0

也许在该服务器上设置postgis的postgresql数据库。 MySql在这里是一个非常糟糕的选择。 – RickyA

+0

是的,我宁愿使用RDS来轻松扩展。它看起来像唯一的其他RDS选项是oracle或microsoft SQL server。 – bcoop713

+0

由于您拥有纬度和经度,此方法是否适合您:http://gis.stackexchange.com/questions/593/how-to-calculate-distance-between-two-locations-using-stored-procedure-in -mysql –

回答

0

有趣的想一想,但当你问这个问题时,MySQL版本5.6不可用,因此不支持距离查询。这个版本在您的问题according to Wikipedia后几天就可以使用。

从那时起一些事情发生了变化:

  1. MySQL有和支持空间数据类型和查询。但它仍然不符合OGC标准。亚马逊RDS supports PostgreSQL

我个人对空间数据库的偏好是使用PostGIS的PostgreSQL,我会推荐使用它。

最后,假设你的CampSite模型有一个名为“PNT” Point类型的字段,你想查询返回从基准点(命名为:ref_pnt)按距离排序的营地,你可以FO它与以下查询:

CampSites.objects.annotate(dist=Distance('pnt', ref_pnt)).orderby('dist') 
相关问题