GeoDjango距离搜索

3
我想使用GeoDjango进行基本的位置搜索。具体来说,我想输入一个邮编/城市/县作为搜索功能的参数,并找到所有在5mi、10mi、20mi等范围内的邮编/城市/县。我在文档中发现了以下段落:
“使用地理坐标系可能会给开发人员带来一些麻烦。例如,PostGIS没有使用地理坐标系对非点几何体进行距离计算的能力,例如构建查询以找到存储为WGS84格式的县边界内5英里之内的所有点。[6]”
如果我想使用PostGIS并能够在整个美国范围内执行上述搜索,这到底意味着什么?文档建议使用投影坐标系仅覆盖特定区域。我需要覆盖整个国家,所以我想这不是一个选项。
基本上,最终我想能够找到一个起始位置和距离,并给出相邻的邮编/城市/县。我不真正关心这在技术层面上如何实现。
此外,我在哪里可以找到包含美国各州的邮政编码/城市/县地理边界的数据库,以便将其导入GeoDjango模型?
更新
我发现了一个数据库,其中包含了美国所有邮政编码的纬度和经度坐标在这里。我的计划是将这些点导入到GeoDjango模型中,并使用PostGis构建查询,以便可以找到距离给定点x英里内的其他点。这避免了文档中提出的问题,因为所有邮政编码都被视为点而不是多边形。对于我的用例来说,这很好,因为完美的准确性并不是我关心的事情。
优点:数据文件是免费的。
缺点:这些数据来自2000年的人口普查,所以相当过时。
有一定希望的是:美国人口普查局每10年进行一次人口普查,现在已经接近2010年。
结论:对我来说足够好了。

如果您解决了这个问题,能否提供一小段代码作为参考将会非常有帮助。无论如何,感谢您的帖子。 - Nick B
2个回答

3
为了克服报价中的限制,您可以只需获取用户提供的邮政编码区域的质心,然后从该点找到所有与该点发出的5英里、10英里或其他英里数的圆相交的邮政编码区域。我不确定在geodjango中如何实现,但是使用postgis肯定是可能的。
引用的限制基本上表示您不能编写查询,以便“给我所有在俄亥俄州边界内部5英里范围内的点”。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接