1

快速背景,我正在尝试创建一个 django 应用程序,该应用程序按与一个点的距离对一堆位置进行排序。该应用程序将在 EC2 服务器上运行,我想将 RDS 用于数据库。因为 PostgreSQL 在 RDS 上不可用,所以我选择使用 MySQL。

问题:

当我尝试运行视图时,出现错误:

NotImplementedError:距离存储过程在 mysql 后端不可用。

这是视图:

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 获取信息可以工作,但我不知道如何实现它。

有谁知道我如何让应用程序使用 RDSpreferably 和 MySQL 工作?(我想避免 Heroku)

ps 我正在使用 geopy 向 Google 发出请求。

4

1 回答 1

0

想起来很有趣,但在你问这个问题的时候,MySQL 5.6 版不可用,因此不支持距离查询。根据维基百科,这个版本在您提出问题后的几天内可用。

从那以后,一些事情发生了变化:

  1. MySQL 拥有并支持空间数据类型和查询。但它仍然不符合 OGC 标准。
  2. Amazon RDS 现在支持 PostgreSQL

我个人对空间数据库的偏好是带有 PostGIS 的 PostgreSQL,我建议使用它。

最后,假设您的CampSite模型有一个Point名为“pnt”的字段,并且您想要进行查询以返回按与参考点(命名为:)的距离排序的 Camp Sites ref_pnt,您可以使用以下查询:

CampSites.objects.annotate(dist=Distance('pnt', ref_pnt)).orderby('dist')
于 2017-11-10T16:47:41.677 回答