我想使用GeoDjango进行基本的位置搜索。具体来说,我想给搜索功能一个邮政编码/城市/县,并找到5mi,10mi,20mi等内的所有邮政编码/城市/县。我在文档中找到了以下段落:
使用地理坐标系可能会在以后为开发人员带来复杂情况。例如,PostGIS不具有使用地理坐标系在非点几何之间执行距离计算的能力,例如,构建查询以查找存储为WGS84的县边界5英里内的所有点。 [6]
如果我想使用PostGIS并能够在美国进行上述搜索,这究竟意味着什么?文档建议使用投影坐标系仅覆盖特定区域。我需要覆盖整个国家,所以我认为这不是一个选择。
基本上我最终希望能够根据起始位置和距离找到相邻的邮政编码/城市/县。我真的不在乎如何在技术层面上做到这一点。
另外,我在哪里可以找到包含美国邮政编码/城市/县的地理边界的数据库,我可以将其导入到GeoDjango模型中?
更新
我找到了一个数据库,其中包含美国here所有邮政编码的纬度和经度坐标。我的计划是将这些点导入GeoDjango模型并使用PostGis构建查询,这些查询可以从给定点找到x英里内的其他点。这解决了文档中引发的问题,因为所有邮政编码都被视为点而不是多边形。这对我的用例来说很好,因为完全准确性不是我关心的。
好处:数据文件是免费的
坏消息:这些数据来自2000年人口普查,所以它已经过时了
有点希望:美国人口普查局每10年进行一次人口普查,差不多是2010年
结论:这对我来说已经足够了
答案 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