2009-12-21 181 views
3

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

使用地理坐标系可能会在稍后给开发者带来麻烦。例如,PostGIS无法使用地理坐标系统执行非点几何之间的距离计算,例如,构建查询以查找存储为WGS84的县边界5英里内的所有点。 [6]

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

基本上,我希望能够找到相邻的邮政编码/城市/县给出的起始位置和距离。我并不在乎这是如何在技术层面上完成的。

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

UPDATE

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

好:数据文件是免费

坏:这个数据是从2000年人口普查所以它是非常陈旧

的有些乐观:美国人口普查局进行一次每10年人口普查而这几乎是2010

的结论是:这是很好的足以让我

+0

如果您发现过这个问题,那么查看代码的简短代码会非常有帮助。无论哪种方式,谢谢你的帖子 – 2012-09-18 22:00:18

+0

@NickB看到我的答案。 – hekevintran 2012-09-22 04:04:21

回答

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