GeoDjango距离搜索

时间:2009-12-21 03:06:39

标签: python django geodjango

我想使用GeoDjango进行基本的位置搜索。具体来说,我想给搜索功能一个邮政编码/城市/县,并找到5mi,10mi,20mi等内的所有邮政编码/城市/县。我在文档中找到了以下段落:

  

使用地理坐标系可能会在以后为开发人员带来复杂情况。例如,PostGIS不具有使用地理坐标系在非点几何之间执行距离计算的能力,例如,构建查询以查找存储为WGS84的县边界5英里内的所有点。 [6]

如果我想使用PostGIS并能够在美国进行上述搜索,这究竟意味着什么?文档建议使用投影坐标系仅覆盖特定区域。我需要覆盖整个国家,所以我认为这不是一个选择。

基本上我最终希望能够根据起始位置和距离找到相邻的邮政编码/城市/县。我真的不在乎如何在技术层面上做到这一点。

另外,我在哪里可以找到包含美国邮政编码/城市/县的地理边界的数据库,我可以将其导入到GeoDjango模型中?

更新

我找到了一个数据库,其中包含美国here所有邮政编码的纬度和经度坐标。我的计划是将这些点导入GeoDjango模型并使用PostGis构建查询,这些查询可以从给定点找到x英里内的其他点。这解决了文档中引发的问题,因为所有邮政编码都被视为点而不是多边形。这对我的用例来说很好,因为完全准确性不是我关心的。

好处:数据文件是免费的

坏消息:这些数据来自2000年人口普查,所以它已经过时了

有点希望:美国人口普查局每10年进行一次人口普查,差不多是2010年

结论:这对我来说已经足够了

2 个答案:

答案 0 :(得分:3)

为了解决引用中的限制,您可以只取用户提供的zipcode区域的质心,然后从该点找到所有与此点发出的5,10或任何英里圆圈相交的邮政编码区域。我不确定如何在geodjango中实现,但是使用postgis肯定是可能的。

你引用的限制基本上说你不能写一个查询说“给我在俄亥俄州边境内5英里范围内的所有点。”

答案 1 :(得分:0)

In [1]: o = Place.objects.get(pk=2463583)  # Oakland, CA

In [2]: sf = Place.objects.get(pk=2487956)  # San Francisco, CA

In [3]: o.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [4]: sf.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [5]: o.coords.distance(sf.coords)  # find the distance between Oakland and San Francisco (in meters)
Out[5]: 14401.942808571299